Saya memulai proyek baru yang menggunakan perpustakaan dukungan AppCompat/ActionBarCompat
dalam v7
. Saya mencoba mencari cara untuk menggunakan getSupportActionBar
dari dalam sebuah fragmen. Aktivitas saya yang menghosting fragmen meluas ActionBarActivity
, tetapi saya tidak melihat kelas dukungan serupa untuk Fragmen.
Dari dalam fragmen saya
public class CrimeFragment extends Fragment {
//...
getActivity().getSupportActionBar().setSubtitle(R.string.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment
//...
}
Halaman google untuk menggunakannya ( http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html ) mengatakan seharusnya tidak ada perubahan untuk v4
fragmen. Apakah saya perlu mentransmisikan semua getActivity()
panggilan saya ke ActionBarActivity
? Sepertinya desainnya jelek.
Meskipun pertanyaan ini sudah memiliki jawaban yang diterima, saya harus menunjukkan bahwa itu tidak sepenuhnya benar: menelepon
getSupportActionBar()
dariFragment.onAttach()
akan menyebabkan aNullPointerException
saat aktivitas diputar.Jawaban singkat:
Gunakan
((ActionBarActivity)getActivity()).getSupportActionBar()
dalamonActivityCreated()
(atau titik mana pun setelah itu dalam siklus hidupnya), bukanonAttach()
.Jawaban panjang:
Alasannya adalah jika an
ActionBarActivity
dibuat ulang setelah rotasi, itu akan memulihkan semua Fragmen sebelum benar-benar membuatActionBar
objek.Kode sumber
ActionBarActivity
disupport-v7
perpustakaan:ActionBarActivityDelegate.createDelegate()
membuatmImpl
objek tergantung pada versi Android.super.onCreate()
isFragmentActivity.onCreate()
, yang memulihkan fragmen sebelumnya setelah rotasi (FragmentManagerImpl.dispatchCreate()
, & c).mImpl.onCreate(savedInstanceState)
adalahActionBarActivityDelegate.onCreate()
, yang membacamHasActionBar
variabel dari gaya jendela.mHasActionBar
benar,getSupportActionBar()
akan selalu kembalinull
.Sumber untuk
ActionBarActivityDelegate.getSupportActionBar()
:sumber
ActionBarActivity
sudah ditinggalkan. GunakanAppCompatActivity
sebagai gantinyaJika seseorang menggunakan com.android.support:appcompat-v7: dan AppCompatActivity sebagai aktivitas, ini akan berfungsi
sumber
di
fragment.xml
TambahkanToolbar
Tag dari pustaka dukunganSekarang bagaimana kita bisa mengontrolnya dari
MyFragment
kelas? Ayo lihatonCreateView
fungsi di dalam tambahkan yang berikut inidan jika Anda ingin menambahkan
items
ke toolbar di dalamMyFragment
Andamust
tambahkan baris ini di dalamonCreateView
fungsibaris ini penting, jika Anda lupa, android tidak akan mengisi Item menu Anda.
asumsikan kami mengidentifikasi mereka di
menu/fragment_menu.xml
setelah itu ganti fungsi berikut
semoga ini membantu
sumber
Sebagai jawaban terbaru untuk jawaban Pierre-Antoine LaFayette
ActionBarActivity sudah tidak digunakan lagi; gunakan
AppCompatActivity
sebagai gantinyasumber
Bagi mereka yang menggunakan kotlin,
sumber