Android 使用数组列表进行片段导航

Android 使用数组列表进行片段导航,android,android-fragments,Android,Android Fragments,我使用数组列表创建了自己的片段导航实现。一切正常,我可以用这个来维护导航历史。然而,我不确定这是否是一个好主意,甚至它是否非常有效。我希望有人能检查一下这个代码,给我任何反馈。我们会非常感激的 我的所有片段都扩展了BaseFragment。片段要添加到哪个arraylist是基于我在Constants类中保留的单独标记的 如果有人想要完整的代码,也可以使用git回购: 主要活动: public class MainActivity extends AppCompatActivity {

我使用数组列表创建了自己的片段导航实现。一切正常,我可以用这个来维护导航历史。然而,我不确定这是否是一个好主意,甚至它是否非常有效。我希望有人能检查一下这个代码,给我任何反馈。我们会非常感激的

我的所有片段都扩展了BaseFragment。片段要添加到哪个arraylist是基于我在Constants类中保留的单独标记的

如果有人想要完整的代码,也可以使用git回购:

主要活动:

public class MainActivity extends AppCompatActivity {

    public final int mContainerId = R.id.frame_container;

    ActivityMainBinding binding;

    private MyFragmentNavigation fragmentNavigation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        fragmentNavigation = new MyFragmentNavigation(getSupportFragmentManager(), mContainerId);

        initBottomViewNavigation();
    }

    public MyFragmentNavigation getFragmentNavigation() {
        return fragmentNavigation;
    }

    private void initBottomViewNavigation () {

        Bundle b = new Bundle();
        b.putInt(Constants.TAG_KEY, Constants.HOME_TAG);
        HomeFragment newFragment = new HomeFragment();
        newFragment.setArguments(b);
        fragmentNavigation.gotoNewFragment(Constants.HOME_TAG, newFragment);

        binding.navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {

                if (menuItem.getItemId() == R.id.navigation_home) {

                    if(fragmentNavigation.getNavigationCount(Constants.HOME_TAG) > 0) {
                        fragmentNavigation.gotoFragment(Constants.HOME_TAG);
                    }

                    return true;
                } else if (menuItem.getItemId() == R.id.navigation_list) {

                    if(fragmentNavigation.getNavigationCount(Constants.LIST_TAG) > 0) {
                        fragmentNavigation.gotoFragment(Constants.LIST_TAG);
                    } else {
                        Bundle b = new Bundle();
                        b.putInt(Constants.TAG_KEY, Constants.LIST_TAG);
                        ListFragment newFragment = new ListFragment();
                        newFragment.setArguments(b);
                        fragmentNavigation.gotoNewFragment(Constants.LIST_TAG, newFragment);
                    }

                    return true;
                } else if (menuItem.getItemId() == R.id.navigation_random) {

                    if(fragmentNavigation.getNavigationCount(Constants.RANDOM_TAG) > 0) {
                        fragmentNavigation.gotoFragment(Constants.RANDOM_TAG);
                    } else {
                        Bundle b = new Bundle();
                        b.putInt(Constants.TAG_KEY, Constants.RANDOM_TAG);
                        RandomFragment newFragment = new RandomFragment();
                        newFragment.setArguments(b);
                        fragmentNavigation.gotoNewFragment(Constants.RANDOM_TAG, newFragment);
                    }

                    return true;
                } else if (menuItem.getItemId() == R.id.navigation_options) {

                    if(fragmentNavigation.getNavigationCount(Constants.OPTIONS_TAG) > 0) {
                        fragmentNavigation.gotoFragment(Constants.OPTIONS_TAG);
                    } else {
                        Bundle b = new Bundle();
                        b.putInt(Constants.TAG_KEY, Constants.OPTIONS_TAG);
                        OptionsFragment newFragment = new OptionsFragment();
                        newFragment.setArguments(b);
                        fragmentNavigation.gotoNewFragment(Constants.OPTIONS_TAG, newFragment);
                    }

                    return true;
                } else {
                    return false;
                }
            }
        });
    }

    public void showBackButton() {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    public void hideBackButton() {
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        getSupportActionBar().setDisplayShowHomeEnabled(false);
    }

    @Override
    public void onBackPressed()
    {

        if(fragmentNavigation.getNavigationCount(Constants.HOME_TAG) < 2 &&
                fragmentNavigation.getNavigationCount(Constants.LIST_TAG) < 2 &&
                fragmentNavigation.getNavigationCount(Constants.RANDOM_TAG) < 2 &&
                fragmentNavigation.getNavigationCount(Constants.OPTIONS_TAG) < 2) {

            super.onBackPressed();
        } else {
            BaseFragment fragment = (BaseFragment) getSupportFragmentManager().getFragments().get(0);

            if(fragmentNavigation.getNavigationCount(fragment.getFragmentTag()) > 1) {
                fragmentNavigation.goBack(fragment.getFragmentTag());
            }
        }
    }
} 
常数:

    public static final String TAG_KEY = "this_is_the_tag_key";

    public static final int HOME_TAG = 0;
    public static final int LIST_TAG = 1;
    public static final int RANDOM_TAG = 2;
    public static final int OPTIONS_TAG = 3;

创建片段历史记录有一个更简单的解决方案:
.addToBackStack(“您的标签”)
on FragmentTransaction。返回导航
getFragmentManager().popBackStack()
。是的,但我不知道如何像instagram那样为底部视图导航中的每个项目保留单独的历史记录
public abstract class BaseFragment extends Fragment {

    private int tag = -1;

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        tag = getArguments().getInt(Constants.TAG_KEY);
    }

    public int getFragmentTag() {
        return tag;
    }

    int getNavigationCount() {
        return ((MainActivity) getActivity()).getFragmentNavigation().getNavigationCount(tag);
    }

    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);

        if(((MainActivity) getActivity()).getFragmentNavigation().getNavigationCount(tag) > 1) {
            ((MainActivity) getActivity()).showBackButton();
        } else {
            ((MainActivity) getActivity()).hideBackButton();
        }
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

        Log.d("homebutton", "onOptionsItemSelected: " + tag);


        if(item.getItemId() == android.R.id.home) {
            ((MainActivity) getActivity()).getFragmentNavigation().goBack(tag);
        }

        return super.onOptionsItemSelected(item);
    }

}
    public static final String TAG_KEY = "this_is_the_tag_key";

    public static final int HOME_TAG = 0;
    public static final int LIST_TAG = 1;
    public static final int RANDOM_TAG = 2;
    public static final int OPTIONS_TAG = 3;