0

コンテナーとナビゲーション ドロワーを備えた単一のアクティビティを含む Android アプリケーションを作成しようとしています。最初は空のコンテナは、次のようにフラグメントをロードViewPagerするタブレイアウト内にあるフラグメントをロードしますFragmentTransaction

public static void replaceFragmentInContainer(FragmentManager fragmentManager, Fragment fragmentToShow,
        boolean addToBackStack)
{
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    if (addToBackStack)
    {
        transaction.addToBackStack(null);
    }
    transaction.replace(R.id.container, fragmentToShow);
    transaction.commit();
}

ActionBarv7 の v7でv4 フラグメントを使用していActionBarActivityます。

ロードされたすべてのフラグメントは、実際の使いやすさを保持する他のフラグメントを含むタブのみをロードするフラグメントです。このようなタブ読み込みフラグメントの例:

public class MainFragment extends TabsFragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        super.onCreateView(inflater, container, savedInstanceState);
        View contentView = inflater.inflate(R.layout.fragment_main, container, false);
        initTabsLayout(savedInstanceState, contentView, R.id.pager);
        addTab("tabspectag1", "", R.drawable.draw1, Fragment1.class, null);
        addTab("tabspectag2", "", R.drawable.draw2, Fragment2.class, null);
        addTab("tabspectag3", "", R.drawable.draw3, Fragment3.class, null);
        return contentView;
    }

私が直面している問題は、バックスタックにあります。フラグメントがバックスタックに追加され、戻るボタンを押すと、アプリは希望どおりに前のフラグメントに戻り、タブのレイアウト自体は表示されますが、何も読み込まれていないようにタブの内容は空ですそのタブ。それが発生した場合、ナビゲーションドロワーでその画面を再度選択したときにのみ、タブのコンテンツをリロードすることができます。

onBackPressedアクティビティでをオーバーライドしようとしました:

@Override
public void onBackPressed()
{
    if (getFragmentManager().getBackStackEntryCount() > 0)
    {
        getFragmentManager().popBackStack();
    } else
    {
        super.onBackPressed();
    }
}

しかし、私が言ったように、前のフラグメントに戻っているようですが、そのフラグメント内のタブはフラグメントを再描画していません。

この問題を解決するにはどうすればよいですか?

バックスタックの元のフラグメントのタブ レイアウトは表示されますが、タブ内のフラグメントは表示されないため、タブのコンテンツを何らかの方法で更新して再描画する必要がある可能性はありますか? そんなことができるとしたら、どうすればいいですか?

4

1 に答える 1

2

コード全体を投稿しませんでしたが、フラグメント内でフラグメントを使用する場合、外側のフラグメントは通常のフラグメント マネージャーではなく childfragmentmanager を使用する必要があることに注意してください。

アクティビティがある場合、Viewpager を持つフラグメントがあり、そのビューページャー内のビューはフラグメントです。これらの外側のフラグメントは、アクティビティ フラグメント マネージャーの代わりに独自の子フラグメント マネージャーを使用する必要があります。

アクティビティは getFragmentManager() を使用して、新しいフラグメントをインスタンス化して表示します。フラグメントは getChildFragmentManager() を使用して、新しい内部フラグメントをインスタンス化して表示します。(フラグメント内のフラグメント)。

常に同じフラグメント マネージャーを使用してトランザクションを処理すると、動作が予測不能になります。

Viewpager には、新しいフラグメントを表示するために FragmentStatePagerAdapter から拡張された TabsAdapter が関連付けられている必要があります (アクティビティの代わりにフラグメントから getChildFragmentManager を使用します)。

于 2015-06-02T13:22:04.550 に答える