【问题标题】:android button setPressed after onClickandroid按钮setPressed在onClick之后
【发布时间】:2021-02-24 21:42:17
【问题描述】:

昨天我注意到可以通过 Compatibility 包将 Fragments 集成到旧 API 级别中,但这对于这个问题并不是很重要。 :)

我有一个带有 OnClickListener 的按钮

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        doSomething();
        button.setPressed(true);
    }
});

由于实际点击,显示为按下状态,松开点击后,按钮状态为未按下状态。

有没有一种简单的方法可以在释放后保持按钮状态为按下状态? 我能想到的第一件事是某种计时器,但这似乎不合理。

【问题讨论】:

  • 使用setSelected(boolean state)
  • 您好 strem - 您能否准确列出您是如何修复它的?你的意思是你想让按钮显示按下设定的时间,直到事件完成?或者重置按下的按钮?无论如何,请显示您的解决方案,因为您在下面选择的解决方案是错误的..

标签: android button state


【解决方案1】:

请注意,这是因为 Android 在您的 onClickEvent 之前和之后都更改了 setPressed,因此您自己更改它没有任何效果。解决此问题的另一种方法是使用onTouchEvent

button.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        // show interest in events resulting from ACTION_DOWN
        if (event.getAction() == MotionEvent.ACTION_DOWN) return true;

        // don't handle event unless its ACTION_UP so "doSomething()" only runs once.
        if (event.getAction() != MotionEvent.ACTION_UP) return false;

        doSomething();
        button.setPressed(true);                    
        return true;
   }
});

【讨论】:

  • 马丁,我非常喜欢你的回答。但是,当我单击通知区域或选项菜单时,按下状态消失。你知道发生了什么吗?
【解决方案2】:

使用ToggleButton 代替Button

<ToggleButton
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:background="@drawable/topping_selector"
    android:checked="false"
    android:textOff="Topping2"
    android:textOn="Topping2" />

topping_selector.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_checked="true" 
        android:drawable="@drawable/btn_topping_on" />

    <item android:state_checked="false" 
        android:drawable="@drawable/btn_topping_off" />

</selector>

【讨论】:

    【解决方案3】:

    您可以将按钮状态保存在drawable文件夹下的xml文件中,然后用作按钮的背景。 例如:

     android:background="@drawable/buttonstate"
    

    buttonstate.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true" android:drawable="@drawable/back_focused" />
        <item android:drawable="@drawable/back" /> <!-- default -->
    </selector>
    

    【讨论】:

    • 不是我所希望的,但还是谢谢!现在可以使用 button.setSelected(true) 并为该状态定义一个可绘制对象
    • 不是用户要求的,不能解决问题。这个答案真的不应该被批准。
    • 我同意 Chuck - strem - 如果您设法以这种方式实现它,请发布一个示例,说明您如何使用 setSelected(true) 做到这一点。动作完成后按钮是否恢复正常状态?
    • @strem 在下面查看我的解决方案
    【解决方案4】:

    更好的解决方案:

    在xml文件中:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:state_activated="true">
            <bitmap android:src="@drawable/image_selected"/>
        </item>
        <item>
            <bitmap android:src="@drawable/image_not_selected"/>
        </item>
    </selector>
    

    在java中:

    @Override
    public void onClick(View v) {
       v.setActivated(!v.isActivated());
    }
    

    【讨论】:

    • 哈哈。简单任务的行太多:v.setActivated(!v.isActivated()) 不过还是谢谢
    • 如果这是逻辑,那么您不需要选择器来......只需自行处理。糟糕的解决方案'
    【解决方案5】:

    您可以使用 android.os.Handler 类。丑陋,但也有效:

    final Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            doSomething();
            new Handler().post(new Runnable() {
                @Override
                public void run() {
                    button.setPressed(true);
                }
            });
        }
    });
    

    【讨论】:

      【解决方案6】:

      另一种解决方案是扩展Button 并覆盖setPressed(boolean pressed) 方法,以便您可以使用标志处理来自onClickEvent 的平台调用,例如根据您的需要更改布尔按下参数。

      public class MyButton extends Button {
         boolean isSelected = false;  //this is your flag
         @Override
         public void setPressed(boolean pressed) {
             if(isSelected) {
                 //here you change the parameter so it stays pressed
                 super.setPressed(true);
                 return;
             }
             super.setPressed(pressed);
         }
      
         public void setIsSelected(boolean selected) {
             this.isSelected = selected;
         }
      
         public MyButton(Context context) {
             super(context);
         }
      }
      

      【讨论】:

        【解决方案7】:

        这是我使用的解决方案,目前它也适用于android 7.0。

        YourActivity.java

        public void onStandbyStart(String message) {
            startStandbyBtn.setActivated(true);
        }
        
        public void onBackOnline(String message) {
            startStandbyBtn.setActivated(false);
        }
        

        你的活动布局

        <Button
                ...
                style="@style/generic_btn_style"
                ... />
        

        values/styles.xml

            <style name="generic_btn_style" parent="@android:style/Widget.Button">
                <item name="android:gravity">center_vertical|center_horizontal</item>
                <item name="android:background">@drawable/generic_btn</item>
                <item name="android:textColor">@color/selector_white_black</item>
                <item name="android:focusable">true</item>
                <item name="android:clickable">true</item>
        </style>
        

        drawable/generic_btn.xml 此选择器选择按钮背景。我用按下的作为激活的。

        <?xml version="1.0" encoding="utf-8"?>
        
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:drawable="@drawable/generic_btn_disabled" android:state_enabled="false" />
            <item android:drawable="@drawable/generic_btn_pressed" android:state_enabled="true" android:state_pressed="true" />
            <item android:drawable="@drawable/generic_btn_pressed" android:state_activated="true" />
            <item android:drawable="@drawable/generic_btn_focused" android:state_enabled="true" android:state_focused="true" />
            <item android:drawable="@drawable/generic_btn_enabled" android:state_enabled="true" />
        </selector>
        

        颜色/selector_black_white 在这里我设置了文本颜色。在我的情况下,我需要在按下时选择 textcolor black。

        <?xml version="1.0" encoding="utf-8"?>
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:color="#fff" android:state_pressed="true" /> <!-- pressed -->
            <item android:color="#fff" android:state_activated="true" /> <!-- pressed -->
            <item android:color="#000" /> <!-- default -->
        </selector>
        

        【讨论】:

          猜你喜欢
          • 2016-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多