Android устанавливает программный фон LinearLayout

У меня есть ситуация, когда мне нужно программно установить фон для LinearLayout.

В моем макете я устанавливаю фон с помощью `android: background ="? Андроид: атр / activatedBackgroundIndicator», но я хочу установить это программно: я '


мы пробовали использовать:

Drawable d = getActivity().getResources().getDrawable(android.R.attr.activatedBackgroundIndicator);
rootLayout.setBackgroundDrawable(d);

Но это вылетает. Есть идеи?

Изменить: я также пытался использовать:

rootLayout.setBackgroundResource(android.R.attr.activatedBackgroundIndicator);

10-08 15:23:19.018: E/AndroidRuntime(11133): android.content.res.Resources$NotFoundException: Resource ID #0x10102fd
 Buffalo08 окт. 2012 г., 14:26
Усина: это был именно мой вопрос.
 Sherif elKhatib08 окт. 2012 г., 14:53
Вы работаете на кастомном роме?
 Buffalo18 апр. 2014 г., 11:48
Нет, на складе был запущен LG Optimus один ROM.
 MGDroid08 окт. 2012 г., 14:24
какой уровень API вы используете?
 Houcine08 окт. 2012 г., 14:24
это означает, что ресурс, который вы пытаетесь найти, не найден, если вы хотите получить dRawable, вы должны получить его от R.drawable (или android.R.drawable), а не от android.R.attr
 Buffalo08 окт. 2012 г., 14:25
Я знаю, что activBackgroundIndicator нене существует до 11, у меня есть проверка для этого, что 'не проблема.
 Braj08 окт. 2012 г., 14:13
регистрация logcat очень помогает найти решение для аварии
 Sherif elKhatib08 окт. 2012 г., 14:15
В следующий раз добавьте logcat. Я думаю, что ваш minSdk не 11, и вы запускаете это на устройстве с API <11, что приведет к сбою, потому что activBackgroundIndicator доступен начиная с API 11. Если это не так, отправьте logcat за помощью

Ответы на вопрос(6)

Пожалуйста, попробуйте следующий код.

LinearLayout layout=(LinearLayout) findViewById(R.id.layoutImage);
layout.setBackgroundResource(R.drawable.bg);

Это'Плохая идея делать так, как вам говорит принятый ответ. Проблема в том, что вам также нужно вызвать списокonItemCheckedStateChanged обновить чтоs необходимо (например, заголовок панели действий).

В этом случае все, что вам нужно сделать, это просто позвонить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);

Решение Вопроса

У меня была такая же проблема, и я исправил ее с помощью этого кода.

Android.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 и работал нормально.

 Mikalai Daronin15 мар. 2013 г., 21:40
Спасибо за решение! Но нужно использоватьsetBackgroundDrawable на предварительно JellyBean.
 user152153620 мар. 2013 г., 12:16
Есть более простой методВот, а такжебез ... жестко прописывать

попробуй это

rootLayout.setBackgroundResource(R.drawable.image);

попробуй эту строчку

rootLayout.setBackgroundResource(d);

вместо

rootLayout.setBackgroundDrawable(d);

Ваш ответ на вопрос