Android 使用 GridView 绘制选择器OnTop

2023-11-27

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

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

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

Edit:

虽然我不推荐这样做(明显的开销),但它应该有效:

@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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 使用 GridView 绘制选择器OnTop 的相关文章

  • Android TabLayout:均匀分布

    我正在查看 Google IO 中使用的 Google 类 称为 SlidingTabLayout 在该类中 有一个名为 setDistributeEvenly 的方法 它允许所有这些选项卡在屏幕上均匀分布 每个选项卡具有相同的大小 中心对
  • xclock 工作,X11 DISPLAY 设置但仍然 java.awt.HeadlessException:

    获取 java awt HeadlessException 似乎是一个非常常见的问题 并且 中已经讨论过 以下问题 没有 X11 DISPLAY 变量 这是什么意思 https stackoverflow com questions 662
  • 在字节数组上进行右位旋转/循环移位的最快方法是什么

    如果我有数组 01101111 11110000 00001111 111 240 15 移位 1 位的结果是 10110111 11111000 00000111 183 248 7 数组大小不固定 移位范围为 1 到 7 含 目前我有以
  • Android/三星 Galaxy S 模拟器

    有没有办法在三星银河模拟器或类似的东西上尝试我的项目 我的项目在 HTC Legend 上运行 但在该设备上崩溃了 我如何在 android eclipse 上设置三星 Galaxy s 我设置了 W800 854 2 2 AVD 但它可以
  • 无法在 Android 中使用自定义数组适配器进行搜索?

    我无法从以下位置搜索listview 我尝试了各种方法 但它对我不起作用 没有错误 我有其他方式进行搜索 但我想让这种方式成为可能 这是代码 public class MainActivity extends Activity implem
  • 在 XSSF 工作簿上设置密码保护

    我想为使用 poi 3 14 创建的 xlsx 文件添加密码保护 该文档声称 这是可能的 http poi apache org cryption html http poi apache org encryption html 使用我尝试
  • BODMAS系统的加法和减法

    我一直在构建一个简单的公式计算器 但一直被加法和减法困扰 正如您应该知道的 在计算方程时 您遵循优先级算术规则 即括号 顺序 幂函数 除法 乘法 加法和减法 问题是加法和减法具有相同的优先级 因此您可以从左到右阅读 到目前为止 这是我的代码
  • Apache Camel - 路由中的事务

    我有一个关于 Apache Camel 的一般性问题 我无法找到聚合器是否已进行交易 如果是交易 交易是如何实现的 聚合的速度有多快 将消息发送到聚合器可以在事务中运行 您需要一个带有聚合器的持久存储来让传出消息充当事务 请参阅有关持久性的
  • 错误:类 kotlin.reflect.jvm.internal.FunctionCaller$FieldSetter

    我已尝试一切方法来消除此错误 但它不断出现 Class kotlin reflect jvm internal FunctionCaller FieldSetter can not access a member of class com
  • 如何更改蜂窝中儿童偏好屏幕的背景颜色

    过去几天我一直在寻找解决方案 但找不到 我需要更改右窗格的背景颜色 我知道如何更改左父首选项的颜色 我在清单文件中创建了一个新主题
  • GSSAPI 中的 javax.naming.AuthenticationException

    我正在尝试使用 JAVA GSSAPI 执行 NTLM 绑定 我收到此错误 javax naming AuthenticationException GSSAPI 根异常是 javax security sasl SaslException
  • 无法在 Android Studio 中运行项目

    当我尝试在 Android Studio 中运行我的项目时 我收到以下错误消息 Execution failed for task CricHQ dexDebug gt com android ide common internal Log
  • 可下载字体例外

    我决定使用可下载字体 https developer android com guide topics ui look and feel downloadable fonts html在我的项目中 IS 按照指南中的建议实施了所有内容 当我
  • 谷歌的Json解析Gson库:JsonElement和JsonObject有什么区别?

    public abstract class JsonElement extends Object 表示 Json 元素的类 它可以是 JsonObject JsonArray JsonPrimitive 或 JsonNull public
  • 调用属于Fragment的Activity的函数

    我正在与多个Fragments在 Android 下 我对如何从嵌入式应用程序发送和接收数据感到困惑 为了简单的解释 我有一个ListFragment and a MapFragment使用解释的方法here https stackover
  • 将 JPanel 添加到 JFrame

    我有一个程序 其中将 JPanel 添加到 JFrame public class Test Test2 test new Test2 JFrame frame new JFrame Test frame setLayout new Bor
  • Java Media API:java media api 下载

    我在哪里可以找到javax media jar 文件 在sun站点它下载一个安装程序 有没有可用的java媒体jar 没有 javax media 具体是 jar 文件 该包位于 jmf jar 文件中 您需要运行安装程序并取出 jar 或
  • 项目级别的@PowerMockIgnore

    在 Maven 中运行时 我的 powermock 测试用例出现以下错误 java lang LinkageError loader constraint violation loader instance of org powermock
  • 请解释为什么Java和C对此代码给出不同的答案

    public class Test public static void main String args int i 10 i i System out println value of i is i 输出是 10 当我在中执行类似的代码
  • 带有包含布局的导航抽屉布局

    我认为我的问题实际上很简单 但我不知道如何解决 有一个工作导航抽屉 代码如下

