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