Saya mencoba mengikuti contoh pengikatan data dari google doc resmi https://developer.android.com/tools/data-binding/guide.html
kecuali bahwa saya mencoba menerapkan pengikatan data ke fragmen, bukan aktivitas.
kesalahan yang saya dapatkan saat kompilasi adalah
Error:(37, 27) No resource type specified (at 'text' with value '@{marsdata.martianSols}.
onCreate
untuk fragmen terlihat seperti ini:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MartianDataBinding binding = MartianDataBinding.inflate(getActivity().getLayoutInflater());
binding.setMarsdata(this);
}
onCreateView
untuk fragmen terlihat seperti ini:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.martian_data, container, false);
}
dan sebagian file tata letak saya untuk fragmen terlihat seperti ini:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="marsdata"
type="uk.co.darkruby.app.myapp.MarsDataProvider" />
</data>
...
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@{marsdata.martianSols}"
/>
</RelativeLayout>
</layout>
kecurigaan saya adalah bahwa MartianDataBinding
tidak tahu file tata letak mana yang seharusnya diikat - maka kesalahannya. Ada saran?
sumber
View view = binding.getRoot();
Saya sudah terjebak dalam hal ini begitu lama sehingga saya secara sah cukup kesal karena saya tidak dapat menemukan dokumentasi tentang hal itu di developer.android.com ... Memecahkan masalah. Terima kasih!Anda sebenarnya didorong untuk menggunakan
inflate
metode Binding yang Anda hasilkan dan bukan DataBindingUtil:Documents untuk DataBindingUtil.inflate () :
sumber
cannot be resolved to a type
kesalahan saat dibangun. Itu tidak bisa diandalkan menurut saya. Jika saya pergi pertama denganDataBindingUtil.inflate(inflater, R.layout.fragment_camera, container, false);
dan kemudian mengubahnyaFragmentCameraBinding.inflate(inflater, container, false);
, itu berfungsi, tetapi setelah membangun kembali itu memberikan kesalahan lagi.DataBindingUtil.inflate
MainFragmentBinding
kelas. Kelas itu dihasilkan dari file tata letak sehingga tata letak yang diinginkan diterapkan secara otomatis.Bahkan jawaban lain mungkin bekerja dengan baik, tetapi saya ingin memberi tahu pendekatan terbaik.
Gunakan
Binding class's inflate
sesuai anjuran dalam Dokumentasi Android .Satu opsi adalah mengembang dengan
DataBindingUtil
tetapi ketika hanya Anda yang tidak tahu telah menghasilkan kelas mengikat .--Anda memiliki hasil otomatis
binding class
, gunakan kelas itu alih-alih menggunakanDataBindingUtil
.Di jawa
Di Kotlin
Dalam dokumentasi kelas DataBindingUtil Anda dapat melihat.
Jika tata letak kelas biniding Anda tidak dibuat @Lihat jawaban ini .
sumber
inflate
metode yang menjadikanLayoutInflater
argumennya sebagai satu-satunya?ViewGroup container
?container
diperlukan saatattachToRoot
initrue
.Jika Anda menggunakan ViewModel dan LiveData Ini adalah sintaks yang memadai
Sintaks Kotlin:
sumber
Coba ini di Android DataBinding
sumber
Seseorang dapat dengan mudah mengambil objek tampilan seperti yang disebutkan di bawah ini
sumber
Sintaks Kotlin:
sumber
Seperti yang dikatakan sebagian besar orang, tetapi jangan lupa untuk mengatur Sampel LifeCycleOwner
di Jawa yaitu
sumber
bekerja di kode saya.
sumber
Contoh lengkap dalam fragmen pengikatan data
FragmentMyProgramsBinding adalah kelas mengikat yang dihasilkan untuk res / layout / fragment_my_programs
sumber
Blog yang sangat membantu tentang Penyatuan Data: https://link.medium.com/HQY2VizKO1
Nyatakan val yang mengikat seperti ini di Fragmen:
Jangan lupa untuk menulis ini dalam fragmen
sumber
Contoh lain di Kotlin:
Perhatikan bahwa nama "MartianDataBinding" tergantung pada nama file tata letak. Jika file tersebut bernama "martian_data" maka nama yang benar adalah MartianDataBinding.
sumber
Semua orang bilang
inflate()
, tapi bagaimana kalau kita ingin menggunakannyaonViewCreated()
?Anda dapat menggunakan
bind(view)
metode kelas penjilidan konkret untuk mendapatkanViewDataBinding
instance untukview
.Biasanya kami menulis BaseFragment seperti ini (disederhanakan):
Dan gunakan dalam fragmen anak.
Jika semua Fragmen menggunakan pengikatan data, Anda bahkan dapat membuatnya lebih mudah menggunakan parameter tipe.
Saya tidak tahu tidak apa-apa untuk menyatakan bukan-nol di sana, tapi .. Anda mengerti. Jika Anda ingin dibatalkan, Anda dapat melakukannya.
sumber