lbr*_*anl 8 java android android-gridview android-selector
我正在开发一个标签式应用程序,其中一个片段CollectionsFragment在每个插槽中包含一个带有ImageView的GridView.我希望当用户点击其中一个图像时,使用选择器向用户提供反馈.
我已经成功实现了选择器,但是,我的问题是选择器只是在图像的背景中绘制,但我希望选择器可以绘制整个图像.我已经看到其他地方引用了这个问题,但是,许多人选择的解决方案,设置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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的选择器完整性:
<?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>
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助,
Vik*_*ram 15
我觉得你错了setDrawSelectorOnTop(boolean).该selector正被引用在这里绘制是GridView的内部selector绘制.
即使在最简单的实现中GridView,当单击网格项时,也会在其周围绘制蓝色边框.这是因为,默认情况下,gridview自己的选择器被绘制behind为项目.如果你打电话setDrawSelectorOnTop(true),选择器(蓝色)将被绘制在项目上.
但setDrawSelectorOnTop(boolean)与您在适配器中设置的选择器无关.无论你传递true,还是false,ImageView的选择器的行为都不会改变.
解:
而不是在适配器内的每个ImageView上设置选择器,使GridView使用您的选择器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));
Run Code Online (Sandbox Code Playgroud)
现在,没有必要:
picture.setBackgroundResource(R.drawable.selector);
Run Code Online (Sandbox Code Playgroud)
编辑:
虽然我不推荐这个(明显的开销),它应该工作:
@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;
}
Run Code Online (Sandbox Code Playgroud)