web-dev-qa-db-ja.com

Fragment ActionBarCompat内からのgetSupportActionBar

AppCompat/ActionBarCompatサポートライブラリでv7を使用する新しいプロジェクトを開始しています。フラグメント内からgetSupportActionBarを使用する方法を見つけようとしています。フラグメントをホストする私のアクティビティはActionBarActivityを拡張しますが、フラグメントの同様のサポートクラスは表示されません。

フラグメント内から

    public class CrimeFragment extends Fragment {
          //...

          getActivity().getSupportActionBar().setSubtitle(R.string.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment

          //...
    }

それを使用するためのグーグルページ( http://Android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html )には変更はないはずですv4フラグメント用。すべてのgetActivity()呼び出しをActionBarActivityにキャストする必要がありますか?それは貧弱なデザインのようです。

93
Paul

Fragment.onActivityCreated(...)の後、getActivity()からアクセスできる有効なアクティビティがあります。

ActionBarActivityにキャストしてからgetSupportActionBar()を呼び出す必要があります。

((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);

キャストが必要です。貧弱なデザインではなく、下位互換性があります。

誰かがアクティビティとしてcom.Android.support:appcompat-v7:およびAppCompatActivityを使用する場合、これは機能します

((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);
29
Amir

fragment.xmlに、サポートライブラリからToolbarタグを追加します

 <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

では、MyFragmentクラスからどのように制御できますか?どれどれ

onCreateView関数内に以下を追加します

mToolbar = (Toolbar) view.findViewById(R.id.toolbar);
((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);

//add this line if you want to provide Up Navigation but don't forget to to 
//identify parent activity in manifest file
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

items内のツールバーにMyFragmentを追加する場合は、must関数内にこの行を追加しますonCreateView

        setHasOptionsMenu(true);

この行は重要です。忘れた場合、Androidはメニューアイテムを追加しません。

menu/fragment_menu.xmlでそれらを識別すると仮定します

その後、次の関数をオーバーライドします

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fragment_menu, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_1:
            // do stuff
            return true;

        case R.id.action_2:
            // do more stuff
            return true;
    }

    return false;
}

お役に立てれば

5

Pierre-Antoine LaFayetteの回答に対する更新された回答として

ActionBarActivityは非推奨です。代わりにAppCompatActivityを使用してください

((AppCompatActivity)getActivity()).getSupportActionBar();
3
Dasser Basyouni

Kotlinを使用している場合、

(activity as AppCompatActivity).supportActionBar.setSubtitle(R.string.subtitle)
2
GzDevs