7

所以这是我的代码。'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();
    }

一切看起来都很棒,但是正在为所有片段(onCreateView() 和 onViewCreated())重新创建视图。我希望附加和分离会起作用,但事实并非如此。我想保持视图的原因是用户的选择在他们导航回来时仍然存在。

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

那么,有什么想法吗?

4

3 回答 3

10

试试这个,这将解决您的片段视图创建问题;

 @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 
}
于 2014-06-30T06:00:59.477 回答
1

在这里。

所以我在这里一起破解了一些东西,我想知道这是否是个好主意。我有一个片段持有一个视图。视图包含我想要保存的所有内容(当然,在短期内 - 这不应该比 RAM 更持久)。当 Fragment 调用 onCreateView() 时,我只需返回已经创建的视图。

现在,我遇到了片段管理器没有删除视图的问题。我在 onPause() 中添加了一个调用,以确保它已从父级中删除。

一切似乎都很好,但我想确保我没有做坏事。我知道 Android 真的很想自己管理它的视图生命周期,但我不希望它每次都重新创建它们。它们很复杂,我不想处理重新初始化所有子视图文本/图像/状态。我在尝试运行 Android 的正常操作过程时会遇到问题吗?

编辑:忘记代码:

public class OutdoorResetFragment extends Fragment
{
private OutdoorResetView view;

public OutdoorResetFragment()
{

}

public void onAttach(Activity activity)
{
    if (view == null || view.getContext() != activity)
    {
        view = new OutdoorResetView(activity);
    }

    super.onAttach(activity);
}

public void onPause()
{
    super.onPause();

    ViewGroup container = (ViewGroup) view.getParent();

    if (container != null)
    {
        container.removeAllViews();
    }
}

@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
        final Bundle savedInstanceState)
{
    return view;
}

public OutdoorResetView getView()
{
    return view;
}
}
于 2014-01-14T17:02:48.043 回答
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");
}

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

然而,它不会永远拯救他们!如果您需要更多持久存储,请查看其他选项,例如保存到 sqlite 数据库。

于 2014-01-14T02:20:29.173 回答