Próbuję podążać za przykładem wiązania danych z oficjalnego dokumentu Google https://developer.android.com/tools/data-binding/guide.html
poza tym, że próbuję zastosować przetwarzanie danych do fragmentu, a nie działania.
błąd, który obecnie pojawia się podczas kompilacji
Error:(37, 27) No resource type specified (at 'text' with value '@{marsdata.martianSols}.
onCreate
fragment wygląda następująco:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MartianDataBinding binding = MartianDataBinding.inflate(getActivity().getLayoutInflater());
binding.setMarsdata(this);
}
onCreateView
fragment wygląda następująco:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.martian_data, container, false);
}
a części mojego pliku układu dla fragmentu wyglądają tak:
<?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>
podejrzewam, że MartianDataBinding
nie wie, z którym plikiem układu ma być związany - stąd błąd. Jakieś sugestie?
źródło
View view = binding.getRoot();
Utknąłem w tym tak długo, że jestem uzasadniony dość zdenerwowany, że nie mogłem znaleźć dokumentacji na developer.android.com ... Rozwiązałem problem. Dziękuję Ci!W rzeczywistości zachęca się do korzystania z
inflate
metody wygenerowanego powiązania, a nie DataBindingUtil:Dokumenty dla DataBindingUtil.inflate () :
źródło
cannot be resolved to a type
błędu kompilacji. Moim zdaniem nie jest to wiarygodne. Jeśli najpierw przejdę do,DataBindingUtil.inflate(inflater, R.layout.fragment_camera, container, false);
a następnie zmienię naFragmentCameraBinding.inflate(inflater, container, false);
, działa, ale po przebudowaniu ponownie wyświetla błąd.DataBindingUtil.inflate
MainFragmentBinding
klasy. Ta klasa jest generowana z pliku układu, więc żądany układ jest automatycznie stosowany.Nawet inne odpowiedzi mogą działać dobrze, ale chcę powiedzieć najlepsze podejście.
Używaj
Binding class's inflate
zgodnie z zaleceniami w Dokumentacji Androida .Jedną z opcji jest nadmuchanie,
DataBindingUtil
ale gdy tylko nie wiesz, wygenerowałeś klasę wiążącą .- Masz wygenerowane automatycznie
binding class
, użyj tej klasy zamiast używaćDataBindingUtil
.W Javie
W Kotlinie
W dokumentacji klasy DataBindingUtil można zobaczyć.
Jeśli twoja klasa binowania układu nie jest generowana @ Zobacz tę odpowiedź .
źródło
inflate
metody, która bierzeLayoutInflater
za swój jedyny argument?ViewGroup container
?container
jest potrzebna, kiedyattachToRoot
jesttrue
.Jeśli korzystasz z ViewModel i LiveData Jest to wystarczająca składnia
Składnia Kotlina:
źródło
Wypróbuj to w Android DataBinding
źródło
Można po prostu pobrać obiekt widoku, jak wspomniano poniżej
źródło
Składnia Kotlina:
źródło
Tak jak większość powiedziała, ale nie zapomnij ustawić LifeCycleOwner
Sample w Javie tj
źródło
pracuje w moim kodzie.
źródło
Kompletny przykład fragmentów powiązania danych
FragmentMyProgramsBinding to klasa wiązania generowana dla res / layout / fragment_my_programów
źródło
Bardzo pomocny blog o wiązaniu danych: https://link.medium.com/HQY2VizKO1
Zadeklaruj wartość wiązania w następujący sposób we fragmencie:
Nie zapomnij napisać tego we fragmentach
źródło
Kolejny przykład w Kotlinie:
Pamiętaj, że nazwa „MartianDataBinding” zależy od nazwy pliku układu. Jeśli plik ma nazwę „martian_data”, poprawna nazwa to MartianDataBinding.
źródło
Wszyscy mówią o
inflate()
, ale co, jeśli chcemy to wykorzystaćonViewCreated()
?Można użyć
bind(view)
metody konkretnej klasy wiązania, aby uzyskaćViewDataBinding
instancję dla klasyview
.Zwykle piszemy BaseFragment coś takiego (uproszczonego):
I użyj go we fragmencie potomnym.
Jeśli wszystkie fragmenty używają powiązania danych, możesz nawet uprościć to, używając parametru type.
Nie wiem, czy można twierdzić, że nie ma tu wartości zerowej, ale ... masz pomysł. Jeśli chcesz mieć wartość zerową, możesz to zrobić.
źródło