我正在开发一个选项卡式应用程序,其中片段之一 CollectionsFragment 包含一个 GridView,每个插槽中都有一个 ImageView。我希望使用选择器在用户单击其中一张图像时向用户提供反馈。
我已经成功实现了选择器,但是,我的问题是选择器仅在图像的背景中绘制,但我希望选择器在整个图像上绘制。我在其他地方看到过这个问题,但是,许多人选择的解决方案(设置 GridView 的 drawSelectorOnTop 属性)对我来说不起作用。
具有相关适配器代码的相关片段:
public class CollectionsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_collections, container, false);
// Grid view is inside the xml view inflated above
GridView gridView = (GridView)view.findViewById(R.id.gridview);
gridView.setDrawSelectorOnTop(true);
((GridView) gridView).setAdapter(new CustomGridViewAdapter(getActivity()));
return view;
}
private class CustomGridViewAdapter extends BaseAdapter {
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View v = view;
ImageView picture;
TextView name;
if(v == null) {
v = inflater.inflate(R.layout.collections_item, viewGroup, false);
v.setTag(R.id.picture, v.findViewById(R.id.picture));
v.setTag(R.id.text, v.findViewById(R.id.text));
}
picture = (ImageView)v.getTag(R.id.picture);
name = (TextView)v.getTag(R.id.text);
Item item = (Item)getItem(i);
name.setText(item.name);
picture.setImageResource(item.drawableId);
picture.setBackgroundResource(R.drawable.selector);
return v;
}
}
}
为了完整起见,我的选择器:
<?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/buttonhighlight"/> <!-- pressed state -->
<item android:state_focused="true"
android:drawable="@color/buttonhighlight"/> <!-- focused state -->
<item android:drawable="@android:color/transparent"/> <!-- default state -->
</selector>
谢谢你的帮助,
我认为你错了setDrawSelectorOnTop(boolean)
. The selector
这里引用的drawable是GridView的内部selector
可绘制的。
即使在最简单的实现中GridView
,当单击网格项时,会在其周围绘制蓝色边框。这是因为,默认情况下,绘制的是gridview自己的选择器behind
该项目。如果你打电话setDrawSelectorOnTop(true)
,选择器(蓝色)将绘制在该项目上。
But setDrawSelectorOnTop(boolean)
与您在适配器中设置的选择器无关。无论你通过true
, or false
,ImageView 的选择器的行为不会改变。
解决方案:
不要在适配器内的每个 ImageView 上设置选择器,而是让 GridView 使用您的选择器可绘制:
GridView gridView = (GridView)view.findViewById(R.id.gridview);
gridView.setDrawSelectorOnTop(true);
// Make GridView use your custom selector drawable
gridView.setSelector(getResources().getDrawable(R.drawable.selector));
现在,不需要:
picture.setBackgroundResource(R.drawable.selector);
Edit:
虽然我不推荐这样做(明显的开销),但它应该有效:
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View v = view;
ImageView picture;
....
....
LayerDrawable ld = new LayerDrawable(new Drawable[]
// Drawable from item
{ getResources().getDrawable(item.drawableId),
// Selector
getResources().getDrawable(R.drawable.selector)});
// Set the LayerDrawable
picture.setImageDrawable(ld);
// Don't need this
// picture.setBackgroundResource(R.drawable.selector);
return v;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)