web-dev-qa-db-ja.com

フラグメントからツールバーを取得する方法?

私はActionBarActivityNavigationDrawerを持ち、ActionBarとしてsupport_v7 Toolbarを使用します。私のフラグメントの1つでは、ツールバーにカスタムビューがあります。他のフラグメントではToolbarはタイトルを表示します。

フラグメントからカスタマイズするためのToolbarインスタンスを取得する方法getActivity().getActionBar()でActionBarを取得できますが、このインスタンスのActionBarに対してsetTitle()を呼び出しても何もしません。

PD:

私の場合

((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();

(MrEngineer13が言ったように)私はonHiddenChanged()からそれを呼ぶので最初のフラグメント作成では働きません。今私はonCreateView()にもう一つ追加して、それはうまく機能します。

96
anisart

まずgetActivity()からAppCompatActivityにアクティビティをキャストする必要があります。これが例です:

((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();

キャストする必要があるのは、getActivity()FragmentActivityを返し、AppCompatActivityが必要だからです。

176
MrEngineer13

フラグメントに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;
            }
        });
73
Flinbor

ツールバーを細かく分割する方法は2つあります。

最初の1つ

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

そして二番目のもの

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;
40
Bhargav Thanki
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
8
Danial

Kotlinユーザーの場合(activity as AppCompatActivity).supportActionBar!!.show()

2
Muhamed Riyas M

あなたのActivityクラスでこれのためのメソッドを作成することができます:

public void setToolbarTitle(String title) {
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setTitle(title);
}

そして、あなたはこのように使うことができます:

setToolbarTitle("Hello World");
1
Mete

あなたがsupport_v7を使っているなら、おそらくgetActivity().getSupportActionBar().setTitle()を試す必要があります。

1
Wang

フラグメントから(フラグメントからツールバーを取得しますか?)

// 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();
1
LOG_TAG

この手順を使用してそれを行いました。

  1. メインフラグメントのonCreateViewで以下のコードを使用してタイトルを設定します。
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");

  1. フラグメント間のスワップには、フラグメントの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;
    }
    
0
Deepak Kaushik