Saya telah memperbarui aplikasi saya untuk menggunakan pustaka dukungan terbaru (versi 23.0.0), saya menemukan bahwa mereka mencabut fungsi onAttach () dari kelas Fragment.
Dari pada:
onAttach (Activity activity)
Bersalju:
onAttach (Context context)
Karena aplikasi saya menggunakan aktivitas yang diteruskan sebelum penghentian, solusi yang mungkin menurut saya adalah:
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = getActivity();
}
Apakah itu cara yang benar untuk melakukannya?
MEMPERBARUI:
Jika saya menjalankan perangkat dengan API lebih rendah dari 23, onAttach () baru bahkan tidak dipanggil. Saya harap ini bukan yang ingin mereka lakukan!
PEMBARUAN 2:
Masalah telah diselesaikan dengan pembaruan terbaru ke SDK.
Saya telah menguji pada perangkat API 22 saya dan onAttach (Konteks) dipanggil.
Klik di sini untuk mengikuti laporan bug yang saya buka beberapa minggu yang lalu dan jawaban dari orang-orang di Google.
sumber
Context
? Tidakkah Anda memerlukan sebuahActivity
untuk melampirkan dan menampilkan sebuah fragmen? Bagaimana lagi Anda menggunakanContext
parameter?onAttach(Context context)
dapat dipanggil, Anda harus menggunakan perangkat yang memiliki setidaknya API 23 ATAU menggunakan android.support.v4.app.Fragment. Lihat di siniJawaban:
Aktivitas adalah konteks, jadi jika Anda bisa mengecek konteksnya adalah sebuah Aktivitas dan melemparkannya jika perlu.
Pembaruan: Beberapa mengklaim bahwa
Context
penggantian baru tidak pernah dipanggil. Saya telah melakukan beberapa tes dan tidak dapat menemukan skenario di mana ini benar dan menurut kode sumber, seharusnya tidak pernah benar. Dalam semua kasus yang saya diuji, baik pra dan pasca SDK23, baikActivity
danContext
versionAttach
dipanggil. Jika Anda dapat menemukan skenario di mana ini bukan masalahnya, saya sarankan Anda membuat proyek sampel yang menggambarkan masalah dan melaporkannya ke tim Android .Pembaruan 2: Saya hanya pernah menggunakan fragmen Perpustakaan Dukungan Android karena bug diperbaiki lebih cepat di sana. Tampaknya masalah di atas di mana penggantian tidak dipanggil dengan benar hanya terungkap jika Anda menggunakan fragmen kerangka kerja.
sumber
onAttach(Context)
bahkan tampaknya tidak dipanggil.onAttach(context)
tidak dipanggil.Ini adalah perubahan hebat dari Google ... Modifikasi yang disarankan: ganti
onAttach(Activity activity)
denganonAttach(Context context)
aplikasi saya yang mogok pada API lama karenaonAttach(Context context)
tidak akan dipanggil pada fragmen asli.Saya menggunakan fragmen asli (android.app.Fragment) jadi saya harus melakukan yang berikut untuk membuatnya berfungsi lagi di API yang lebih lama (<23).
Inilah yang saya lakukan:
sumber
Jika Anda menggunakan fragmen framework dan versi SDK perangkat lebih rendah dari 23,
OnAttach(Context context)
tidak akan dipanggil.Saya menggunakan fragmen dukungan sebagai gantinya, sehingga penghentian diperbaiki dan
onAttach(Context context)
selalu dipanggil.sumber
Saat ini dari
onAttach
kode Fragmen, tidak jelas apakahContext
aktivitas saat ini: Kode SumberJika Anda akan melihat
getActivity
Anda akan melihat panggilan yang samaJadi Jika Anda ingin memastikan bahwa Anda memperoleh Kegiatan kemudian gunakan
getActivity()
(dionAttach
dalam AndaFragment
) tapi jangan lupa untuk memeriksanull
karena jikamHost
adalahnull
aktivitas Anda akannull
sumber
sumber
Meskipun tampaknya dalam sebagian besar kasus sudah cukup untuk dimiliki
onAttach(Context)
, ada beberapa telepon (yaitu: Xiaomi Redme Note 2) yang tidak dipanggil, sehingga menyebabkan NullPointerExceptions. Jadi untuk berada di sisi aman saya sarankan untuk meninggalkan metode yang sudah usang juga:sumber
Unduh pustaka Dukungan terbaru dengan manajer SDK dan sertakan
di gradle.app dan atur versi kompilasi ke api 23
sumber
Jawaban di bawah ini terkait dengan peringatan penghentian ini yang terjadi dalam tutorial Fragmen di situs web pengembang Android dan mungkin tidak terkait dengan posting di atas.
Saya menggunakan kode ini pada pelajaran tutorial dan itu berhasil.
Saya khawatir aktivitas itu mungkin batal seperti yang dinyatakan oleh dokumentasi.
getActivity
FragmentActivity getActivity () Kembalikan FragmentActivity yang saat ini dikaitkan dengan fragmen ini. Dapat mengembalikan nol jika fragmen dikaitkan dengan Konteks sebagai gantinya.
Tetapi onCreate pada main_activity jelas menunjukkan bahwa fragmen dimuat dan setelah metode ini, pemanggilan aktivitas get dari fragmen akan mengembalikan kelas main_activity.
getSupportFragmentManager (). beginTransaction () .add (R.id.fragment_container, firstFragment) .commit ();
Saya harap saya benar dengan ini. Saya seorang pemula yang absolut.
sumber
Anda mungkin menggunakan
android.support.v4.app.Fragment
. Untuk ini alih-alihonAttach
metode, cukup gunakangetActivity()
untuk mendapatkanFragmentActivity
yang terkait dengan fragmen. Lain Anda bisa menggunakanonAttach(Context context)
metode.sumber
Ini bekerja untuk saya ketika saya memiliki antarmuka 'TopSectionListener', antarmuka aktivitasnya perintah:
sumber