gpt4 book ai didi

java - Android drawSelectorOnTop 与 GridView

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:26 24 4
gpt4 key购买 nike

我正在开发一个选项卡式应用程序,其中一个 fragment CollectionsFragment 包含一个 GridView,每个插槽中都有一个 ImageView。我希望在用户单击其中一张图像时使用选择器向用户提供反馈。

我已经成功实现了选择器,但是,我的问题是选择器只在图像的背景中绘制,但我想让选择器绘制整个图像。我在其他地方看到过这个问题,但是,许多人选择的解决方案(设置 GridView 的 drawSelectorOnTop 属性)对我不起作用。

具有相关适配器代码的相关 fragment :

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 drawable 是 GridView 的内部 selector drawable。

即使在 GridView 的最简单实现中,单击网格项时,也会在其周围绘制蓝​​色边框。这是因为,默认情况下,gridview 自己的选择器绘制在项目的后面。如果调用 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;
}

关于java - Android drawSelectorOnTop 与 GridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20254232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com