2013-06-12 3 views
0

Я использую следующий селектор, чтобы изменить внешний вид текста в элементе ListView:setItemChecked не работает на Gingerbread

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checked="true" 
      android:color="#FFFFFFFF" /> <!-- checked --> 
    <item android:state_activated="true" 
      android:color="#FFFFFFFF" /> <!-- activated --> 
    <item android:state_pressed="true" 
      android:color="#FFFFFFFF" /> <!-- pressed --> 
    <item android:state_focused="true" 
      android:color="#FFFFFFFF" /> <!-- focused --> 
    <item android:color="#FF000000" /> <!-- default --> 
</selector> 

Весь селектор отлично работает на более поздних версиях Android (ICS, JB), а на Пряник, в то время как элемент нажата_стат применяется правильно, когда я вызываю setItemChecked в listView, элемент state_checked не применяется.

код я использую, чтобы установить элемент выглядит следующим образом:

@Override 
protected void onResume() 
{ 
    super.onResume(); 

    getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
    for (int index = 0; index < measureList.size(); index++) 
    { 
     if (measureList.get(index).getId() == appContext.getMeasureId()) 
     { 
      getListView().setItemChecked(index, true); 
     } 
    } 
} 

и XML используется для установки переключателя заключается в следующем:

<TextView 
     android:id="@+id/item_text" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:layout_marginTop="8dp" 
     android:layout_marginLeft="8dp" 
     android:paddingRight="10dp" 
     android:ellipsize="end" 
     android:layout_toRightOf="@id/item_thumb" 
     android:maxLines="1" 
     android:scrollHorizontally="true" 
     android:textStyle="bold" 
     android:textSize="16sp" 
     android:textColor="@color/selected_text_selector" 
     /> 

Кто-нибудь знает, почему это происходит? Я еще не тестировал его на версиях Android между GB и ICS, но отредактировал этот пост, как только я это сделаю.

+0

Отметьте этот вопрос: http://stackoverflow.com/questions/3742979/how-to-get-a-android-listview-item-selector-to-use-state-checked – Voicu

+0

Спасибо за отзыв, но что, похоже, не работает ... – sleeke

+0

Извините за то, что вы так быстро стреляли в идею Voicu - получается, что это позволило мне решить (см. ниже) – sleeke

ответ

7

После небольшого поиска, мне кажется, причина, что state_checked не экспрессируется предварительно Honeycomb является тот факт, что setActive метод на View не доступен до уровня API 11. Это означает, что проверяется состояние не является распространяется на дочерние представления моего макета.

КЛЮЧ:

  1. переставляет TextView для CheckedTextView
  2. Размножается проверенное состоянием от родительского вида для детей

1) Был простой переключатель в XML , а для 2) я модифицировал код в ответе, связанном с Voicu, чтобы дать следующее:

public class CheckableRelativeLayout extends RelativeLayout implements Checkable 
{ 
    private boolean checked = false; 

    public CheckableRelativeLayout(Context context) { 
     super(context, null); 
    } 

    public CheckableRelativeLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    private static final int[] CheckedStateSet = { 
      R.attr.state_checked 
    }; 

    @Override 
    protected void dispatchSetPressed(boolean pressed) 
    { 
     super.dispatchSetPressed(pressed); 
     setChecked(pressed); 
    } 

    @Override 
    public void setChecked(boolean checked) { 
     this.checked = checked; 
     for (int index = 0; index < getChildCount(); index++) 
     { 
      View view = getChildAt(index); 
      if (view.getClass().toString().equals(CheckedTextView.class.toString())) 
      { 
       CheckedTextView checkable = (CheckedTextView)view; 
       checkable.setChecked(checked); 
       checkable.refreshDrawableState(); 
      } 
     } 
     refreshDrawableState(); 
    } 

    public boolean isChecked() { 
     return checked; 
    } 

    public void toggle() { 
     checked = !checked; 
     refreshDrawableState(); 
    } 

    @Override 
    protected int[] onCreateDrawableState(int extraSpace) { 
     final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 
     if (isChecked()) { 
      mergeDrawableStates(drawableState, CheckedStateSet); 
     } 
     return drawableState; 
    } 

    @Override 
    public boolean performClick() { 
     return super.performClick(); 
    } 
} 
+1

Где определено R.attr.state_checked? Должно ли это быть в моем собственном пакете или это действительно атрибут android.R.attr.state_checked? Было бы полезно увидеть ваш импорт или, возможно, ваш связанный файл attr.xml, если он должен быть в моем собственном пакете. – Baron

+1

@Baron: Я боюсь, что, поскольку это было давно, когда я спрашивал об этом, я больше не могу вспомнить, где был использован этот код, и не может найти импорт или XML-файлы для вас, но я почти уверен, m, ссылаясь на android.R.attr.state_checked, как вы думали. Хорошая точка импорта. Я обязательно включу их в будущие вопросы! – sleeke

+0

@sleeke для будущих вопросов: да, используется атрибут «android.R.attr state_checked.». Протестировано и отлично работает. Спасибо! –