Подтвердить что ты не робот

Передвижной ящик, обращаясь к кнопке "Назад", чтобы перейти к предыдущим фрагментам?

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

Итак, когда приложение запускается, вы видите, что Fragment1 запущен. Затем они могут щелкнуть по фрагменту 2-5, чтобы перейти на другие страницы. На всех этих страницах я хочу, чтобы кнопка "Назад" вернула пользователя в Fragment1. Единственным местом, где пользователь может выйти из приложения через кнопку "Назад" , является Fragment1.

SInce все обрабатывается функцией FragmentActivity, с которой я пытался возиться с подставкой. Тем не менее, я продолжаю получать силовую ошибку:

(01-11 14:09:33.114: E/AndroidRuntime(8292): android.view.InflateException: Binary XML file line #7: Error inflating class fragment)

Это то, что у меня есть до сих пор:

Я обязательно добавил фрагменты в задний стек следующим образом:

fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();

Кнопка "Назад" :

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().findFragmentByTag("fragBack") != null) {

    }
    else {
        super.onBackPressed();
        return;
    }
    if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
        Toast.makeText(getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
        Fragment frag = getSupportFragmentManager().findFragmentByTag("fragBack");
        FragmentTransaction transac = getSupportFragmentManager().beginTransaction().remove(frag);
                transac.commit();
    }

}

Кто-нибудь знает, что мне нужно делать? Нужно ли мнезывать onBackPressed в каждом фрагменте (если это возможно), а не в FragmentActivity, который управляет ящиком? В моих предыдущих приложениях я был в порядке с кнопкой "Назад" , закрывающей приложение, независимо от того, какой фрагмент пользователь включен, но тот, который я сейчас делаю, хочу, чтобы кнопка возврата вернулась к фрагменту.

Поблагодарили бы за помощь, спасибо.

onItemClick

@Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            Fragment newFragment = new MapsPage();
            FragmentManager fm = getSupportFragmentManager();
            switch(i) {
            case 0:
                newFragment = new Fragment2();
                break;
            case 1:
                newFragment = new Fragment3();
                break;
            case 2:
                newFragment = new Fragment4();
                break;
            case 3:
                newFragment = new Fragment5();
                break;
            }
            fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragback").commit();
            drawerLayout.closeDrawer(rl);
        }
4b9b3361

Ответ 1

Вместо:

fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();

Вызов:

fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();

addToBackStack работает с add.

replace функция удаляет предыдущий фрагмент и помещает новый фрагмент, поэтому на вашем back-stack остается только один фрагмент. Поэтому используйте функцию добавления, чтобы сохранить предыдущие фрагменты в стеке.

Чтобы всегда перейти fragemnt1 из любого фрагмента onBackPress, попробуйте сделать следующее:

getFragmentManager().popBackStack();
fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();

это приведет к удалению последней транзакции из backstack и добавлению новой. Попробуйте это.

Ответ 2

Просто хотел сообщить о моих выводах, хотя этот вопрос немного устарел для всех, у кого может быть такая же проблема с принятым ответом. Для меня, используя метод, предложенный в принятом ответе, слои перекрываются, что делает их нечитаемыми. Код ниже (адаптированный из принятого ответа) позволяет избежать наложения, но при этом добавляет экран в задний стек.

fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack("fragBack").commit();

Надеюсь, это поможет кому-то!

Ответ 3

В некоторых случаях вам нужно использовать замену, тогда вы не можете работать с addtobackstack(), чтобы использовать этот код в mainActivity. в этом коде, когда вы нажимаете клавишу "назад", вы всегда переходите к первому фрагменту (я называю его HomeFragment), а когда вы находитесь в Home Fragment, он дважды спрашивает, чтобы выйти из приложения (извините за мой плохой английский).

 private Boolean exit = false;
@Override
    public void onBackPressed() {
        if (exit) {
            super.onBackPressed();
            return;
        }

    try {
        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentByTag("HOME");
        if (fragment != null) {
            if (fragment.isVisible()) {
                this.exit = true;
                Toast.makeText(this, "Press Back again to Exit", Toast.LENGTH_SHORT).show();
            }
        }
        else {
            fragment = HomeFragment.class.newInstance();
            getFragmentManager().popBackStack();
            fragmentManager.beginTransaction().replace(R.id.flContent, fragment, "HOME").commit();
        }
    } catch (Exception e) {

    }
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            exit = false;
        }
    }, 2000);
}

Ответ 4

 - @Override
       public void onBackPressed() {
           DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
           int backstack = getSupportFragmentManager().getBackStackEntryCount();
           if (drawer.isDrawerOpen(GravityCompat.START)) {
               drawer.closeDrawer(GravityCompat.START);
           } else if (backstack > 0) {
              for (int i = 0; i < backstack; i++) {
                   getSupportFragmentManager().popBackStackImmediate();
            }
       } else {
           this.finish();
        }
    }

Ответ 5

Я бы предложил избегать переопределения onBackPressed(), полностью управляя вашими транзакциями. Это поможет избежать необходимости использовать сумасшедшую логику в будущем.

Для этого сначала нужно установить переменную частного класса, которая позволит инициализировать:

private boolean popNext = false;

Следующий код позволяет нам установить начальную функцию возврата, поместив ее в стек. Каждый раз после этого, когда popNext установлено значение true, мы выставляем начальную транзакцию и нажимаем новую. Таким образом, мы заменяем транзакцию 1 > X транзакцией 1 > Y.

Дополнительные встроенные операторы if имеют дело с выбором исходного элемента, поскольку мы не хотим перейти от 1 > 1. Если это наш начальный случай, мы просто закрываем ящик. Другой случай должен действовать как кнопка "назад", но нам нужно помнить, что нужно установить его так, как будто он возвращается в исходное состояние!

if(popNext){
    if(i == INITIAL_POSITION){
        onBackPressed();
        mDrawerLayout.closeDrawer(mDrawerList);
        popNext = false;
        return;
    }
    getFragmentManager().popBackStackImmediate();
}
else{
    if(i == INITIAL_POSITION){
        mDrawerLayout.closeDrawer(mDrawerList);
        return;
    }
    popNext=true;
}
getFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit();

Примечание: В моем коде используется getFragmentManager() вместо getSupportFragmentManager(), который является нативной функцией, я считаю, что это Honeycomb.