Как я могу использовать Back Back или получить getChildFragmentManager () с этим конкретным адаптером пейджера, чтобы использовать кнопку Back? - PullRequest
0 голосов
/ 13 октября 2019

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

Я искал решения, и есть немало таких, как использование getChildFragmentManager или back stack. Я просто не знаю, как реализовать это для моего конкретного адаптера пейджера состояний, для которого я следовал учебному пособию по YouTube.

SectionsStatePagerAdapter.java:

public class SectionsStatePagerAdapter extends FragmentStatePagerAdapter {

    private final ArrayList<Fragment> mFragmentList = new ArrayList<>();
    private final ArrayList<String> mFragmentTitleList = new ArrayList<>();

    public SectionsStatePagerAdapter(@NonNull FragmentManager fm, int behavior) {
        super(fm, behavior);
    }

    public SectionsStatePagerAdapter(FragmentManager supportFragmentManager) {
        super(supportFragmentManager);
    }

    public void addFragment(Fragment fragment, String title){
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }



    @NonNull
    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }
}

MainActivity.java:

public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {
    public SectionsStatePagerAdapter mSectionsStatePagerAdapter;
    private ViewPager mViewPager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //Fragment Stuff:
        mSectionsStatePagerAdapter = new SectionsStatePagerAdapter(getSupportFragmentManager());
        mViewPager = findViewById(R.id.container);

        //SetUpPager:
        setupViewPager(mViewPager);

    }


    private void setupViewPager(ViewPager viewPager){
        SectionsStatePagerAdapter adapter = new SectionsStatePagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new MainPageFragment(),"MainPage"); //0
        adapter.addFragment(new CoffeePageFragment(),"CoffeePage"); //1
        adapter.addFragment(new RegularCoffeeFragment(),"RegularCoffeePage"); //2
        viewPager.setAdapter(adapter);
    }


    public void setViewPager(int fragmentNumber){
        mViewPager.setCurrentItem(fragmentNumber);
    }

}

CoffeePageFragment.java:

public class CoffeePageFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.content_coffee_page,container,false);
        btnRegularCoffee = view.findViewById(R.id.regular_coffee_button);


        btnRegularCoffee.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((MainActivity)getActivity()).setViewPager(2);
            }
        });
        return (view);
    }
}

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

1 Ответ

0 голосов
/ 13 октября 2019

В предыдущих версиях реализации AppCompatActivity было достаточно переопределить onBackPressed() в вашей деятельности, более новые версии требуют реализации OnBackPressedCallback, как показано здесь: https://developer.android.com/reference/androidx/activity/OnBackPressedDispatcher.html

public class FormEntryFragment extends Fragment {
     @Override
     public void onAttach(@NonNull Context context) {
         super.onAttach(context);
         OnBackPressedCallback callback = new OnBackPressedCallback(
             true // default to enabled
         ) {
             @Override
             public void handleOnBackPressed() {
                 showAreYouSureDialog();
             }
         };
         requireActivity().getOnBackPressedDispatcher().addCallback(
             this, // LifecycleOwner
             callback);
     }
 }

Тем не менее, все еще можно использовать onBackPressed на уровне Activity.

...