【问题标题】:Selector state pressed doesn't seem to be working按下的选择器状态似乎不起作用
【发布时间】:2023-03-10 14:45:02
【问题描述】:

我有一个 RecyclerView,它有一个 ImageView,因为它是 ViewHolder。我想在我单击的 ImageView 周围添加一个白色边框。由于所有这些状态都非常令人困惑(按下、选择、聚焦),所有这些状态都可能意味着相同的事情,我想问一下这个具体情况..

这是适配器的 ViewHolder xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_margin="10dp"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<com.myproject.RoundRectCornerImageView
    android:id="@+id/imageHolder"
    android:layout_width="56dp"
    android:layout_height="56dp"
    android:background="@drawable/image_details_selector"
    android:clickable="true"
    android:scaleType="centerCrop"
    android:src="@drawable/thumbnail"
    android:focusable="true" />

这是我正在使用的选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:state_selected="true">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <stroke android:width="4dp" android:color="#fff" />
        <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>
</item>

<item android:state_pressed="false" android:state_selected="false">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <stroke android:width="1dp" android:color="@android:color/transparent" />
        <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>

</item>

所以我在这里要做的是,在水平 RecyclerView 中有一个图像列表,如果我单击其中一个图像,它将在自身周围出现这个白色边框,而所有其他 ImageView 都不会。我实现了 onClick 侦听器,它在后台加载图像并且它正在工作,但我无法让这个选择器像我想要的那样工作。有什么想法吗?

【问题讨论】:

  • 好的,我在这里看到了问题,但让我们澄清一个案例。如果您有一个选中的项目(带白色边框)并单击另一个,您是否希望第一个变为无边框?
  • 是的!另外,如果我的 ImageView 是 56x56 dp,这个选择器也应该有 56x56 的大小吗?或 58x58 例如,如果我将其笔画宽度设置为 2dp?
  • 没关系。用于背景的选择器就像颜色一样。所以你必须为你的 imageview 指定 padding 来为 imageview 中的 src 图像做偏移。

标签: android android-layout android-recyclerview android-imageview android-viewholder


【解决方案1】:

首先,您必须像这样设置选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <stroke android:width="4dp" android:color="#fff" />
        <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>
</item>

<item android:state_selected="false">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <stroke android:width="1dp" android:color="@android:color/transparent" />
        <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>

</item>

在这种情况下,只有选中才会起作用。然后您必须在适配器的 getView() 方法中手动设置选择,如下所示:

ImageView iv = (ImageView) findViewById(R.id.image_view);
    iv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(lastImageView != null)
                lastImageView.setSelected(false);
            lastImageView = (ImageView) view;
            lastImageView.setSelected(true);
        }
    });

并在适配器上将其设置为全局

private ImageView lastImageView = null;

【讨论】:

    【解决方案2】:

    您已经添加了android:state_selected="true",在这种情况下,它正在检查条件按下效果和状态。从选择器中删除状态。希望这对你有用。

    使用下方选择器

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
            <stroke android:width="4dp" android:color="#fff" />
            <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
        </shape>
    </item>
    
    <item android:state_pressed="false">
        <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
            <stroke android:width="1dp" android:color="@android:color/transparent" />
            <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
        </shape>
    
    </item>
    

    【讨论】:

    • 我这样做是因为如果我只使用 state_pressed,它只会闪烁.. 当我单击 ImageView 时,白色边框会闪烁,但如果我长按它,它会一直存在直到我释放它..这就是为什么我对“按下、选择、专注”的真正含义感到困惑。所以我尝试了所有这些,但没有运气..
    • 您希望它只闪烁吗?对吗?
    • 不,我希望它保持白色,直到我点击其他一些 ImageView.. 只有选定的 ImageView 应该有白色边框
    • 在这种情况下不要使用按下效果。您需要以编程方式对其进行管理。如果您使用 recyclerview 而不是在 pojo 类中管理一个以上的标志,或者如果没有 recyclerView,那么您只需要通过一些单独的标志来管理它。
    • 啊,正是我想避免的 :) 但是,是的,这是有道理的.. 至少我现在很好地理解了这些州 :) 无论如何感谢您的时间!
    【解决方案3】:

    请参考此代码:

        '<?xml version="1.0" encoding="utf-8"?>
          <selector xmlns:android="http://schemas.android.com/apk/res/android">
           <item android:state_pressed="true">
             <shape android:shape="rectangle">
               <stroke android:width="4dp" android:color="#fff" />
               <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
        </shape>
    </item>
    
    <item>
        <shape android:shape="rectangle">
            <stroke android:width="1dp" android:color="@android:color/transparent" />
            <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
        </shape>
    
    </item>
    

    请检查您在上面的代码中所做的与此比较。

    【讨论】:

    • 从您的代码中删除 android:state_selected="true" 行从第一个 块和第二个 只保留它没有任何项目的默认属性,最后保留
    • 现在我只尝试使用 state_pressed,但是当我点击 ImageView 时,白色边框会闪烁,但如果我长按它,白色边框会一直存在,直到我释放点击..
    • pressed:当用户按下视图时,此事件发生,选中:当用户选择复选框或单选按钮等任何项目时,此事件发生时,聚焦:当用户像编辑文本一样获得焦点时获得焦点在此事件发生时,它处于聚焦模式中。如上代码,当用户按下视图时,此事件在他释放时发生,然后它的默认项目将在那里生效。
    • 我就是这么想的:/所以没有办法这样处理吗?我应该在适配器内部创建自己的逻辑,对吧?
    • 您可以在模型中使用任何布尔标志,然后您可以在单击时设置为 true,然后需要将其设为选定背景,而其他将被取消选择。如果您允许多项选择,则在适配器的 item_layout 中使用复选框,并使用选定的事件集设置上述代码。并使用 framlayout 使其具有正确的布局外观。
    【解决方案4】:

    一旦检测到点击,您必须手动设置 ImageView 的状态。 RecyclerView 不为其子级存储状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 2013-07-24
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多