如何防止片段的onCreateView()被调用?

Mar*_*her 6 android android-framework android-fragments

所以这是我的代码.'currentFragment'只是一个跟踪当前显示内容的字段.这是一个本身就是片段的类(所以我有一个显示片段的片段).

private void selectNavBarItem(NavbarItem v)
{
    Fragment fragmentToUse = null;

    if (v == setpointsNavItem)
    {
        fragmentToUse = setpointsFragment;
    }
    else if (v == rapidSetupNavItem)
    {
        fragmentToUse = rapidSetupFragment;
    }
    else if (v == outdoorResetNavItem)
    {
        fragmentToUse = outdoorResetFragment;
    }
    else if (v == rampDelayNavItem)
    {
        fragmentToUse = rampDelayFragment;
    }

    if (fragmentToUse != null)
    {
        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        if (currentFragment != null)
        {
            ft.detach(currentFragment);
        }

        currentFragment = fragmentToUse;

        if (currentFragment.isDetached())
        {
            ft.attach(currentFragment);
        }
        else
        {
            ft.add(R.id.setup_content_holder, currentFragment);
        }

        ft.addToBackStack(null);
        ft.commit();
    }
Run Code Online (Sandbox Code Playgroud)

一切看起来都很棒,但是为所有片段(onCreateView()和onViewCreated())重新创建了视图.我希望附加和分离可行,但事实并非如此.我想维护视图的原因是当用户导航回来时用户的选择仍然存在.

另一种选择是显示和隐藏,但我不知道如何使这项工作,因为拥有此代码的片段有一个FrameLayout(R.id.setup_content_holder),它包含我想要添加的片段,我不能只是添加四个片段,但隐藏其中三个.有一个选项可以添加一个没有容器的片段,但我不知道它应该如何工作.

那么,有什么想法吗?

Paw*_*ari 9

试试这个,这将解决你的frgment视图创建问题;

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (mFragmentView != null) {
            ((ViewGroup) mFragmentView.getParent()).removeView(mFragmentView);
            return mFragmentView;
        }

        mFragmentView = inflater.inflate(R.layout.home_fragment, container, false);

        ..... // your remaining code 
}
Run Code Online (Sandbox Code Playgroud)

  • 这是Android开发人员通常做的事情吗? (4认同)

小智 1

OnCreateView 方法始终在 Fragment 内调用。

为了解决您所描述的问题,您真正需要做的是保存片段的状态,然后当它返回时,应用程序将恢复您保存的内容。

例如(在相关片段类内):

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceStatePutString("userString", someTextView.getText().toString());
    savedInstanceStatePutInt("userInt", userInt);
    // etc...
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    someTextView.setText(savedInstanceState.getString("userString"));
    userInt = savedInstanceState.getInt("userInt");
}
Run Code Online (Sandbox Code Playgroud)

这应该可以解决您在片段之间跳转时的问题;当片段被推入或拉出堆栈时,应用程序将调用 onSaveInstanceState 和 onRestoreInstanceState。

然而,这并不能永远拯救他们!如果您需要更多持久存储,请考虑其他选项,例如保存到 sqlite 数据库。