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


107

私が持っているActionBarActivityNavigationDrawerし、使用support_v7 Toolbarアクションバーなど。私のフラグメントの1つで、ツールバーにカスタムビューがあります。他のフラグメントToolbarではタイトルを表示する必要があります。

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

UPD:

私の場合

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

(MrEngineer13が言ったように)onHiddenChanged()から呼び出すため、最初のフラグメント作成では機能しません。今、私はonCreateView()にさらに1つ追加し、それは正常に動作します。


フラグメントにはactionbars / toolbarsアクティビティはありません
tyczj

(MainAcivity)this.getActivity())。getToolbar(); 正解になります!! ツールバーを断片化するための!!
LOG_TAG 2015

回答:


201

あなたは、あなたからの活動をキャストする必要があるgetActivity()AppCompatActivity最初の。次に例を示します。

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

キャストしなければならない理由は、getActivity()が返されFragmentActivityAppCompatActivity

コトリンでは:

(activity as AppCompatActivity).supportActionBar?.title = "My Title"

8
「supportActionBar」と「toolbar」を取得することは同じことですか?
ダーパン

@Darpanは不明
Konstantin Konopko

これを追加すると、タイトルが変更されます。しかし、親アクティビティに戻った場合、タイトルを再度変更するにはどうすればよいですか?ナビ引き出しがあります。サイドドロワーにはいくつかのフラグメントがあり、メインアクティビティには独自のタイトルがあります。メインアクティビティのタイトルを設定すると機能し、断片的には、あなたが言及した方法は完璧に機能しました。しかし、戻るときにアクティビティのタイトルをどのように変更すればよいですか?
Kylo Ren 2018

82

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

1
これを正しい方法で確認したいだけですか?viewpager + TablayoutまたはPagertabstripeのツールバーで異なるフラグメントをロードすると、スワイプ中のアプリのパフォーマンスに影響しますか?
LOG_TAG 2015

1
@LOG_TAG私は、各フラグメントがツールバーを実装する(したがって、そのレイアウトファイルにツールバーがある)ドロワーデザインを使用しており、上記のコードがうまく機能しました。
MattBoothDev 2015

ありがとう!HEYULのように働いた!:)ところで、onOptionsItemSelected()コードの繰り返しを避けるために、フラグメントではなく親のアクティビティをオーバーライドすることをお勧めします。
Aditya Naique 2015

@ChadMxいいえ、なぜ彼はxmlへのツールバーの追加などについてさえ書いたのでしょう。著者は、フラグメントからプログラムによってツールバーを取得する方法を尋ねました。したがって、stackoverflow.com /
a

43

ツールバーを断片化するには、2つの選択肢があります

最初の1つ

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

そして二番目

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;

しかし、これは正しい方法ですか?.. bcozにもgetSupportedActionBarがありますか?
Code_Life 2016

9
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);

2

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


!!は完全に回避可能で?あり、クラッシュの可能性を
軽減し

私はこれがより良いと信じています(activity as? AppCompatActivity)?.supportActionBar?.show()
JonZarate

1

getActivity().getSupportActionBar().setTitle()support_v7を使用している場合は、試してみてください。


1

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

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

3
アクティビティとフラグメント間の通信を行う方法ではないため、アクティビティにgetToolbar()というメソッドが必要です。
マルコ2015

2
はい、他に方法はありません!! ナビゲーションドロワーライブラリの多くはこのスタイルのみを実装しています!!! AppCompatActivity(AppCompatActivity)getActivity()が別の問題点であるため、アクティビティをキャストする必要がある場合があります。このすべてのものは
開発

1

XMLで

 <androidx.appcompat.widget.Toolbar
  android:id="@+id/main_toolbar"
  android:layout_width="match_parent"
  android:layout_height="?attr/actionBarSize"
  app:layout_scrollFlags="scroll|enterAlways">
 </androidx.appcompat.widget.Toolbar>

Kotlin:fragment.kt-> onCreateView()

setHasOptionsMenu(true)

val toolbar = view.findViewById<Toolbar>(R.id.main_toolbar)

(activity as? AppCompatActivity)?.setSupportActionBar(toolbar)

(activity as? AppCompatActivity)?.supportActionBar?.show()

-> onCreateOptionsMenu()

   override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
       inflater.inflate(R.menu.app_main_menu,menu)
       super.onCreateOptionsMenu(menu, inflater)
   }

-> onOptionsItemSelected()

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
             R.id.selected_id->{//to_do}
             else -> super.onOptionsItemSelected(item)
        }
    }

0

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

  1. onCreateViewメインフラグメントの以下のコードを使用してタイトルを設定します。
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");
  1. フラグメント間のスワッピングには、フラグメントのMainActivity(親アクティビティ)に実装されている下部のナビゲーションバーを使用しています。ボタンやメニュー項目を使用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

カスタムツールバーまたはActionBarを使用していて、Fragmentsからツールバー/アクションバーの参照を取得する場合は、最初に以下のようにFragmentのonCreateViewメソッドからメインアクティビティのインスタンスを取得する必要があります。

MainActivity activity = (MainActivity) getActivity();

次に、以下のようなさらなる実装のためにアクティビティを使用します

ImageView vRightBtn = activity.toolbar.findViewById(R.id.toolbar_right_btn);

これを呼び出す前に、MainActivityでカスタムツールバーを以下のように初期化する必要があります。

最初のセットは、ツールバーのパブリックを次のように定義します

public Toolbar toolbar;
public ActionBar actionBar;

そしてonCreate()メソッドでカスタムツールバーIDを割り当てます

toolbar = findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();

それでおしまい。フラグメントで動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.