问题
我想在一个活动中创建带有2个片段的viewpager。这个片段有不同的菜单选项,并且一个片段是嵌套的-通过单击listview项目,打开带有新数据的相同片段(替换(),addToBackStack()
),但是viewpager不能正确替换(当我这样做时transaction.replace(R.id.viewpager,new TwoFraank())
。
我用了这个答案——https://stackoverflow.com/a/18020219/5576117,,但是我有不同的菜单选项,而且菜单选项是从片段容器中膨胀出来的。
因此,如果我创建一个新的片段(作为容器),我只需将布尔型extra isContainer
传递给片段,这样就可以了。但是现在activity调用错误的onOptionsItemSelected方法(从< code>fragment2调用,当在viewpager中选择< code>fragment1)。
我的代码
主要活动:
@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;
}
二碎:
@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;
}
问题
如何在不使用第三方库的情况下完成此操作?
页(page的缩写)很抱歉我的英语不好。
答案: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();
}
});
每当您在<code>片段</code>中选择一个页面时,这将<code>重新使菜单失效,您可以通过调用
((getActivity())AppCompatActivity).supportInvalidateOptionsMenu();
这将使每个替换的片段
上的菜单无效。
我有一个ViewPagerContainer片段,在应用程序启动时加载。ViewPagerContainer片段将两个选项卡(选项卡A和选项卡B)添加到操作栏。选项卡B有两个项目的列表视图。 我所做的:我在选项卡B片段中的列表视图项上附加了一个click listener,这样当用户单击一个项时,它会在第一个片段(即选项卡B下)内打开另一个片段(子片段)。 我陷入困境的地方:当用户按下后退按钮时,
例如,我想为Acc部门创建“Add Employee”,为IT支持创建“Add Supporter”。 需要根据treeitem的名称显示上下文菜单。
我正在编写一个应用程序,它有一个导航抽屉,并且使用嵌套片段。导航抽屉几乎是按照Android文档创建的——它可以工作。我希望导航抽屉始终可见,这就是为什么我有一个活动,我只是交换片段。其中一个片段是ViewPager,它又有自己的片段作为页面。 导航是这样分层的: 其中片段是,子片段是它的页面。当我刚从抽屉转到时,所有内容都正常工作,但我不知道如何直接切换到给定页面(嵌套片段)。 处理导航抽屉点击
我有一个关于底部导航栏的奇怪问题,虽然我花了大量时间在它上面,但我无法解决。当我以“推荐”的方式(从许多教程中)使用它时,它就是无法导航。 那么,我所说的“推荐”方式是什么意思呢:我有一个单独的acticity,其中有一个名为“MainActivity”的navHostFragment。这个主要活动有一个XML布局文件,我将底部导航栏放在其中。BottomNavigationBar还有一个XML布
我很确定这是一个简单的解决办法,我只是太有经验了,弄不明白。我正在建立一个网站,使用WP,但主页只是一个背景图像与垂直导航菜单。我现在不知道如何使菜单停留在相同的地方,所有的浏览器和窗口。它在我的屏幕上看起来很好,然后我发现导航窗格在我丈夫的显示器上完全不同的地方。我相信它与位置,显示和边距有关,但我越来越迷路,因为我读了这些,我只是想有人告诉我的代码。 该网页见www.sydneyjanebai
请给我解释一下。。。我的,它与同步(比如)。活动只有很少的片段,在不同的片段中,我需要使用不同的模式(一种模式是视差,另一种模式是简单)。因此,我认为我应该在每个框架中用AppBar和内容设置协调布局 但我如何替换“新建”上的最后一个工具栏以保存与抽屉的同步?或者这是错误的方式,我需要做一些其他的?