繁体   English   中英

Android导航抽屉碎片状态

[英]Android Navigation Drawer Fragment State

我目前正在为我的Android APP使用导航抽屉。 在我的第一个片段中,我有一个使用Facebook的Graph API加载数据的片段。 因此,当我的App首次加载时,它首先转到第一个片段。

第一

然后,我使用导航抽屉点击另一个片段并查看它。

第二片段

最后,我重复使用导航抽屉返回第一个片段并查看它。

第一片段

我面临的问题是,如何选择导航抽屉项目,如何继续使用已创建的片段,而不是重新创建片段。 我切换片段的代码如下所示。

private void displayView(int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new SelectionFragment();
        break;
    case 1:
        fragment = new HomeFragment();
        break;
    case 2:
        fragment = new PhotosFragment();
        break;
    case 3:
        fragment = new CommunityFragment();
        break;
    case 4:
        fragment = new PagesFragment();
        break;
    case 5:
        fragment = new SplashFragment();
        break;
    default:
        break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}

我注意到每次选择选项时,片段确实存在“新”实例。 我如何实现创建片段实例ONCE并重用它的逻辑,这样我就不必一遍又一遍地连续加载片段。

对于遇到同样问题的人,我设法找到了解决方案。

在容器框架中,我将定义我将使用的特定片段视图,如下所示。

具体片段

在每个片段视图中,我将通过“android:name”属性将其与实际片段本身“链接”,如下所示。请注意片段的路径 ,例如在我的例子中它是com.example .confesssionsrp.SelectionFragment

<fragment
    android:id="@+id/selectionFragment"
    android:name="com.example.confessionsrp.SelectionFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在MainActivity(或我们正在查看片段的Activity)中,为每个片段创建变量,如下所示。

变量

然后,在MainActivity的Oncreate (或您的特定活动)中,初始化各种片段,如下所示。

在OnCreate

继续创建一个名为“ ShowFragment ”的新方法,如下所示。

private void showFragment(int fragmentIndex, boolean addToBackStack) {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    for (int i = 0; i < fragments.length; i++) {
        if (i == fragmentIndex) {
            transaction.show(fragments[i]);
            if (Session.getActiveSession().isClosed()) {
                mDrawerLayout
                        .setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            }
        } else {
            transaction.hide(fragments[i]);
        }
    }
    if (addToBackStack) {
        transaction.addToBackStack(null);
    }
    transaction.commit();
}

从那时起,在切换片段时,使用所选片段手动调用“ ShowFragment ”方法,如下所示。

显示片段

完成所有这些操作,每次我们查看时都不会重置片段,因此是答案的解决方案。感谢迄今为止帮助过我的任何人:)!

我使用以下代码:

@Override
public void onNavigationDrawerItemSelected(int position) {

    // update the main content by replacing fragments
    FragmentManager fragmentManager = getFragmentManager();
    if(position==0){// selection of tabs content
        fragmentManager
        .beginTransaction()
        .replace(R.id.container,
                SimulatorFragment.newInstance(position + 1)).commit();
    }else if(position==1){
        fragmentManager
        .beginTransaction()
        .replace(R.id.container,
                HudFragment.newInstance(position + 1)).commit();
    }else if(position==2){
        // Display the fragment as the main content.
        fragmentManager
        .beginTransaction()
        .replace(R.id.container, 
                SettingsBasicFragment.newInstance(position +1)).commit();
    }else{

    }
}

您可以第一次用新实例替换并存储片段,如果它不为null,则替换为存储的片段。

该活动必须实现NavigationDrawerFragment.NavigationDrawerCallbacks

片段构造函数和newInstance方法如下所示:

public final class HudFragment extends Fragment {
/**
 * The fragment argument representing the section number for this
 * fragment.
 */
private static final String ARG_SECTION_NUMBER = "section_number";

/**
 * Returns a new instance of this fragment for the given section number.
 * @param simulation 
 */
public static HudFragment newInstance(int sectionNumber) {  
    HudFragment fragment = new HudFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_SECTION_NUMBER, sectionNumber);
    fragment.setArguments(args);
    return fragment;
}

public HudFragment() {
}

要按代码切换片段,我在NavigationDrawerFragment中使用此方法:

/**
 * Select a different section
 * @param position
 */
public void select(int position){
    selectItem(position);
}

private void selectItem(int position) {
    mCurrentSelectedPosition = position;
    if (mDrawerListView != null) {
        mDrawerListView.setItemChecked(position, true);
    }            
    if (mDrawerLayout != null) {
        mDrawerLayout.closeDrawer(mFragmentContainerView);
    }
    if (mCallbacks != null) {
        mCallbacks.onNavigationDrawerItemSelected(position);
    }
}

第二个选项是从Android SDK提供的navigationDrawer示例开始。 我在创建项目时选择了该活动模板,几乎所有前一个答案的代码都是自动生成的。

如果你想在设备旋转或类似物之后保留片段,那么你需要保留碎片。 如果没有,您只需要在变量中保存片段的新实例,并检查它是否为null以创建新的或使用旧的。

如果有人想要一个不同的方法:你可以在堆栈上找到片段:

// check if this fragment is on the backstack to avoid creating a new one
    Fragment foundFragment =  fragmentManager.findFragmentByTag("unique_fragment_tag");
    if (foundFragment != null) {
          fragmentManager.popBackStackImmediate("unique_fragment_tag", 0);
            return;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM