Intereting Posts
Распознавание маркеров на Android (распознавание кубиков Рубика) Как обращаться с МПК между службой и деятельностью (и ее субактивностью)? Развертывание приложений Android Qt 5.1 Град 2.0.0 beta 7 отсутствует Android – notifyDataSetChanged () не работает Обновление Android Studio 2.3: предупреждение: использование несовместимых плагинов для обработки аннотаций: android-apt. Это может привести к неожиданному поведению Файл «elf.h» не найден при компиляции ядра Android для Nexus 7 в Mac OS X Просмотр утечки памяти пейджера с растровыми изображениями и волейболом Проблема с ListView для Android Пользовательский аутентификатор учетной записи. Очистка после удаления учетной записи с устройства Камера для Android: фокус с фиксированным фокусом Разработка на Android-устройстве через беспроводную сеть Как добавить заголовки липких разделов в список? Android: обновление recyclerview с новыми данными Невозможно импортировать facebook-sdk 4.0.1

Как использовать привязку данных с фрагментом

Я пытаюсь следовать примеру привязки данных из официального документа 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 не знает, какой файл макета он должен связывать, – следовательно, ошибка. Какие-либо предложения?

Реализация привязки данных должна быть в методе onCreateView фрагмента, удалять любые привязки данных, которые существуют в вашем методе OnCreate, ваш onCreateView должен выглядеть следующим образом:

 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { MartianDataBinding binding = DataBindingUtil.inflate( inflater, R.layout.martian_data, container, false); View view = binding.getRoot(); //here data must be an instance of the class MarsDataProvider binding.setMarsdata(data); return view; } 

На самом деле вам рекомендуется использовать метод inflate вашего сгенерированного привязки, а не DataBindingUtil:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { MainFragmentBinding binding = MainFragmentBinding.inflate(inflater, container, false); //set variables in Binding return binding.getRoot(); } 

Документы для DataBindingUtil.inflate () :

Используйте эту версию, только если layoutId неизвестен заранее. В противном случае используйте сгенерированный метод надувания Binding, чтобы обеспечить безопасную инфляцию.

Можно просто получить объект просмотра, как указано ниже

 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = DataBindingUtil.inflate(inflater, R.layout.layout_file, container, false).getRoot(); return view; } 

Работая в моем коде.

 private FragmentSampleBinding dataBiding; private SampleListAdapter mAdapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); dataBiding = DataBindingUtil.inflate(inflater, R.layout.fragment_sample, null, false); return mView = dataBiding.getRoot(); } 

Попробуйте это в Android DataBinding

 FragmentMainBinding binding; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false); View rootView = binding.getRoot(); initInstances(savedInstanceState); return rootView; }