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

В Fragment на задней кнопке нажата Операция пуста

У меня есть Activity и много фрагментов, надутых в одном и том же FrameLayout

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

example: mainActivity > любой фрагмент (кнопка "Назад" ) > активность пуста.

В onCreate:

layout = (FrameLayout)findViewById(R.id.content_frame);
layout.setVisibility(View.GONE);

Когда я начинаю фрагмент:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, profileFragment);
ft.addToBackStack(null);
ft.commit();
layout.setVisibility(View.VISIBLE);

Я полагаю, мне нужно снова сделать видимость frameLayout GONE нажатой, но как это сделать?


Я попробовал onBackPressed и установил layout.setVisibility(View.GONE);, но я не могу вернуться через фрагменты, так как я перехожу непосредственно на главную страницу.

4b9b3361

Ответ 1

Если вы используете более одного фрагмента в активности или даже если у вас есть только один фрагмент, тогда первый фрагмент не должен содержать addToBackStack. Поскольку это позволяет вернуться назад, и до этого фрагмента будет отображаться пустой макет действия.

 // fragmentmaganer.addToBackStack() // dont include this for your first fragment.

Но для другого фрагмента вам нужно определить это иначе, но обратно не будет перемещаться по более раннему экрану (фрагменту), а приложение может завершить работу.

Ответ 2

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    }
    else {
        int fragments = getSupportFragmentManager().getBackStackEntryCount();
        if (fragments == 1) {
            finish();
        } else {
            if (getFragmentManager().getBackStackEntryCount() > 1) {
                getFragmentManager().popBackStack();
            } else {
                super.onBackPressed();
            }
        }
    }
}

Чтобы добавить фрагмент

 getSupportFragmentManager().beginTransaction()
                .replace(R.id.layout_main, dashboardFragment, getString(R.string.title_dashboard))
                .addToBackStack(getString(R.string.title_dashboard))
                .commit();

Ответ 3

Извините за поздний ответ.

Вам не нужно добавлять ft.addToBackStack(null); при добавлении первого фрагмента.

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, profileFragment);
// ft.addToBackStack(null); --remove this line.
ft.commit();
// ... rest of code

Ответ 4

Вы можете переопределить onBackPressed и проверить, есть ли что-либо на задней панели.

@Override
public void onBackPressed() {
    int fragments = getFragmentManager().getBackStackEntryCount();
    if (fragments == 1) { 
        // make layout invisible since last fragment will be removed
    }
    super.onBackPressed();
}

Ответ 5

Если вы хотите отслеживать фрагменты, вы должны переопределить метод onBackPressed, например public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() == 1) { finish(); } else { super.onBackPressed(); } }

Ответ 6

Решение irscomp работает, если вы хотите завершить работу, когда на первом фрагменте нажата кнопка "Назад". Но если вы хотите отслеживать все фрагменты и возвращаться от одного к другому в обратном порядке, вы добавляете все фрагменты в стек:

ft.addToBackStack(null);

а затем добавьте это в конец onCreate(), чтобы избежать пустого экрана при последнем нажатии; вы можете использовать getSupportFragmentManager() или getFragmentManager() в зависимости от вашего API:

FragmentManager fm = getSupportFragmentManager();
    fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if(getSupportFragmentManager().getBackStackEntryCount() == 0) finish();             
        }
});

Заключительные слова: я не предлагаю вам использовать это решение, потому что если вы перейдете от фрагмента 1 к фрагменту 2 и наоборот 10 раз, когда вы нажмете кнопку 10 раз, она сделает это в обратном порядке, который не будет хочу этого.

Ответ 7

В недавнем личном проекте я решил это, не вызывая addToBackStack, если стек пуст.

    // don't add the first fragment to the backstack
    // otherwise, pressing back on that fragment will result in a blank screen
    if (fragmentManager.getFragments() != null) {
        transaction.addToBackStack(tag);
    }

Здесь моя полная реализация:

    String tag = String.valueOf(mCurrentSectionId);
    FragmentManager fragmentManager = mActivity.getSupportFragmentManager();
    Fragment fragment = fragmentManager.findFragmentByTag(tag);

    if (fragment != null) {
        // if the fragment exists then no need to create it, just pop back to it so
        // that repeatedly toggling between fragments doesn't create a giant stack
        fragmentManager.popBackStackImmediate(tag, 0);
    } else {
        // at this point, popping back to that fragment didn't happen
        // So create a new one and then show it
        fragment = createFragmentForSection(mCurrentSectionId);

        FragmentTransaction transaction = fragmentManager.beginTransaction()
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .replace(R.id.main_content, fragment, tag);

        // don't add the first fragment to the backstack
        // otherwise, pressing back on that fragment will result in a blank screen
        if (fragmentManager.getFragments() != null) {
            transaction.addToBackStack(tag);
        }

        transaction.commit();
    }

Ответ 8

Я все еще не мог исправить проблему с помощью getBackStackEntryCount(), и я решил проблему, сделав на главной странице также фрагмент, поэтому в итоге у меня есть активность только с FrameLayout; и все остальные фрагменты, включая главную страницу i, раздуваются в этот макет. Это решило мою проблему.