当我在 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);
}
});
我喜欢第二种解决方案的原因是:我不需要手动处理按钮的状态。所以,当我要处理多个按钮时,第二种解决方案会更方便。
我正在做一个项目,当用户触摸或点击按钮时,按钮应该保持按下状态。我已经成功使用:
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);
}
});
我喜欢第二种解决方案的原因是:我不需要手动处理按钮的状态。所以,当我要处理多个按钮时,第二种解决方案会更方便。