平日里工作碰到的问题,现在写下来给自己做一下笔记,有这个问题的朋友也可以看一下。
首先,写一个selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true"><shape>
<solid android:color="#ffb400" />
</shape></item>
<item android:state_selected="true"><shape>
<solid android:color="#33999999" />
</shape></item>
<item android:drawable="@android:color/transparent"/>
</selector>
接着在看看item.xml的定义:
把定义好的selector.xml给布局做背景。<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="330px" android:layout_height="90px" android:background="@drawable/selector.xml" android:focusable="true" > <TextView android:id="@+id/channel_type_name" android:layout_width="wrap_content" android:layout_height="90px" android:layout_alignParentRight="true" android:layout_marginRight="100px"
android:gravity="center_vertical"android:duplicateParentState="true"
android:singleLine="true"
android:textColor="@drawable/back_sl_tab_text"
android:textSize="36px" /></RelativeLayout>
可以看到item只有一个TextView,这里我为了要焦点落在item上的时候改变TextView的字体颜色,所以加android:textColor="@drawable/back_sl_tab_text"这个。(这里我们就不关心关于TextView的selector.xml)了
并且加了这句android:duplicateParentState="true",表示当前的view状态会跟随着父布局,比如当前父布局是选中状态,那么这个TextView也是选中状态
下面关于ListView的xml定义,这个就不发出来了。
ListView在代码里加了一句setItemsCanFocus(true),表示item可以获取焦点,因为我们是要整个item布局发生状态变化,所以要设置为true(若是item里面又checkbox或者其他的需要监听事件,那么这里就必须设置为false,不然点击会没有反应)
接下来运行后发现ListView有焦点的颜色和默认的颜色,但是没有选中效果。
最终发现,选中状态需要自己手动设置某个item为选中,
所以我在设配器里面加了这个监听:
convertView.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
if (arg2.getAction() == KeyEvent.ACTION_DOWN) {
if (arg1 == KeyEvent.KEYCODE_DPAD_RIGHT) {
mViewPager2.getChildAt(0).requestFocus();//默认第一个获取焦点
channelTypeView.getChildAt(position).setSelected(true);
return true;
}
}
return false;
}
});
代码中可以看到,当按键按下时,并且是按下右键,会让viewpager的第一个item获取焦点,然后我们再自己手动设置listView在position这个位置的view为选中状态。
这样子就可以了。