Android的drawSelectorOnTop与GridView控件 [英] Android drawSelectorOnTop with GridView
问题描述
我开发一个标签式应用程序中的片段之一,CollectionsFragment,包含与每个插槽的ImageView的一个GridView。我想用一个选择器提供反馈给用户,当用户点击图像中的一个。
I am developing a tabbed application in which one of the fragments, CollectionsFragment, contains a GridView with an ImageView in each slot. I would like the to use a selector to give feedback to users when the user clicks on one of the images.
我已经成功实施选择,但是,我的问题是,选择仅在图像的背景画,但我想选择器上进行绘制整个图像。我已经看到这个问题在其他地方引用,但是,选择了许多解决方案,设置在GridView的drawSelectorOnTop财产,是不是为我工作。
I have successfully implemented the selector, however, my problem is that the selector is only drawing in the background of the image, but I would like to the selector to draw over the entire image. I have seen this problem referenced elsewhere, however, the solution selected by many, setting the drawSelectorOnTop property of the GridView, is not working for me.
有关片段相关的适配器code:
The relevant fragment with the relevant adapter code:
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;
}
}
}
和我的选择出于全面考虑:
And my selector for completeness sake:
<?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>
感谢您的帮助,
Thanks for any help,
推荐答案
我想你是误会了 setDrawSelectorOnTop(布尔)
。该选择
绘制了正在这里引用的是GridView的内部选择
绘制。
I think you are mistaken about setDrawSelectorOnTop(boolean)
. The selector
drawable that is being referenced here is GridView's internal selector
drawable.
即使在最简单的实现的GridView
,网格项目被点击时,蓝色边框周围绘制它。这是因为,在默认情况下,GridView的自己选择绘制背后
的项目。如果你调用 setDrawSelectorOnTop(真)
,选择(蓝)将被绘制在项目上。
Even in the simplest implementation of GridView
, when a grid item is clicked, the blue border is drawn around it. This is because, by default, gridview's own selector is drawn behind
the item. If you call setDrawSelectorOnTop(true)
, the selector (blue) will be drawn over the item.
但 setDrawSelectorOnTop(布尔)
无关与适配器要设置的选择。无论你通过真
或假
,ImageView的的选择的行为将不会改变。
But setDrawSelectorOnTop(boolean)
has nothing to do with the selector you are setting in the adapter. Whether you pass true
, or false
, the ImageView's selector's behavior won't change.
解决方法:
而不是设置选择每个ImageView的适配器内,使GridView的使用你选择绘制:
Instead of setting the selector on each ImageView inside the adapter, make the GridView use your selector drawable:
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);
编辑:
虽然我不建议这样做(明显的开销),它应该工作:
Although I don't recommend this (obvious overhead), it should work:
@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;
}
这篇关于Android的drawSelectorOnTop与GridView控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!