Приложение onBackPressed () не закрывается - PullRequest
0 голосов
/ 19 ноября 2018

У меня 3 действия: 1-й - вход в систему. 2-й - регистрация. 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

где я иду не так?я не нашел соответствующих ответов на этот вопрос

Ответы [ 4 ]

0 голосов
/ 19 ноября 2018

если у вас в качестве экрана запуска есть логин, используйте метод 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();
0 голосов
/ 19 ноября 2018

Что на самом деле происходит на Bottom_nav.this.finish();?Если это не законченное заявление об активности, давайте попробуем его:

@Override
public void onBackPressed() {
    if (doubleBackToExitPressedOnce && (!isFinishing() || !isDestroyed())) {
        finish();
        //super.onBackPressed();
        Bottom_nav.this.finish();
        return;
    }
    //...
}
0 голосов
/ 19 ноября 2018

Пожалуйста, используйте это.

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();
0 голосов
/ 19 ноября 2018

может быть более распространено проверить состояние backstack SupportFragmentManager:

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
        getSupportFragmentManager().popBackStack();
    } else {

        /* only consider those clicks when there is no stack left */
    }
}

иначе ваши пользовательские функции будут портить поведение SupportFragmentManager.

...