onBackPressed() 应用程序未关闭
onBackPressed() application is not closing
我有3个活动
第一个是登录
第二是注册
第 3 个主页 activity (Bottom_nav) 带有底部导航并有 3 个片段 A、B、C。
登录 activity 是启动器 activity。
In login 用户是否已经登录被检查
如果用户未登录,则重定向到注册 activity
否则回家 activity.
我在家里实现了 onBackPressed() activity
但是双击后退按钮 activity 暂停并恢复。
这是我的代码:
boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
Bottom_nav.this.finish();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce=false;
}
}, 2000);
}
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
getSupportFragmentManager().beginTransaction().replace(R.id.MainFrame, new HomeFragment()).commit();
return true;
case R.id.navigation_dashboard:
getSupportFragmentManager().beginTransaction().replace(R.id.MainFrame, new ProfileFragment()).addToBackStack(null).commit();
return true;
case R.id.navigation_notifications:
getSupportFragmentManager().beginTransaction().replace(R.id.MainFrame, new NotificationFragment()).addToBackStack(null).commit();
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bottom_nav);
getSupportFragmentManager().beginTransaction().add(R.id.MainFrame, new HomeFragment()).commit();
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}
这是日志
V/FA: Recording user engagement, ms: 2650
V/FA: Activity paused, time: 132340044
D/FA: Logging event (FE): user_engagement(_e),
Bundle[{firebase_event_origin(_o)=auto, engagement_time_msec(_et)=2650,
firebase_screen_class(_sc)=Bottom_nav,
firebase_screen_id(_si)=-4687850249260059972}]
D/FA: Logging event (FE): screen_view(_vs),
Bundle[{firebase_event_origin(_o)=auto,
firebase_previous_class(_pc)=Bottom_nav,
firebase_previous_id(_pi)=-4687850249260059972,
firebase_screen_class(_sc)=RegisterPhoneActivity,
firebase_screen_id(_si)=-4687850249260059974}]
V/FA: onActivityCreated
V/FA: Activity resumed, time: 132340054
V/FA: Screen exposed for less than 1000 ms. Event not sent. time: 184
V/FA: Activity paused, time: 132340135
D/FA: Logging event (FE): screen_view(_vs),
Bundle[{firebase_event_origin(_o)=auto,
firebase_previous_class(_pc)=RegisterPhoneActivity,
firebase_previous_id(_pi)=-4687850249260059974,
firebase_screen_class(_sc)=Bottom_nav,
firebase_screen_id(_si)=-4687850249260059971}]
V/FA: Activity resumed, time: 132340244
W/PathParser: Points are too far apart 4.000000000000002
Points are too far apart 4.000000000000002
W/PathParser: Points are too far apart 4.000002058290173
Points are too far apart 4.000002058290173
W/PathParser: Points are too far apart 4.000001624254724
W/PathParser: Points are too far apart 4.000002923700373
Points are too far apart 4.000002923700373
W/PathParser: Points are too far apart 4.00000093640932
V/FA: Inactivity, disconnecting from the service
我哪里错了?我没有找到任何相关的答案
检查 SupportFragmentManager
的后台堆栈的状态可能更常见:
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
getSupportFragmentManager().popBackStack();
} else {
/* only consider those clicks when there is no stack left */
}
}
否则您的自定义功能会扰乱 SupportFragmentManager
.
的行为
Bottom_nav.this.finish();
上究竟发生了什么?如果不是 finish activity 语句,让我们试试:
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce && (!isFinishing() || !isDestroyed())) {
finish();
//super.onBackPressed();
Bottom_nav.this.finish();
return;
}
//...
}
请使用这个。
boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
if (!doubleBackToExitPressedOnce){
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce = false;
}
}, 2000);
}else {
if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
finish();
}
}
}
打开片段时必须使用此
getSupportFragmentManager().beginTransaction().replace(R.id.MainFrame, new HomeFragment()).addToBackStack(null).commit();
如果您的启动屏幕是登录然后使用 finishAffinity()
方法将完成当前 activity 和所有父活动,但它仅适用于 Android 4.1 或更高版本。
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
Bottom_nav.this.finishAffinity();
return;
}
如果你不想在片段中回溯,那么使用这个。
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
或者你可以改变你的方式,比如
getSupportFragmentManager().beginTransaction().replace(R.id.MainFrame, new HomeFragment()).addToBackStack(null).commit();
我有3个活动 第一个是登录 第二是注册 第 3 个主页 activity (Bottom_nav) 带有底部导航并有 3 个片段 A、B、C。
登录 activity 是启动器 activity。
In login 用户是否已经登录被检查 如果用户未登录,则重定向到注册 activity 否则回家 activity.
我在家里实现了 onBackPressed() activity 但是双击后退按钮 activity 暂停并恢复。
这是我的代码:
boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
Bottom_nav.this.finish();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce=false;
}
}, 2000);
}
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
getSupportFragmentManager().beginTransaction().replace(R.id.MainFrame, new HomeFragment()).commit();
return true;
case R.id.navigation_dashboard:
getSupportFragmentManager().beginTransaction().replace(R.id.MainFrame, new ProfileFragment()).addToBackStack(null).commit();
return true;
case R.id.navigation_notifications:
getSupportFragmentManager().beginTransaction().replace(R.id.MainFrame, new NotificationFragment()).addToBackStack(null).commit();
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bottom_nav);
getSupportFragmentManager().beginTransaction().add(R.id.MainFrame, new HomeFragment()).commit();
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}
这是日志
V/FA: Recording user engagement, ms: 2650
V/FA: Activity paused, time: 132340044
D/FA: Logging event (FE): user_engagement(_e),
Bundle[{firebase_event_origin(_o)=auto, engagement_time_msec(_et)=2650,
firebase_screen_class(_sc)=Bottom_nav,
firebase_screen_id(_si)=-4687850249260059972}]
D/FA: Logging event (FE): screen_view(_vs),
Bundle[{firebase_event_origin(_o)=auto,
firebase_previous_class(_pc)=Bottom_nav,
firebase_previous_id(_pi)=-4687850249260059972,
firebase_screen_class(_sc)=RegisterPhoneActivity,
firebase_screen_id(_si)=-4687850249260059974}]
V/FA: onActivityCreated
V/FA: Activity resumed, time: 132340054
V/FA: Screen exposed for less than 1000 ms. Event not sent. time: 184
V/FA: Activity paused, time: 132340135
D/FA: Logging event (FE): screen_view(_vs),
Bundle[{firebase_event_origin(_o)=auto,
firebase_previous_class(_pc)=RegisterPhoneActivity,
firebase_previous_id(_pi)=-4687850249260059974,
firebase_screen_class(_sc)=Bottom_nav,
firebase_screen_id(_si)=-4687850249260059971}]
V/FA: Activity resumed, time: 132340244
W/PathParser: Points are too far apart 4.000000000000002
Points are too far apart 4.000000000000002
W/PathParser: Points are too far apart 4.000002058290173
Points are too far apart 4.000002058290173
W/PathParser: Points are too far apart 4.000001624254724
W/PathParser: Points are too far apart 4.000002923700373
Points are too far apart 4.000002923700373
W/PathParser: Points are too far apart 4.00000093640932
V/FA: Inactivity, disconnecting from the service
我哪里错了?我没有找到任何相关的答案
检查 SupportFragmentManager
的后台堆栈的状态可能更常见:
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
getSupportFragmentManager().popBackStack();
} else {
/* only consider those clicks when there is no stack left */
}
}
否则您的自定义功能会扰乱 SupportFragmentManager
.
Bottom_nav.this.finish();
上究竟发生了什么?如果不是 finish activity 语句,让我们试试:
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce && (!isFinishing() || !isDestroyed())) {
finish();
//super.onBackPressed();
Bottom_nav.this.finish();
return;
}
//...
}
请使用这个。
boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
if (!doubleBackToExitPressedOnce){
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce = false;
}
}, 2000);
}else {
if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
finish();
}
}
}
打开片段时必须使用此
getSupportFragmentManager().beginTransaction().replace(R.id.MainFrame, new HomeFragment()).addToBackStack(null).commit();
如果您的启动屏幕是登录然后使用 finishAffinity()
方法将完成当前 activity 和所有父活动,但它仅适用于 Android 4.1 或更高版本。
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
Bottom_nav.this.finishAffinity();
return;
}
如果你不想在片段中回溯,那么使用这个。
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
或者你可以改变你的方式,比如
getSupportFragmentManager().beginTransaction().replace(R.id.MainFrame, new HomeFragment()).addToBackStack(null).commit();