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);

попробуй такое

rootLayout.setBackgroundResource(R.drawable.image);

это плохая идея делать это так, как вам говорит принятый ответ. Проблема в том, что вам также нужно вызвать список 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);