【问题标题】:Grid view item not hightlight when press按下时网格视图项目不突出显示
【发布时间】:2012-12-02 03:03:36
【问题描述】:

我的应用程序有一个网格视图,默认情况下,当我单击它时,它的项目不会突出显示(我不知道为什么?)。我尝试将它添加为如下列表选择器,但它也不起作用,

<GridView
                android:id="@android:id/list"
                android:layout_width="fill_parent"
                android:layout_height="match_parent"
                android:layout_above="@+id/load_more_process_id"
                android:layout_alignParentTop="true"
                android:drawSelectorOnTop="false"
                android:listSelector="@drawable/grid_selector"
                 >
            </GridView>

这是我的选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:drawable="@android:color/black"></item>
<item android:state_pressed="false" android:drawable="@android:color/white"></item>

【问题讨论】:

  • 高亮颜色为黑色,背景色是什么?
  • 背景颜色为透明,父视图背景为白色...
  • 您使用的是自定义适配器吗?如果是这样,请在自定义膨胀视图组上使用您的选择器。

标签: android android-layout android-widget


【解决方案1】:

如果列表项内容(或每个网格项的视图)中有可聚焦元素,则不会绘制选择器

例如,如果您的列表项的模板是:

<LinearLayout android:orientation="horizontal" ... >
    <CheckBox android:id="@+id/checkBox" ... />
    <TextView android:id+"@+id/textView" ... />
</LinearLayout>

那么 ListView 将不会为每个 ListView 项目绘制选择器,因为 CheckBox 默认情况下是可聚焦的。

您可以为每个随选择状态更改的项目提供背景,或者禁用对所有可聚焦元素的焦点(这反过来需要您编写一个童话般的适配器来在选择状态更改时检查复选框。

例如:

<CheckBox android:id="@+id/checkBox" android:focusable="false" ... />

将导致封闭的 ListView 再次开始绘制选择器。

有状态的drawable示例:

drawable/my_list_selector_bg.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/list_background_pressed"
        android:state_pressed="true" />
    <item android:drawable="@drawable/list_background_focused"
        android:state_focused="true" />
    <item android:drawable="@android:color/transparent" />
 </selector>

然后将其应用于适配器返回的每个视图的背景:

<LinearLayout android:orientation="horizontal" 
      android:background="@drawable/my_list_selector_bg"
  ... >

任何一种方法都可以。

列表适配器类(GridView、ListView 和 c)在适配器返回的每个视图上调用 hasFocusable(),如果 hasFocusable() 返回 true,则禁用选择绘制。幸运的是,它们还将选择/焦点/按下/活动状态复制到当前焦点或选定的适配器项,因此您可以根据需要自己绘制。

【讨论】:

  • 一个常见的陷阱:在列表项模板中放置一个复选框。
  • (编辑原始帖子以提供示例)。
  • 像魅力一样工作!非常感谢!
  • 回想一下我在复合控件列表视图方面的经验......如果你弄乱了默认行为,你需要认真考虑如何处理焦点和键盘在具有 DPAD 或轨迹球导航的设备上进行导航。谷歌电视设备是一个值得注意的例子,默认情况下使用 DPAD 导航——尽管用户可以在必要时切换到触摸模式。如果您的设备带有出站 USB 端口,您可以通过将 PC 键盘插入 USB 端口并使用光标键(或蓝牙键盘)导航来模拟体验。
【解决方案2】:

遇到和我一样问题的朋友,试试

gridView.setDrawSelectorOnTop(true);

我的每个 GridView 项目中都有一个 ImageView 和一个 TextView。我的选择器工作正常,但它在我的图像后面绘制。

【讨论】:

    【解决方案3】:
    1. 网格视图的布局:

       <GridView xmlns:android="http://schemas.android.com/apk/res/android" 
       android:listSelector="@drawable/gridselector"/>
      
    2. 创建自定义选择器 gridselector.xml,如:

      <selector xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/selector_item">
         <item 
           android:state_pressed="true" 
           android:drawable="@drawable/focus_offfocus">
        </item>
      
         <item 
            android:state_enabled="true" 
            android:state_focused="true" 
            android:drawable="@drawable/focus_onfocus">
        </item>
      
        <item android:state_enabled="true" 
          android:drawable="@drawable/focus_offfocus">
        </item> 
      </selector>
      

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      相关资源
      最近更新 更多