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 つを非表示にします。コンテナなしでフラグメントを追加するオプションがありますが、それがどのように機能するのかわかりません。

それで、何かアイデアはありますか?

4

3 に答える 3

10

これを試してください。これにより、フラグメントビューの r-creating 問題が解決されます。

 @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

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 に答える