问题
我想在一个Activity中创建包含2个片段的viewpager。
这些片段具有不同的菜单选项,并且嵌套了一个片段 - 通过单击列表视图项,使用新数据(replace(), addToBackStack()
)打开相同的片段,但是viewpager不能正确替换(当我transaction.replace(R.id.viewpager, new TwoFragment())
时
我使用了这个答案 - https://stackoverflow.com/a/18020219/5576117,但我有不同的菜单选项,以及从Fragment Container中填充的菜单选项。
因此,如果我创建一个新的Fragment(作为容器),我只需将布尔额外isContainer
传递给片段即可。
但是现在活动调用错误的onOptionsItemSelected方法(来自fragment2
的调用,当在viewpager中选择fragment1
)时。
我的代码
MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.addOnPageChangeListener(this);
setupViewPager(viewPager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
viewPager.setOffscreenPageLimit(2);
mAdapter = new MainViewPagerAdapter(getSupportFragmentManager());
TwoFragment fragment = new TwoFragment();
Bundle args = new Bundle(1);
args.putBoolean(TwoFragment.ISCONTAINER_EXTRA, true);
fragment.setArguments(args);
mAdapter.addFragment(fragment, "TAB1");
mAdapter.addFragment(new OneFragment(), "TAB2");
}
OneFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
setHasOptionsMenu(true);
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.menu_one, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// This method not called then this fragment selected in viewpager
return true;
}
TwoFragment:
@Override
public void onCreate(Bundle savedInstanceState) {
Bundle extras = getArguments();
if (extras != null && extras.containsKey(ISCONTAINER_EXTRA)) {
isContainer = extras.getBoolean(ISCONTAINER_EXTRA);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (isContainer) {
setHasOptionsMenu(false);
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.replace(R.id.clRoot, new TwoFragment()).commit();
return inflater.inflate(R.layout.fragment_two, container, false);
}
View view = inflater.inflate(R.layout.fragment_two, container, false);
setHasOptionsMenu(true);
// Other actions
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.menu_two, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// This method called then always
switch (item.getItemId()) {
case android.R.id.home:
getFragmentManager().popBackStack();
break;
case R.id.action_settings:
startActivity(new Intent(getActivity(), SettingsActivity.class));
break;
case R.id.action_exit:
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(homeIntent);
break;
}
return true;
}
问题
如何在不使用第三方库的情况下实现这一目标?
P.S:抱歉我的英语不好。
答案 0 :(得分:1)
如果我确实理解你,你现在唯一的问题是选项菜单没有显示,可能你可以这样做
pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
@Override public void onPageSelected(int position) {
supportInvalidateOptionsMenu();
}
});
每次您在re-invalidate
中选择一个页面时,fragment
菜单都会fragment
,每次通过调用
((getActivity())AppCompatActivity).supportInvalidateOptionsMenu();
时,您都可以这样做
fragment
将使每个替换的$arr = [
'player.name' => 'Joe',
'player.lastName' => 'Snow',
'team.name' => 'Stars',
'team.picture.name' => 'Joe Snow Profile',
'team.picture.file' => 'xxx.jpg'
];
上的菜单无效。
答案 1 :(得分:0)
在这里回答:https://tausiq.wordpress.com/2014/06/06/android-multiple-fragments-stack-in-each-viewpager-tab/(在这种情况下使用了viewpagerindicator库,但它很容易被tablayout取代)。
主要思想:创建根片段,并在此片段中放置您的viewpager,tablayout和其他片段。一切正常。