Я пытаюсь следовать примеру привязки данных из официального документа Google https://developer.android.com/tools/data-binding/guide.html
за исключением того, что я пытаюсь применить привязку данных к фрагменту, а не к деятельности.
ошибка, которую я сейчас получаю при компиляции
Error:(37, 27) No resource type specified (at 'text' with value '@{marsdata.martianSols}.
onCreate
для фрагмента выглядит так:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MartianDataBinding binding = MartianDataBinding.inflate(getActivity().getLayoutInflater());
binding.setMarsdata(this);
}
onCreateView
для фрагмента выглядит так:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.martian_data, container, false);
}
и части моего файла макета для фрагмента выглядят так:
<?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>
Я подозреваю, что MartianDataBinding
не знаю, с каким файлом макета он должен быть связан - отсюда и ошибка. Какие-либо предложения?
источник
View view = binding.getRoot();
Я застрял на этом так долго, что на законных основаниях расстроился, что не смог найти никакой документации по этому поводу на developer.android.com ... Решил проблему. Спасибо!Вам действительно рекомендуется использовать
inflate
метод сгенерированного Binding, а не DataBindingUtil:Документы для DataBindingUtil.inflate () :
источник
cannot be resolved to a type
ошибки при сборке. Это не надежно на мой взгляд. Если я сначала выберу,DataBindingUtil.inflate(inflater, R.layout.fragment_camera, container, false);
а затем изменил его наFragmentCameraBinding.inflate(inflater, container, false);
, он работает, но после перестроения снова выдает ошибку.DataBindingUtil.inflate
MainFragmentBinding
класса. Этот класс создается из файла макета, поэтому автоматически применяется нужный макет.Даже другие ответы могут работать хорошо, но я хочу сказать лучший подход.
Используйте
Binding class's inflate
в соответствии с рекомендациями в документации Android .Один из вариантов - надуть,
DataBindingUtil
но когда только вы не знаете, сгенерирован класс привязки .- Вы создали автоматически
binding class
, используйте этот класс вместо использованияDataBindingUtil
.На яве
В котлине
В документации класса DataBindingUtil вы можете увидеть.
Если ваш класс связывания макета не сгенерирован @ См. Этот ответ .
источник
inflate
метод, который принимает вLayoutInflater
качестве единственного аргумента?ViewGroup container
?container
нужен, когдаattachToRoot
естьtrue
.Если вы используете ViewModel и LiveData Это достаточный синтаксис
Синтаксис Котлина:
источник
Попробуйте это в Android DataBinding
источник
Можно просто получить вид объекта, как указано ниже
источник
Синтаксис Котлина:
источник
Как и многие другие, но не забудьте установить LifeCycleOwner
Sample в Java, т.е.
источник
работает в моем коде.
источник
Полный пример фрагментов привязки данных
FragmentMyProgramsBinding - это класс привязки, созданный для res / layout /gment_my_programs
источник
Очень полезный блог о привязке данных: https://link.medium.com/HQY2VizKO1
Объявите привязку val следующим образом во Fragment:
Не забудьте написать это во фрагменте
источник
Еще один пример в Котлине:
Обратите внимание, что имя «MartianDataBinding» зависит от имени файла макета. Если файл называется «martian_data», то правильное имя будет MartianDataBinding.
источник
Все говорят о
inflate()
, но что, если мы хотим использовать это вonViewCreated()
?Вы можете использовать
bind(view)
метод конкретного связующего класса, чтобы получитьViewDataBinding
экземпляр дляview
.Обычно мы пишем BaseFragment примерно так (упрощенно):
И использовать его в дочернем фрагменте.
Если все фрагменты используют привязку данных, вы даже можете упростить их, используя параметр типа.
Я не знаю, что это нормально утверждать ненулевое значение там, но .. вы поняли идею. Если вы хотите, чтобы это было обнуляемым, вы можете сделать это.
источник