【问题标题】:Fragment navigation using activity使用活动的片段导航
【发布时间】:2015-12-26 19:20:23
【问题描述】:

我有一个活动,其中包含一个带有片段的视图寻呼机。我还有一个包含片段的导航抽屉。每当我启动我的应用程序时,在主要活动中,我都会将第一个片段添加到片段管理器中,因此它会在应用程序启动时显示。

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     home = new FragmentHome();

    mainToolbar = (Toolbar) findViewById(R.id.mainActivityToolBar);
    setSupportActionBar(mainToolbar);
    getSupportActionBar().setDisplayShowHomeEnabled(true);

    if(savedInstanceState == null){
        home = new FragmentHome();
        FragmentManager manager = getSupportFragmentManager();
        // changed the back stack here..
        String Tag = "start";
        manager.beginTransaction().add(R.id.layout_container, home, Tag).commit();
        getSupportActionBar().setTitle("Home");
    }

    FragmentNavigationDrawer fragmentNavigationDrawer = (FragmentNavigationDrawer) getSupportFragmentManager().findFragmentById(R.id.fragment_contain_drawer);
    fragmentNavigationDrawer.setUpDrawer(R.id.fragment_contain_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mainToolbar);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    getSupportFragmentManager().putFragment(outState, "fragment", home);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    if(savedInstanceState != null){
        home = getSupportFragmentManager().getFragment(savedInstanceState, "fragment");
    }
}
@Override
public void changeToolBarTitle(String title) {
    getSupportActionBar().setTitle(title);
}

在导航抽屉适配器中,我有一个方法可以获取片段并在需要时显示或添加它们。我无法解决的主要问题是我试图保持第一个片段的状态(其中包含一个带有自定义对象数组列表的回收器视图),同时切换到抽屉中的其他片段并显示它们的内容

public void onNavigationDrawerItemSelected(int position){
    // Add the fragments only once
    if (getFragmentManager().findFragmentByTag(navigationDrawerFragmentsTags[position]) == null)
    {
        fragmentTransaction.add(R.id.layout_container,navigationDrawerFragments[position],navigationDrawerFragmentsTags[position]);
    }

    // Hiding & Showing fragments
    for(int i=0;i<navigationDrawerFragments.length;i++)
    {
        if(i == position)
        {
            fragmentTransaction.show(navigationDrawerFragments[i]);
        }
        else
        {
            // Check if the fragment is added and then hide it
            if (getFragmentManager().findFragmentByTag(navigationDrawerFragmentsTags[i]) != null) {
                fragmentTransaction.hide(navigationDrawerFragments[i]);
            }
        }
    }

    fragmentTransaction.commit();
}

但是添加的第一个片段总是存在于其他层之下,我无法隐藏它。我想保持它的状态,但当我要去另一个片段时也想隐藏它,我需要保留它的内容以在用户返回这个片段时显示列表。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
    itemList = (ListView) v.findViewById(R.id.drawer_list_items);
    adapter = new NavigationDrawerAdapter(getContext(), R.layout.drawer_item_views, addItemsToList());
    itemList.setAdapter(adapter);
    itemList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            onNavigationDrawerItemSelected(position);
            myDrawerLayout.closeDrawers();
        }
    });
    return v;
}

我尝试使用接口,我尝试在 google 中查找,但找不到答案。

//

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    要保持状态,将其添加到 backstack

    而不是添加新片段,只需替换您的片段,即删除旧片段,然后添加新片段。即 fragmentTransaction.replace() 而不是 fragmentTransaction.add()

    【讨论】:

    • 我使用了替换,这有帮助。但是当我切换片段时,第一个片段中的列表不再存在。托管视图寻呼机的片段已添加到后退堆栈,但似乎每次都会重新创建此片段..
    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多