随机推荐

  • 如何从 sklearn GridSearchCV 获取 MSE 和 R2?

    我可以在管道上使用 GridSearchCV 并将评分指定为 MSE or R2 然后我可以访问gridsearchcv best score 恢复我指定的那个 我如何获得 GridSearchCV 找到的解决方案的其他分数 如果我使用其他
  • 小数点前 6 位和小数点后 2 位的正则表达式

    我需要一个正则表达式 其中小数是可选的 如果有小数点 则小数点前最多 6 位 小数点后最多 2 位 如果不存在小数点 则最多 6 位有效 正则表达式测试器 d 0 6 d 1 2 上述正则表达式最多允许 8 位数字 不带小数 我如何根据我的
  • 如何使用 Jest 模拟同一模块中的函数?

    正确模拟以下示例的最佳方法是什么 问题是导入时间之后 foo保持对原始内容的引用未被模拟bar module js export function bar return bar export function foo return I am
  • 如何查看 Java 小程序的错误消息?

    在尝试回答一个问题时小程序问题 OP 不知道如何查看他的小程序的错误消息 我自己这样做已经有一段时间了 我没有找到任何一步一步的说明 所以我在这里发布一个问题和答案 以供后代使用 Windows 双击右下角时钟旁边的系统托盘中的 Java
  • 更新 R data.frame 中的单个值(不是行)

    我想更新的值var3在 R 数据框中mydata根据一个简单的标准 var1 var2 var3 1 1 4 5 2 3 58 800 3 8 232 8 我认为应该做到以下几点 mydata var3 mydata var3 gt 500
  • 以编程方式将 .NET 程序集安装到 GAC 中的方法

    我需要创建一个小型应用程序或脚本来将 NET 程序集安装到 GAC 中 我读过有几种方法可以做到这一点 包括 using gacutil exe 执行以下代码行 new System EnterpriseServices Internal
  • 从 CVS *,v 文件的存档中恢复文件

    我试图从一堆过去用 CVS 管理的文件中恢复一些旧的源代码 纯文本 我有一个目录 其中包含 CVS 的 v 文件格式的所有源代码文件 这看起来大部分像原始文件 但其中有相当多的 CVS 特定标头和修订信息 有没有一种简单的方法可以删除所有
  • 如何在java中获取比较器的倒数

    在一种方法中 我收到一个通用的object E extends Comparable
  • 为什么在 grid-template-columns 中显示 100% 的网格会脱离主体?

    parent position fixed width 100 left 0 top 14px display grid grid template columns 40 60 grid gap 5px background eee lef
  • 在 prop.table 的输出中附加 % 符号

    我正在尝试在输出中附加 符号prop table用于Sweave 我尝试的代码如下 m lt matrix 1 4 2 dimnames m lt list c A B c C D prop table m 1 100 C D A 25 0
  • 以编程方式更改时 UISwitch 不发送 valueChanged 事件

    我有一对 UISwitches 通过 valueChanged 事件连接到 IBAction 当触摸开关时 valueChanged 事件会正常触发 但是 如果我以编程方式更改其中一个开关 它不会调用我的 IBAction IBAction
  • 如何在 iOS 上以编程方式截取屏幕截图

    我想要将屏幕上的图像的屏幕截图保存到已保存的照片库中 考虑检查Retina显示屏使用以下代码片段 import
  • Windows 上的 C++ - 控制台窗口只是闪烁然后消失。这是怎么回事? [复制]

    这个问题在这里已经有答案了 可能的重复 Visual Studio 控制台应用程序 防止窗口关闭 我开始在 Windows 上学习 C 并尝试一些不同的开发环境 1 带有Cygwin编译器的Netbeans 2 微软视觉工作室2010 对于
  • 在 macOS 中以编程方式启用、禁用和启动服务

    我正在编写一个附带服务的程序 到目前为止 我所做的是创建一个辅助工具 它可以为我的进程运行提升的任务 并可以通过 XPC 进行通信 我的程序与一项服务捆绑在一起 我想使用帮助工具来安装和启动 停止该服务 以便我的程序可以在设置中具有 随系统
  • Solr 中的通配符搜索

    我在使用 edismax 处理程序以 lucene 语法进行通配符搜索时遇到问题 我从主干中每晚构建 Solr 4 0 像 computer 这样的一般搜索会返回结果 但 com 会返回结果er 不返回任何结果 类似地 像 co mput
  • Angular 2 上的 Ngrx 存储、效果、Http Ajax 轮询设置

    我正在创建一个 Ngrx Angular 2 应用程序 并试图让我的 http 调用在一段时间间隔后继续轮询 我见过使用interval 函数 但在 Ngrx 的情况下 当服务调用在内部完成时 Effect 它给出一个错误 请指教 Inje
  • Android 文本转语音应用程序 UI 速度很慢

    在我的应用程序中 我使用 TTS 我有 20 种不同的活动 当用户向左或向右滑动时 这些活动会发生变化 根据活动 朗读文本 我正在使用单独的线程执行 tts 并且活动选择是通过主线程完成的 但问题是速度很慢 UI感觉迟钝 当我向左或向右滑动
  • Angular2 无法访问承诺内的“this”

    我无法调用 ng2 sweetalert2 插件承诺内的函数 swal title Are you sure text You won t be able to revert this type warning showCancelButt
  • 如何安全地使用用户输入中的正则表达式?

    我的 基于 Perl 的 应用程序需要让用户输入正则表达式 以在幕后匹配各种字符串 到目前为止 我的计划是把绳子包裹在类似的东西中 regex eval qr text if my error mangle error to extract
  • Android 使用 GridView 绘制选择器OnTop

    我正在开发一个选项卡式应用程序 其中片段之一 CollectionsFragment 包含一个 GridView 每个插槽中都有一个 ImageView 我希望使用选择器在用户单击其中一张图像时向用户提供反馈 我已经成功实现了选择器 但是