Android: сохранить синий фон после выбора ListView

У меня есть ListView, и он отлично работает на телефоне. Теперь я создаю пользовательский интерфейс планшета, а ListView слева и детали справа.

Когда я касаюсь элемента, он мигает синим до тех пор, пока он нажимается. Я хочу сохранить этот синий цвет до тех пор, пока не будет выбран другой элемент, как приложение Gmail на Nexus 7.

Каков самый чистый способ достичь этого? Я предпочел бы избегать установки фона вручную, я предполагаю, что есть способ отметить элемент как «активный» и соответствующий ему.

Каков самый чистый способ достичь этого?

То, что вы ищете, называется «активированным» состоянием. Чтобы сделать эту работу:

Шаг # 1: В res/values-v11/ , есть ресурс стиля, который реализует activated . Например, для нового проекта, в AppTheme определено объявление AppTheme , перейдите к чему-то вроде:

 <resources> <style name="AppTheme" parent="android:Theme.Holo.Light"></style> <style name="activated" parent="AppTheme"> <item name="android:background">?android:attr/activatedBackgroundIndicator</item> </style> </resources> 

Шаг №2: Определите тот же стиль в res/values/ для любых более старых устройств, так же как ресурс стиля заглушки, поэтому ссылки на него продолжают работать:

 <resources> <style name="AppTheme" parent="android:Theme.Light"/> <style name="activated" parent="AppTheme"/> </resources> 

Шаг №3: В вашем XML-ресурсе компоновки для строки в ListView добавьте style="@style/activated" в список атрибутов корневого элемента

Шаг 4: установите ListView как список с одним выбором, например следующую строку в ListFragment :

 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Вы можете увидеть это в действии в этом примерном проекте , этом примерном проекте и этом примере проекта . Дополнительную информацию об этих первых двух образцах см. В этом вопросе SO: Полный рабочий пример сценария анимации с тремя фрагментами Gmail?

С помощью

android.R.layout.simple_list_item_activated_1

вместо

R.layout.simple_list_item_checkable_1 .

Просто для кого-то, кто когда-нибудь проверит.

После нескольких дней поиска и потянув за волосы, я только что узнал, что activatedBackgroundIndicator компонент BackgroundIndicator также доступен в системе стилей ActionBarSherlock. Большинство разработчиков, которые разрабатывают обратные совместимые приложения, используют ActionBarSherlock, поэтому использование ActionBarSherlock является хорошим вариантом для большинства случаев. Поэтому вместо использования android:background="?android:attr/activatedBackgroundIndicator" который даст ошибки в версиях android до 11, просто используйте: android:background="?activatedBackgroundIndicator"

Вот пример XML-кода строки строки:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" //note the activatedBackgroundIndicator android:background="?activatedBackgroundIndicator" android:minHeight="?android:attr/listPreferredItemHeight" android:paddingBottom="2dip" android:paddingTop="2dip" > <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:minHeight="?android:attr/listPreferredItemHeight" android:paddingLeft="6dip" android:paddingRight="6dip" android:textSize="15sp" /> <TextView android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:minHeight="?android:attr/listPreferredItemHeight" android:paddingRight="5dip" android:textSize="20dip" /> </LinearLayout>