Android 无法将自定义listSelector应用于ListView
我现在已经复习了几个SO答案Android 无法将自定义listSelector应用于ListView,android,android-listview,Android,Android Listview,我现在已经复习了几个SO答案 甚至遵循这一点(目前正在使用这种方法) 我甚至将drawSelectorOnTop设置为true 但是,我无法使列表选择器工作。基本上,我已经束手无策了。我想这与我的列表项目的制作方式有关吧?以下是XML: list_entry.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res
甚至遵循这一点(目前正在使用这种方法)
我甚至将
drawSelectorOnTop
设置为true
但是,我无法使列表选择器
工作。基本上,我已经束手无策了。我想这与我的列表项目的制作方式有关吧?以下是XML:
list_entry.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<ImageButton android:id="@+id/contextMenuIcon"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_action_overflow"
android:background="@null"/>
<TextView android:id="@+id/noteTitle"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/contextMenuIcon"
android:layout_alignBottom="@id/contextMenuIcon"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_alignParentTop="true"
android:textIsSelectable="false"
android:ellipsize="end"
android:singleLine="true"
android:textSize="20sp"
android:textColor="@android:color/black"/>
<TextView android:id="@+id/noteCreationDate"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_below="@id/noteTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#808080"/>
<TextView android:id="@+id/notePrivacy"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_below="@id/contextMenuIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#808080" />
</RelativeLayout>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:endColor="#ffc579" android:startColor="#fb9d23" android:angle="90"></gradient>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:endColor="#f7ddb8" android:startColor="#f5c98c" android:angle="90"></gradient>
</shape>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/list_selector_pressed" />
<item android:state_focused="true" android:drawable="@drawable/list_selector_focused" />
<item android:drawable="@android:color/transparent" />
</selector>
list\u selector\u pressed.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<ImageButton android:id="@+id/contextMenuIcon"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_action_overflow"
android:background="@null"/>
<TextView android:id="@+id/noteTitle"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/contextMenuIcon"
android:layout_alignBottom="@id/contextMenuIcon"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_alignParentTop="true"
android:textIsSelectable="false"
android:ellipsize="end"
android:singleLine="true"
android:textSize="20sp"
android:textColor="@android:color/black"/>
<TextView android:id="@+id/noteCreationDate"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_below="@id/noteTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#808080"/>
<TextView android:id="@+id/notePrivacy"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_below="@id/contextMenuIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#808080" />
</RelativeLayout>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:endColor="#ffc579" android:startColor="#fb9d23" android:angle="90"></gradient>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:endColor="#f7ddb8" android:startColor="#f5c98c" android:angle="90"></gradient>
</shape>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/list_selector_pressed" />
<item android:state_focused="true" android:drawable="@drawable/list_selector_focused" />
<item android:drawable="@android:color/transparent" />
</selector>
列表选择器聚焦.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<ImageButton android:id="@+id/contextMenuIcon"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_action_overflow"
android:background="@null"/>
<TextView android:id="@+id/noteTitle"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/contextMenuIcon"
android:layout_alignBottom="@id/contextMenuIcon"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_alignParentTop="true"
android:textIsSelectable="false"
android:ellipsize="end"
android:singleLine="true"
android:textSize="20sp"
android:textColor="@android:color/black"/>
<TextView android:id="@+id/noteCreationDate"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_below="@id/noteTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#808080"/>
<TextView android:id="@+id/notePrivacy"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_below="@id/contextMenuIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#808080" />
</RelativeLayout>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:endColor="#ffc579" android:startColor="#fb9d23" android:angle="90"></gradient>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:endColor="#f7ddb8" android:startColor="#f5c98c" android:angle="90"></gradient>
</shape>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/list_selector_pressed" />
<item android:state_focused="true" android:drawable="@drawable/list_selector_focused" />
<item android:drawable="@android:color/transparent" />
</selector>
列表选择器.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp">
<ImageButton android:id="@+id/contextMenuIcon"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_action_overflow"
android:background="@null"/>
<TextView android:id="@+id/noteTitle"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/contextMenuIcon"
android:layout_alignBottom="@id/contextMenuIcon"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_alignParentTop="true"
android:textIsSelectable="false"
android:ellipsize="end"
android:singleLine="true"
android:textSize="20sp"
android:textColor="@android:color/black"/>
<TextView android:id="@+id/noteCreationDate"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_below="@id/noteTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#808080"/>
<TextView android:id="@+id/notePrivacy"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_below="@id/contextMenuIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#808080" />
</RelativeLayout>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:endColor="#ffc579" android:startColor="#fb9d23" android:angle="90"></gradient>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:endColor="#f7ddb8" android:startColor="#f5c98c" android:angle="90"></gradient>
</shape>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/list_selector_pressed" />
<item android:state_focused="true" android:drawable="@drawable/list_selector_focused" />
<item android:drawable="@android:color/transparent" />
</selector>
请告诉我如何使列表选择器工作根据我的经验,要使列表选择器工作,必须使用CheckedTextView作为列表项的根元素
<?xml version="1.0" encoding="utf-8"?>
<!-- Added this view purposefully -->
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="@dimen/_48dp"
android:layout_centerVertical="true"
android:background="@drawable/selector_liquidation"
android:gravity="center_vertical|left"
android:paddingBottom="@dimen/_15dp"
android:paddingLeft="@dimen/_40dp"
android:paddingRight="@dimen/_10dp"
android:paddingTop="@dimen/_15dp"
android:singleLine="true"
android:textColor="@color/gray_999999"
android:textSize="@dimen/font_18sp" />
mSelectedIndex是跟踪所选位置的整数。它将始终具有选定的索引。您正在列表项中使用ImageButton。因此,当您单击该项目时,ImageButton将获得焦点 但在你们的情况下,你们把ImageButton放回原处
android:background="@null"
它让你看不到焦点。如果删除此行,则可以看到问题
要从列表项获取焦点,可以在xml的根视图中使用此代码
android:descendantFocusability="blocksDescendants"
我用xml创建了一个快速测试,它正常工作
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
ListView list = (ListView)rootView.findViewById(R.id.list);
ArrayList<MyItem> listItem = genListItem(20);
MyAdapter adapter = new MyAdapter(MainActivity.this, android.R.layout.simple_list_item_1, listItem);
list.setAdapter(adapter);
return rootView;
}
private ArrayList<MyItem> genListItem(int size) {
ArrayList<MyItem> listItem = new ArrayList<MainActivity.MyItem>();
for (int i = 0; i < size; i++) {
MyItem item = new MyItem();
item.setName("item " + i);
listItem.add(item);
}
return listItem;
}
}
public static class MyItem{
String Name;
/**
* @return the name
*/
public String getName() {
return Name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
Name = name;
}
}
public class MyAdapter extends ArrayAdapter<MyItem>{
private LayoutInflater inflator;
private Context mContext;
public MyAdapter(Context context, int resource, List<MyItem> objects) {
super(context, resource, objects);
mContext = context;
inflator = ((Activity) context).getLayoutInflater();
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = inflator.inflate(R.layout.list_entry, null);
holder = new ViewHolder();
holder.Name = (TextView) convertView.findViewById(R.id.noteTitle);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
MyItem item = getItem(position);
holder.Name.setText(item.getName());
return convertView;
}
class ViewHolder {
public TextView Name;
}
}
}
公共类MainActivity扩展了ActionBarActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
如果(savedInstanceState==null){
getSupportFragmentManager().beginTransaction().add(R.id.container,新占位符片段()).commit();
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
/**
*包含简单视图的占位符片段。
*/
公共类占位符片段扩展了片段{
公共占位符片段(){
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图根视图=充气机。充气(R.layout.fragment_main,容器,错误);
ListView list=(ListView)rootView.findViewById(R.id.list);
ArrayList listItem=genListItem(20);
MyAdapter=新的MyAdapter(MainActivity.this,android.R.layout.simple\u list\u item\u 1,listItem);
list.setAdapter(适配器);
返回rootView;
}
私有ArrayList genListItem(整数大小){
ArrayList listItem=新的ArrayList();
对于(int i=0;i
我不知道为什么,但随机试验和错误导致了我这样做:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/translucent_50_grey" />
<item android:state_pressed="false" android:drawable="@android:color/transparent" />
<item android:state_focused="true" android:drawable="@android:color/transparent" />
<item android:state_focused="false" android:drawable="@android:color/transparent" />
<item android:drawable="@android:color/transparent" />
</selector>
瞧!它正在工作。全屏和标题栏主题。也发布选择器xml代码。定位如何?
CheckedTextView
将包含RelativeLayout
?很抱歉,我无法理解你在说什么。因此,如果我删除@null
背景并添加子代焦点可用性
行,它会工作吗?>如果你不想在图像按钮中看到焦点,则无需删除@null背景。你能让它工作并发布截图吗?:)这件事我已经花了8个小时:)我明白了。关键是选择器没有出现:)在您使用“”的listitem_selector.xml中,但名称必须是“list_selector_Focused.xml”(带2个“s”)。你能检查一下这是否是个问题吗