具有不同菜单的 viewpager 中的嵌套片段
Nested fragments in viewpager with different menus
问题
我想创建一个包含 2 个片段的 viewpager Activity。
这个片段有不同的菜单选项,一个片段是嵌套的——通过点击列表视图项目,打开带有新数据的相同片段(replace(), addToBackStack()
),但是 viewpager 没有正确替换(当我做 transaction.replace(R.id.viewpager, new TwoFragment())
.
我使用了这个答案 - ,但我有不同的菜单选项,以及从 Fragment Container 扩展的菜单选项。
因此,如果我创建一个新的片段(作为容器),我只需将额外的布尔值 isContainer
传递给片段,这就可以了。
但是现在 activity 调用了错误的 onOptionsItemSelected 方法(从 fragment2
调用,当在 viewpager 中选择时 fragment1
)。
我的代码
主要Activity:
@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");
}
一个片段:
@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;
}
两个片段:
@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:抱歉我的英语不好。
在这里回答:https://tausiq.wordpress.com/2014/06/06/android-multiple-fragments-stack-in-each-viewpager-tab/(在本例中使用了viewpagerindicator库,但它可以很容易地被tablayout替换)。
主要思想:创建根片段,并在该片段中放置您的viewpager、tablayout 和其他片段。一切正常。
如果我确实理解你的话,你唯一的问题是现在没有显示选项菜单,你可能可以这样做
pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
@Override public void onPageSelected(int position) {
supportInvalidateOptionsMenu();
}
});
每次您 fragment
中的一个页面 re-invalidate
时,这将 re-invalidate
菜单,并且您可以在每次通过调用 fragment
替换 fragment
时执行相同的操作
((getActivity())AppCompatActivity).supportInvalidateOptionsMenu();
这将使每次替换后的菜单失效 fragment
。
问题
我想创建一个包含 2 个片段的 viewpager Activity。
这个片段有不同的菜单选项,一个片段是嵌套的——通过点击列表视图项目,打开带有新数据的相同片段(replace(), addToBackStack()
),但是 viewpager 没有正确替换(当我做 transaction.replace(R.id.viewpager, new TwoFragment())
.
我使用了这个答案 - ,但我有不同的菜单选项,以及从 Fragment Container 扩展的菜单选项。
因此,如果我创建一个新的片段(作为容器),我只需将额外的布尔值 isContainer
传递给片段,这就可以了。
但是现在 activity 调用了错误的 onOptionsItemSelected 方法(从 fragment2
调用,当在 viewpager 中选择时 fragment1
)。
我的代码
主要Activity:
@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");
}
一个片段:
@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;
}
两个片段:
@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:抱歉我的英语不好。
在这里回答:https://tausiq.wordpress.com/2014/06/06/android-multiple-fragments-stack-in-each-viewpager-tab/(在本例中使用了viewpagerindicator库,但它可以很容易地被tablayout替换)。
主要思想:创建根片段,并在该片段中放置您的viewpager、tablayout 和其他片段。一切正常。
如果我确实理解你的话,你唯一的问题是现在没有显示选项菜单,你可能可以这样做
pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
@Override public void onPageSelected(int position) {
supportInvalidateOptionsMenu();
}
});
每次您 fragment
中的一个页面 re-invalidate
时,这将 re-invalidate
菜单,并且您可以在每次通过调用 fragment
替换 fragment
时执行相同的操作
((getActivity())AppCompatActivity).supportInvalidateOptionsMenu();
这将使每次替换后的菜单失效 fragment
。