Bagaimana cara mendapatkan Toolbar dari fragmen?


107

Saya harus ActionBarActivitydengan NavigationDrawerdan menggunakan support_v7 Toolbarsebagai ActionBar. Di salah satu bilah alat fragmen saya memiliki tampilan khusus. Di fragmen lain Toolbarharus menunjukkan judul.

Bagaimana cara mendapatkan Toolbarcontoh untuk menyesuaikan dari fragmen? Saya bisa mendapatkan ActionBar dengan getActivity().getActionBar(), tetapi jika saya memanggil setTitle()untuk contoh ini ActionBar itu tidak melakukan apa-apa.

UPD:

Dalam kasus saya

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

(seperti yang dikatakan MrEngineer13) tidak berfungsi pada pembuatan fragmen pertama karena saya memanggilnya dari onHiddenChanged (). Sekarang saya menambahkan lebih banyak satu ke onCreateView () dan itu berfungsi dengan baik.


fragmen tidak memiliki aktivitas bilah tindakan / bilah alat
tyczj

(MainAcivity) this.getActivity ()). GetToolbar (); akan menjadi jawaban yang benar !! untuk mendapatkan Toolbar dalam fragmen !!
LOG_TAG

Jawaban:


201

Anda perlu untuk membuang aktivitas Anda dari getActivity()ke AppCompatActivitypertama. Berikut contohnya:

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

Alasan Anda harus melakukan cast adalah karena getActivity()mengembalikan a FragmentActivitydan Anda membutuhkan fileAppCompatActivity

Di Kotlin:

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

8
mendapatkan 'supportActionBar' dan 'toolbar' adalah hal yang sama?
Darpan

@Darpan tidak yakin
Konstantin Konopko

Jika saya menambahkan ini, itu mengubah judul .. Tetapi jika saya kembali ke aktivitas induk, bagaimana cara mengubah judul lagi? Maksud saya, saya memiliki laci navigasi. Laci samping memiliki beberapa fragmen dan aktivitas utama memiliki judulnya sendiri. Ketika saya menetapkan judul aktivitas utama, itu berfungsi dan dalam fragmen, cara yang Anda sebutkan bekerja dengan sempurna. Tapi bagaimana cara mengubah judul aktivitas saat kembali?
Kylo Ren

82

Jika fragmen harus memiliki tampilan kustom ToolBar, Anda dapat mengimplementasikan ToolBar untuk setiap fragmen secara terpisah.

tambahkan ToolBar ke dalam 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"/>

temukan dalam fragmen:

@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);
}

pendengar menu dapat dibuat dengan dua cara: override onOptionsItemSelected di fragmen Anda:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case android.R.id.home:
            getActivity().onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

atau setel listener untuk toolbar saat membuatnya di onCreateView ():

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                return false;
            }
        });

1
Saya hanya ingin memastikan ini dengan cara yang benar? jika kita memuat fragmen yang berbeda dengan toolbar di viewpager + Tablayout atau Pagertabstripe, itu akan mempengaruhi kinerja aplikasi saat menggesek?
LOG_TAG

1
@LOG_TAG Saya memiliki desain laci dengan setiap fragmen menerapkan bilah alat (dan dengan demikian memiliki bilah alat di file tata letaknya) dan kode di atas bekerja dengan baik untuk saya.
MattBoothDev

Terima kasih! Bekerja seperti HEYUL !! :) Btw, lebih baik menimpa Activity induk onOptionsItemSelected()daripada Fragment, untuk menghindari pengulangan kode.
Aditya Naique

@ChadMx tidak, mengapa dia menulis tentang menambahkan toolbar di xml dan seterusnya. Penulis bertanya bagaimana cara mendapatkan toolbar secara terprogram dari fragmen. Jadi stackoverflow.com/a/26998718/4548520 ini adalah jawaban terbaik / benar dan singkat
pengguna25

43

Anda memiliki dua pilihan untuk mendapatkan Toolbar dalam fragmen

Pertama

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

dan yang kedua

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

Tapi apakah ini cara yang benar .. karena kita juga memiliki getSupportedActionBar?
Code_Life

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

2

Untuk pengguna Kotlin (activity as AppCompatActivity).supportActionBar?.show()


!!sepenuhnya dapat dihindari dengan ?dan itu akan menyelamatkan Anda dari kemungkinan kecelakaan
JonZarate

Saya percaya ini lebih baik(activity as? AppCompatActivity)?.supportActionBar?.show()
JonZarate

1

Mungkin Anda harus mencoba getActivity().getSupportActionBar().setTitle()jika Anda menggunakan support_v7.


1

Dari Fragmen Anda: (dapatkan Toolbar dari fragmen?)

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

ini sangat membantu saat Anda menggunakan spinner di Toolbar dan memanggil spinner atau tampilan kustom di Toolbar dari sebuah fragmen!

Dari Aktivitas Anda:

// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();

3
Anda harus memiliki metode dalam aktivitas Anda yang disebut getToolbar () , yang buruk, karena cara komunikasi antara aktivitas dan fragmen tidak harus dilakukan.
Marko

2
ya tidak ada cara lain untuk ini !! banyak libs laci navigasi yang menerapkan gaya ini saja !!! beberapa kali kita perlu mentransmisikan aktivitas karena AppCompatActivity (AppCompatActivity) getActivity () yang merupakan titik nyeri lain !!! semua hal ini benar-benar membunuh waktu pengembang :(
LOG_TAG

1

Dalam 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: Dalam 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

Saya melakukannya dengan menggunakan langkah-langkah ini.

  1. Set Judul menggunakan kode di bawah ini di onCreateViewfragmen utama.
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");
  1. Untuk menukar antar fragmen saya menggunakan bilah navigasi bawah yang diimplementasikan pada MainActivity(Aktivitas Induk) dari fragmen. Bahkan jika Anda menggunakan tombol atau item menu apa pun maka Anda dapat mengubah judul dari onSelectedItemClickListener, seperti yang saya lakukan dalam kasus saya.
    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

jika Anda menggunakan toolbar kustom atau ActionBar dan ingin mendapatkan referensi toolbar / panel tindakan dari Fragmen, Anda harus terlebih dahulu mendapatkan instance Aktivitas Utama dari Metode onCreateView Fragment seperti di bawah ini.

MainActivity activity = (MainActivity) getActivity();

kemudian gunakan aktivitas untuk implementasi lebih lanjut seperti di bawah ini

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

Sebelum memanggil ini, Anda perlu menginisialisasi toolbar kustom Anda di MainActivity seperti di bawah ini.

Set pertama tentukan toolbar publik Anda seperti

public Toolbar toolbar;
public ActionBar actionBar;

dan di Metode onCreate (), tetapkan id toolbar kustom

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

Itu dia. Ini akan berfungsi di Fragmen.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.