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
にキャストする必要がありますか?それは貧弱なデザインのようです。
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);
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;
}
お役に立てれば
Pierre-Antoine LaFayetteの回答に対する更新された回答として
ActionBarActivityは非推奨です。代わりにAppCompatActivity
を使用してください
((AppCompatActivity)getActivity()).getSupportActionBar();
Kotlinを使用している場合、
(activity as AppCompatActivity).supportActionBar.setSubtitle(R.string.subtitle)