【问题标题】:How do I use back stack or get getChildFragmentManager() with this specific pager adapter in order to use the back button?如何使用后退堆栈或使用此特定寻呼机适配器获取 getChildFragmentManager() 以使用后退按钮?
【发布时间】:2019-10-13 15:33:52
【问题描述】:

我正在使用 Fragments 来更改应用程序中的场景,并且遇到了当按下手机后退按钮时应用程序关闭的问题。当按下后退按钮时,我将如何做到这一点,前一个片段打开。

我搜索了解决方案,其中有很多像使用 getChildFragmentManager 或回栈。我只是不知道如何为我的特定状态寻呼机适配器实现它,我遵循了一个 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);
    }
}

总而言之,我该如何做到,当按下设备后退按钮时,它会回到上一个片段?

【问题讨论】:

    标签: java android android-layout


    【解决方案1】:

    在以前版本的 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);
         }
     }
    

    不过,在Activity 级别上使用onBackPressed 可能仍然可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-02
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      相关资源
      最近更新 更多