8

我正在开发一个选项卡式应用程序,其中一个片段 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>

谢谢你的帮助,

4

2 回答 2

15

我认为你搞错了setDrawSelectorOnTop(boolean)。这里引用的drawableselector是GridView 的内部selectordrawable。

即使在最简单的实现中GridView,当单击网格项时,也会在其周围绘制蓝​​色边框。这是因为,默认情况下,gridview 自己的选择器是绘制behind项目的。如果您调用setDrawSelectorOnTop(true),选择器(蓝色)将被绘制在项目上。

setDrawSelectorOnTop(boolean)与您在适配器中设置的选择器无关。无论您通过true还是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);

编辑:

虽然我不推荐这个(明显的开销),但它应该可以工作:

@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;
}
于 2013-12-01T07:58:12.927 回答
2
  1. 尝试attribute android:drawSelectorOnTopactivity_collections.xml文件中设置 xml。

  2. 看看是否有帮助gridView.setDrawSelectorOnTop(true);gridView.setAdapter();有时,顺序很重要(奇怪)。

  3. 如果所有其他方法都失败了,您可能必须切换GridView到其他一些setDrawSelectorOnTop()被证明可以始终如一地工作的视图。

于 2013-12-01T01:41:23.713 回答