Добавление кнопки назад к фрагменту - PullRequest
0 голосов
/ 07 сентября 2018

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

private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
    = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    Fragment fragment = null;
    switch (item.getItemId()) {
        case R.id.navigation_home:
            fragment = HomeFragment.newInstance();
            break;
        case R.id.navigation_cards:
            fragment = CardsFragment.newInstance();
            break;
        case R.id.navigation_deals:
            fragment = DealsFragment.newInstance();
            break;
        case R.id.navigation_settings:
            fragment = SettingsFragment.newInstance();
            break;
    }
    if (fragment != null) {


        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.content, fragment);
        fragmentTransaction.commit();
    }
    return true;
}
};

Теперь в моем HomeFragment есть RecyclerView, который при выборе элемента открывает новый фрагмент:

   myViewHolder.cardView.setOnClickListener(view -> {
            System.out.println("clicked");

            Fragment fragment = new TargetDetailsFragment();
            FragmentTransaction ft = ((AppCompatActivity) context).getSupportFragmentManager()
                    .beginTransaction();
            ft.replace(R.id.content, fragment).addToBackStack(null);
            ft.commit();





        });

Я хочу добавить кнопку «Назад» к фрагментам TargetDetails, которая возвращает вас на домашнюю страницу при выборе, и я попытался сделать это, внедрив OnBackStackChangedListener в главном действии

@Override
public void onBackStackChanged() {
    shouldDisplayHomeUp();
}

public void shouldDisplayHomeUp(){
    //Enable Up button only  if there are entries in the back stack
    boolean canback = getSupportFragmentManager().getBackStackEntryCount()>0;
    getSupportActionBar().setDisplayHomeAsUpEnabled(canback);
}

@Override
public boolean onSupportNavigateUp() {
    //This method is called when the up button is pressed. Just the pop back stack.
    getSupportFragmentManager().popBackStack();
    return true;
}

}

но проблема в том, что когда я нажимаю на него, он снова перезагружает HomeFragment, но я просто хочу, чтобы он вернулся к сохраненному экземпляру этого фрагмента

Ответы [ 4 ]

0 голосов
/ 07 сентября 2018

Внутри вашего MainActivity

@Override
        public void onBackStackChanged() {
            //shouldDisplayHomeUp();
            Fragment currentFragment = getActivity().getFragmentManager()
                              .findFragmentById(R.id.fragment_container);

          if (currentFragment instanceof TargetDetails) {
                  Log.v(TAG, "your current fragment is TargetDetails");
                  popBackStackImmediate(); //<<<< immediate parent fragment will open,which is your HomeFragement

                 }

        }

Чтобы использовать popBackStackImmediate(), вам необходимо * заменить FragmentA на FragmentB и использовать addToBackstack() до commit().

0 голосов
/ 07 сентября 2018

Здравствуйте @Bolu Okunaiya. Я думаю, вы должны попробовать this , это поможет вам организовать обратный стэк к желаемому фрагменту, не загружая тот же фрагмент снова.

Для прекращения загрузки предыдущего фрагмента вы должны использовать «добавить» вместо «заменить» вашей FragmentTransaction

0 голосов
/ 07 сентября 2018

Вот мой код, который я использовал для ViewPager, идея состоит в том, чтобы увидеть, равен ли номер текущей страницы 0, чем продолжить super.onBackPressed(); в противном случае перейти к предыдущему фрагменту:

@Override
public void onBackPressed() {
    if(vpPager.getCurrentItem()!=0) {
        vpPager.setCurrentItem(vpPager.getCurrentItem()-1, true);
    } else {
        super.onBackPressed();
    }
}
0 голосов
/ 07 сентября 2018

Добавив ниже код в вашей деятельности. Задний стек фрагмента может быть управляемым.

@Override
    public void onBackPressed() {

        int count = getFragmentManager().getBackStackEntryCount();

        if (count == 0) {
            super.onBackPressed();
            //additional code
        } else {
            getFragmentManager().popBackStack();
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...