当我在 android studio 中使用 Java 下拉状态栏或最小化应用程序时,如何防止 'pressed Button' 未被按下?

How to prevent a 'pressed Button' from getting unpressed when I pull down the status bar or minimize the app using Java in android studio?

我正在做一个项目,当用户触摸或点击按钮时,按钮应该保持按下状态。我已经成功使用:

button.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        button.setPressed(true);
        return true;
    }
});

现在,我的问题是:当我使用 home/back 按钮(从导航栏)下拉状态栏或最小化应用程序时,按钮变为未按下状态。

我尝试使用以下方法解决此问题:

onSaveInstanceState(Bundle savedInstanceState)

保存按钮的按下状态,但是没有用

现在,我该如何解决这个问题?

我找到了两种解决方法(我个人喜欢第二种)。

解决方案 1

首先,我使用 onResume() 和一个标志变量来保存用户最小化应用程序时按钮的状态。

其次,我使用 onWindowFocusChanged() 和相同的标志变量来保存用户下拉状态栏时按钮的状态。

演示代码:

public class MainActivity extends AppCompatActivity {

    Button button;

    int flag=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.button);

        button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {

                button.setPressed(true);
                flag=1;

                return true;
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();

        if(flag==1){
            button.setPressed(true);
        }else{
            button.setPressed(false);
        }

    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        // handle when the user pull down the notification bar where
        // (hasFocus will ='false') & if the user pushed the
        // notification bar back to the top, then (hasFocus will ='true')

        super.onWindowFocusChanged(hasFocus);

        if (!hasFocus) {
            Log.i("Tag", "Notification bar is pulled down");

        }
        else {
            Log.i("Tag", "Notification bar is pushed up");
            if(flag==1){
                button.setPressed(true);
            }else{
                button.setPressed(false);
            }
        }

    }
}

方案二:

首先,我在 drawable 中创建了一个名为 button_bg.xml:

的文件
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="false" android:state_focused="false"
        android:state_pressed="false"
        android:drawable="@drawable/button_disabled">
    </item>


    <item android:state_selected="true"
        android:drawable="@drawable/button_default">
    </item>


    <item android:state_focused="true"
        android:drawable="@drawable/button_default">
    </item>


    <item android:state_pressed="true"
        android:drawable="@drawable/button_default">
    </item>

</selector>

在drawable(button_disabled.xml & button_default.xml中创建两个文件,用于button_bg.xml.

button_disabled.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid android:color="#b6b7b5" />

    <padding
        android:bottom="7dp"
        android:left="7dp"
        android:right="7dp"
        android:top="7dp" />

    <stroke
        android:width="2dp"
        android:color="#050303" />

    <corners android:radius="15dp" />

</shape>

button_default.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid
        android:color="#6FA803"/>


    <padding
        android:bottom="7dp"
        android:left="7dp"
        android:right="7dp"
        android:top="7dp" />

    <stroke
        android:width="2dp"
        android:color="#050303" />

    <corners android:radius="15dp" />

</shape>

然后,我添加了这个 button_bg.xml 文件作为我按钮的背景:

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/button_bg"
    android:text="Button" />

最后,我使用 setOnClickListener()View.setSelected() 来 select 按钮视图并保持按下状态:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        v.setSelected(true);

    }
});

我喜欢第二种解决方案的原因是:我不需要手动处理按钮的状态。所以,当我要处理多个按钮时,第二种解决方案会更方便。