onBack нажал в активности и фрагменте

Ящик навигации с фрагментами. Я разместил один фрагмент по основному виду деятельности. Но если я снова нажму, тот же фрагмент появится снова. Как я могу справиться с этим ?? а во-вторых как реализовать onBackpressed по фрагментам ?? Кто-нибудь может мне помочь?

в onCreate основной деятельности у меня есть

    FragmentTransaction tx = getFragmentManager().beginTransaction();
    tx.replace(R.id.mainFrame, new PlaceOrderFragment());
    tx.commit();

и в задней части этого у меня есть

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

person Prachi Karapurkar    schedule 04.05.2016    source источник


Ответы (4)


Сначала вам нужно добавить фрагмент в задний стек, чтобы мы могли получить его позже в onBackPressed()

Замените свою транзакцию fragmnet этим

FragmentTransaction tx = getFragmentManager().beginTransaction();
tx.replace(R.id.mainFrame, new PlaceOrderFragment());
// HERE WE WILL ADD FRAGMENT TO BACKSTACK SO WE COULD GET BACK TO IT
tx.addToBackStack(null);
tx.commit();

Замени свой onBackPressed на этот

@Override
public void onBackPressed() {
    // CHECKS HOW MANY FRAGMENTS ARE IN THE BACKSTACK
    int count = getFragmentManager().getBackStackEntryCount();

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        if (count == 0) {
                // IF NO FRAGMENT IN THE BACKSTACK CALL
                super.onBackPressed();
            } else {
                // GET THE LAST OPENED FRAGMENT
                getFragmentManager().popBackStack();
            }
    }
}
person Max    schedule 04.05.2016

Вы можете сделать это с помощью интерфейса. Этот интерфейс будет реализован в каждом фрагменте. Вот простой пример:

public interface OnBackPressedListener {
    void onBackPressed();
}

Здесь, если вы реализуете этот интерфейс в своем фрагменте, вы найдете этот метод:

@Override
    public void onBackPressed() {
        getActivity().finish(); // Or Do your specific task

    }

Теперь ваша Activity, которая содержит этот фрагмент, должна использовать обратный вызов onBackPressed(). Напишите приведенный ниже код в этом методе

@Override
    public void onBackPressed() {

        if (YOUR_DRAWER.isDrawerOpen(GravityCompat.START)) {
            YOUR_DRAWER.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer!
            return;
        }

        Fragment fragment=getYourVisibleFragment();
        if(fragment!=null){
            ((OnBackPressedListener)fragment).onBackPressed();
        }else{
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        }
    }

Если вы хотите получить видимый фрагмент, просто используйте этот метод

public <F extends Fragment> F getVisibleFragment() {
        List<Fragment> fragments = getSupportFragmentManager().getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
                if (fragment != null && fragment.isVisible()) {
                    return (F) fragment;
                }
            }
        }
        return null;
    }

Вот и все :)

person Md. Sajedul Karim    schedule 04.05.2016

FragmentTransaction tx = getFragmentManager().beginTransaction();
tx.replace(R.id.mainFrame, new PlaceOrderFragment()).addToBackStack("your tag");
tx.commit();

Переопределите onBackPress () и попробуйте следующий код.

@Override
public void onBackPressed() {

    int count = getFragmentManager().getBackStackEntryCount();

    if (count == 0) {
        super.onBackPressed();
        //your other utility code if needed
    } else {
        getFragmentManager().popBackStack();
    }

}

Надеюсь, это сработает для вас.

person techniqez    schedule 04.05.2016

Замените фрагмент ypu в onCreate идентификатором фрагмента, а затем реализуйте onBackpressed для того же действия и найдите этот фрагмент с идентификатором и проверьте, является ли он видимым или нулевым, а затем выполните операции на его основе. надеюсь, вы это поняли.

person Pratik    schedule 04.05.2016
comment
Зачем это делать, если можно просто добавить в бэкстэк. - person drulabs; 04.05.2016
comment
если у вас есть несколько фрагментов, вам нужно знать, доступен ли фрагмент или нет, шаг за шагом, чтобы вы также могли вернуться к фрагментам - person Pratik; 04.05.2016
comment
Я не думаю, что этот сценарий упоминается в ОП. - person drulabs; 04.05.2016
comment
просто дать знать, как это сделать - person Pratik; 04.05.2016