当前位置: 首页 > 面试题库 >

带有GridView的Android drawSelectorOnTop

乐正玺
2023-03-14
问题内容

我正在开发一个选项卡式应用程序,其中片段之一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)。该selector正被引用在这里绘制是GridView的内部selector绘制。

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

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


 类似资料:
  • 问题内容: 我有一个带有gridview的适配器,可以用作活动。我正在尝试将其放在Fragment中并进行转换,但是它不起作用。当我在Activity中包含IconFragmentSystem时,当我尝试打开Activity时会强制关闭。 我知道活动有效,因为我可以使用其他片段,并且一切都很好,所以我知道我的问题出在此文件中。 我尝试了不同的方法来实现此目的,但都失败了,我真的可以使用帮助将我指向

  • 现在我的问题是,如何在自定义的而不是自定义的中重写方法?我没有在这里公布我的代码,因为它与链接的代码本质上是相同的,只是我需要为子创建一个自定义的来代替,这样它就可以按照“pptang”的答案所述进行正确的度量。 否则,有没有比在第二个RecyclerView中使用1个RecyclerView更好的方法?只能有1个RecyclerView使用上述列表和每个中唯一项的网格填充活动/片段吗?

  • 希望你一切顺利。 这是我的设想。我有多(20)个Liferay Portlet,它们使用网格/表格来显示数据。 每个portlet根据不同的标准检索数据。 但是,网格与一些常见的功能相同,例如过滤、分页、数据导出等。 目前,每次我们必须对网格样式进行更改时,我必须对20个Portlet中的每一个进行更改。这是非常低效的,而且会浪费很多时间。 因此,我想知道是否有可能创建一个通用的“portlet”

  • 我按照以下指南使用网格视图在图库中插入图像:http://developer . Android . com/guide/topics/ui/layout/GridView . html 我编辑了imageadapter代码,如下所示: } 这是img_gallery个 xml 这是主要布局: 问题是,当我调整应用程序时,imageview有很多顶部和底部填充。我也尝试在xml中将其设置为0,但它

  • 问题内容: 两者之间到底有什么区别 和 第一个只是加快字段初始化速度的捷径吗?有性能方面的考虑吗? 问题答案: 第二种形式总是创建一个空的地图。 第一种形式是地图文字的特殊情况。地图文字允许创建 非空 地图: 现在,您的(通用)示例: 是没有初始值(键/值对)的地图文字。它完全等同于: 此外,这是为地图指定初始容量(大于初始分配的元素数量)的唯一方法。例: 将创建一个地图,该地图具有足够的空间来容

  • 问题内容: 查看量角器文档,我发现有一个选项可以不使用Selenium服务器使用flag 来运行量角器。 使用硒服务器和不使用硒服务器运行量角器测试之间的区别是什么,除了后者仅支持Chrome,Firefox? 问题答案: 首先,目前,您有 5种不同的内置选项/方式来连接浏览器驱动程序 : 指定在本地启动Selenium独立服务器 指定连接到正在运行的硒服务器(本地或远程) 设置并连接到Sauce