私はActionBarActivity
とNavigationDrawer
を持ち、ActionBarとしてsupport_v7 Toolbar
を使用します。私のフラグメントの1つでは、ツールバーにカスタムビューがあります。他のフラグメントではToolbar
はタイトルを表示します。
フラグメントからカスタマイズするためのToolbar
インスタンスを取得する方法getActivity().getActionBar()
でActionBarを取得できますが、このインスタンスのActionBarに対してsetTitle()
を呼び出しても何もしません。
PD:
私の場合
((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();
(MrEngineer13が言ったように)私はonHiddenChanged()からそれを呼ぶので最初のフラグメント作成では働きません。今私はonCreateView()にもう一つ追加して、それはうまく機能します。
まずgetActivity()
からAppCompatActivity
にアクティビティをキャストする必要があります。これが例です:
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();
キャストする必要があるのは、getActivity()
がFragmentActivity
を返し、AppCompatActivity
が必要だからです。
フラグメントにToolBarのカスタムビューがある場合は、各フラグメントに対して個別にToolBarを実装できます。
toolBarをfragment_layoutに追加します。
<Android.support.v7.widget.Toolbar
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="?attr/colorPrimaryDark"/>
フラグメントでそれを見つける:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
//set toolbar appearance
toolbar.setBackground(R.color.material_blue_grey_800);
//for crate home button
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
メニューリスナーは2つの方法で作成できます。フラグメントのonOptionsItemSelectedをオーバーライドします。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case Android.R.id.home:
getActivity().onBackPressed();
}
return super.onOptionsItemSelected(item);
}
またはonCreateView()で作成するときにツールバーのリスナーを設定します。
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
return false;
}
});
ツールバーを細かく分割する方法は2つあります。
最初の1つ
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
そして二番目のもの
Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
Kotlinユーザーの場合(activity as AppCompatActivity).supportActionBar!!.show()
あなたのActivityクラスでこれのためのメソッドを作成することができます:
public void setToolbarTitle(String title) {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(title);
}
そして、あなたはこのように使うことができます:
setToolbarTitle("Hello World");
あなたがsupport_v7を使っているなら、おそらくgetActivity().getSupportActionBar().setTitle()
を試す必要があります。
フラグメントから(フラグメントからツールバーを取得しますか?)
// get toolbar
((MainAcivity)this.getActivity()).getToolbar(); // getToolbar will be method in Activity that returns Toolbar!! don't use getSupportActionBar for getting toolbar!!
// get action bar
this.getActivity().getSupportActionBar();
これは、ツールバーでスピナーを使用していて、フラグメントからツールバーでスピナーまたはカスタムビューを呼び出すときに非常に便利です。
あなたの活動から:
// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();
この手順を使用してそれを行いました。
onCreateView
で以下のコードを使用してタイトルを設定します。((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");
MainActivity
(Parent Activity)に実装されている下部ナビゲーションバーを使用しています。ボタンやメニュー項目を使用している場合でも、私の場合と同じように、タイトルをonSelectedItemClickListener
から変更できます。public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.menu_dashboard:
getSupportActionBar().setTitle("Dashboard");
fm.beginTransaction().hide(active).show(dashboardFragment).commit();
active = dashboardFragment;
return true;
case R.id.menu_workshop:
getSupportActionBar().setTitle("Workshops");
fm.beginTransaction().hide(active).show(workshopFragment).commit();
active = workshopFragment;
return true;
}
return false;
}