当前位置: 首页 > 知识库问答 >
问题:

具有不同菜单的视图页导航器中的嵌套片段

洪成济
2023-03-14

问题

我想在一个活动中创建带有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的缩写)很抱歉我的英语不好。

共有2个答案

苏凯
2023-03-14

答案:https://tausiq.wordpress.com/2014/06/06/android-multiple-fragments-stack-in-each-viewpager-tab/(在本例中使用了 viewpagerindicator 库,但它可以很容易地被 tablayout 取代)。

主要思想:创建根片段,并在这个片段中放置您的viewpager、tablayout和其他片段。一切正常。

益泰平
2023-03-14

如果我确实理解你可能,你唯一的问题是现在选项菜单没有显示,也许你可以这样做

 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下)内打开另一个片段(子片段)。 我陷入困境的地方:当用户按下后退按钮时,

  • 我正在编写一个应用程序,它有一个导航抽屉,并且使用嵌套片段。导航抽屉几乎是按照Android文档创建的——它可以工作。我希望导航抽屉始终可见,这就是为什么我有一个活动,我只是交换片段。其中一个片段是ViewPager,它又有自己的片段作为页面。 导航是这样分层的: 其中片段是,子片段是它的页面。当我刚从抽屉转到时,所有内容都正常工作,但我不知道如何直接切换到给定页面(嵌套片段)。 处理导航抽屉点击

  • 例如,我想为Acc部门创建“Add Employee”,为IT支持创建“Add Supporter”。 需要根据treeitem的名称显示上下文菜单。

  • 我有一个关于底部导航栏的奇怪问题,虽然我花了大量时间在它上面,但我无法解决。当我以“推荐”的方式(从许多教程中)使用它时,它就是无法导航。 那么,我所说的“推荐”方式是什么意思呢:我有一个单独的acticity,其中有一个名为“MainActivity”的navHostFragment。这个主要活动有一个XML布局文件,我将底部导航栏放在其中。BottomNavigationBar还有一个XML布

  • 我很确定这是一个简单的解决办法,我只是太有经验了,弄不明白。我正在建立一个网站,使用WP,但主页只是一个背景图像与垂直导航菜单。我现在不知道如何使菜单停留在相同的地方,所有的浏览器和窗口。它在我的屏幕上看起来很好,然后我发现导航窗格在我丈夫的显示器上完全不同的地方。我相信它与位置,显示和边距有关,但我越来越迷路,因为我读了这些,我只是想有人告诉我的代码。 该网页见www.sydneyjanebai

  • 请给我解释一下。。。我的,它与同步(比如)。活动只有很少的片段,在不同的片段中,我需要使用不同的模式(一种模式是视差,另一种模式是简单)。因此,我认为我应该在每个框架中用AppBar和内容设置协调布局 但我如何替换“新建”上的最后一个工具栏以保存与抽屉的同步?或者这是错误的方式,我需要做一些其他的?