74

Activityロードした場所がありListFragment、クリックすると、レベルがドリルダウンされ、新しいタイプのListFragmentが表示され、元のタイプが置き換えられます (showFragment以下の方法を使用)。これはバック スタックに配置されます。

最初に、アクティビティはデフォルトのタイトルをアクション バーに表示します (つまり、アプリケーションの に基づいて自動的に設定されますandroid:label)。

階層内の次のレベルのリストを表示する場合、クリックされた項目の名前がアクション バーのタイトルになる必要があります。

ただし、 を押すBackと、元のデフォルトのタイトルが復元されます。これはFragmentTransaction知っていることではないので、タイトルは復元されません。

について漠然と読んだことFragmentBreadCrumbsがありますが、これにはカスタムビューを使用する必要があるようです。私は ActionBarSherlock を使用していますが、独自のカスタム タイトル ビューを持たないようにしたいと考えています。

これを行う最善の方法は何ですか?定型コードを大量に使用せずに、途中で表示されるタイトルを追跡する必要がないことは可能ですか?


protected void showFragment(Fragment f) {
  FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  ft.replace(R.id.fragment_container, f);
  ft.addToBackStack(null);
  ft.commit();
}
4

11 に答える 11

124

すべてのフラグメントとすべてのアクティビティで、タイトルをこのように変更します。このようにして、アクティブなタイトルは常に正しいものになります:

@Override
public void onResume() {
    super.onResume();
    // Set title
    getActivity().getActionBar()
        .setTitle(R.string.thetitle);
}

フラグメント内で onResume が呼び出されない場合があります。これらのケースのいくつかでは、次を使用できます。

public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser) {
        // Set title
        getActivity().getActionBar()
            .setTitle(R.string.thetitle);
    }
}
于 2012-11-20T12:25:29.807 に答える
28

元の答えはかなり古いので、これも役立つかもしれません。ドキュメントに記載されているlistenerように、ホスティングのバックスタックの変更をリッスンするためにを登録する必要がある場合がありActivityます。

getSupportFragmentManager().addOnBackStackChangedListener(
        new FragmentManager.OnBackStackChangedListener() {
            public void onBackStackChanged() {
                // Update your UI here.
            }
        });

ActionBar次に、からにアクセスせずに、コールバック メソッドで状況を特定し、適切なタイトルを設定しますFragment

は存在Fragmentを知る必要がなく、通常はバックスタックを管理する場所であるため、これはより洗練されたソリューションです。常に、周囲ではなく、それ自体の内容によってのみ考慮されるべきです。ActionBarActivityFragment

ドキュメントのトピックの詳細。

于 2014-04-23T07:55:43.377 に答える
7

ワープジットは正しいです。これにより、デバイスの向きが変更されたときのタイトルの問題も解決されます。また、アクション バーにサポート v7 を使用する場合、次のようにフラグメントからアクション バーを取得できます。

@Override
public void onResume() {
    super.onResume();
    ((ActionBarActivity)getActivity()).getSupportActionBar().setTitle("Home");
}
于 2014-07-10T10:44:04.600 に答える
5

Lee のアプローチと同様のソリューションを使用しますが、代わりにonBackStackChanged()メソッドを置き換えます。

まず、トランザクションをバックスタックに追加するときにフラグメント名を設定します。

getSupportFragmentManager().beginTransaction()
                .replace(R.id.frame_content, fragment)
                .addToBackStack(fragmentTitle)
                .commit();

次に、onBackStackChanged()メソッドをオーバーライドsetTitle()し、最後のバックスタック エントリ名で呼び出します。

@Override
public void onBackStackChanged() {
    int lastBackStackEntryCount = getSupportFragmentManager().getBackStackEntryCount() - 1;
    FragmentManager.BackStackEntry lastBackStackEntry =
            getSupportFragmentManager().getBackStackEntryAt(lastBackStackEntryCount);

    setTitle(lastBackStackEntry.getName());
}
于 2016-09-06T12:53:48.847 に答える
4

Fragments メソッドを使用します。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)

Fragment が出現するたびに呼び出されますが、onResume はそうではありません。

于 2015-04-23T20:49:46.547 に答える
-3

バックプレスでアクションバーのタイトルを更新するには。簡単に言えば

getActivity.setTitle("タイトル")

onCreateView メソッド内。

于 2015-05-28T13:34:19.043 に答える