【问题标题】:onBackPressed() application is not closingonBackPressed() 应用程序未关闭
【发布时间】:2018-11-19 04:34:51
【问题描述】:

我有 3 个活动 第一个是登录 二是注册 第三个主页活动(Bottom_nav),底部导航,有 3 个片段 A、B、C。

登录活动是启动器活动。

在登录用户是否已经登录被检查 如果用户未登录,则重定向到注册活动 其他回家活动。

我已经在家庭活动中实现了 onBackPressed() 但是在双击返回按钮时,活动会暂停并恢复。

这是我的代码:

 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

我哪里出错了?我没有找到任何相关的答案

【问题讨论】:

  • 那一刻是否有任何错误显示或应用程序崩溃?如果有任何崩溃,然后发布正确的日志。
  • 您的代码是否在检查用户是否仍在登录并重新启动活动?
  • @farhana 没有应用程序崩溃
  • @Jantzilla im 检查用户是否在应用程序启动时登录,但不在 Home Activity 中
  • 好的,我知道了,您的启动器屏幕是LoginActivity,当您按下后它会进入登录屏幕并检查您的登录条件,然后“LoginScreen”会将您重定向到MainActivity跨度>

标签: android android-fragments fragment onbackpressed


【解决方案1】:

请使用这个。

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();

【讨论】:

  • 不适合我!
  • 你能检查一下 super.onBackPressed() 被使用了多少次@rishikesh_07?
【解决方案2】:

如果您的 Launcher Screen 是 Login 然后使用 finishAffinity() 方法将完成当前活动和所有父活动,但它仅适用于 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】:

    Bottom_nav.this.finish(); 上实际发生了什么?如果不是完成活动语句,我们试试看:

    @Override
    public void onBackPressed() {
        if (doubleBackToExitPressedOnce && (!isFinishing() || !isDestroyed())) {
            finish();
            //super.onBackPressed();
            Bottom_nav.this.finish();
            return;
        }
        //...
    }
    

    【讨论】:

      【解决方案4】:

      检查SupportFragmentManager 的后台堆栈的状态可能更常见:

      @Override
      public void onBackPressed() {
          if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
              getSupportFragmentManager().popBackStack();
          } else {
      
              /* only consider those clicks when there is no stack left */
          }
      }
      

      否则您的自定义功能会扰乱SupportFragmentManager 的行为。

      【讨论】:

      • @HamedNabizadeh 您了解后退堆栈如何处理后退点击吗?在没有确认的情况下完成一项活动是相当糟糕的,并且可能会产生不良行为。
      • @HamedNabizadeh 试试这两个版本;双击立即退出是糟糕的设计。这可能对单个片段有意义,但在拥有更多片段时则不然。
      • 我赞成,用户需要更改片段交易。当他按下后,他需要设置 `fragmentTransaction.addToBackStack(null);` 如果他没有通过你的代码。
      猜你喜欢
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多