Android установка LinearLayout фон программно
у меня есть ситуация, когда мне нужно установить фон на LinearLayout программно.
в моем макете я устанавливаю свой фон с помощью " android: background="?android: attr / activatedBackgroundIndicator", но я хочу установить это программно:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayoutId"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="left|center"
android:paddingBottom="5dip"
android:paddingLeft="5dip"
android:background="?android:attr/activatedBackgroundIndicator"
android:paddingTop="5dip" >
Я пробовал использовать:
Drawable d = getActivity().getResources().getDrawable(android.R.attr.activatedBackgroundIndicator);
rootLayout.setBackgroundDrawable(d);
но она падает. Есть идеи?
Edit: я также пытался использовать:
rootLayout.setBackgroundResource(android.R.attr.activatedBackgroundIndicator);
10-08 15:23:19.018: E/AndroidRuntime(11133): android.content.res.Resources$NotFoundException: Resource ID #0x10102fd
6 ответов
У меня была такая же проблема и я исправил ее, используя этот кусок кода.
андроид.R. attr.* являются указателями на тему, а не на фактический ресурс, определенный для рисования. Вы должны использовать TypedArray для доступа к идентификатору.
theView = this.inflater.inflate(R.layout.list_row_job_favorited, null);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
TypedArray a = mContext.obtainStyledAttributes(new int[] { android.R.attr.activatedBackgroundIndicator });
int resource = a.getResourceId(0, 0);
//first 0 is the index in the array, second is the default value
a.recycle();
theView.setBackground(mContext.getResources().getDrawable(resource));
}
я использовал это в своем адаптере пользовательского списка, когда обнаруживает SDK upper и работал нормально.
попробуйте эту строку
rootLayout.setBackgroundResource(d);
вместо
rootLayout.setBackgroundDrawable(d);
это плохая идея делать это так, как вам говорит принятый ответ. Проблема в том, что вам также нужно вызвать список onItemCheckedStateChanged
чтобы обновить то, что необходимо (например, заголовок панели действий).
В этом случае все, что вам нужно сделать, это просто позвонить getListView().setItemChecked(position, true);
когда элемент отмечен и getListView().setItemChecked(position, false);
когда он не проверен.
вы можете использовать что-то вроде этого
TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.selectableItemBackgroun d, outValue, true);
view.setBackgroundResource(outValue.resourceId);
пожалуйста, попробуйте следующий код.
LinearLayout layout=(LinearLayout) findViewById(R.id.layoutImage);
layout.setBackgroundResource(R.drawable.bg);