Intereting Posts
«Не удалось разрешить: com.google.firebase: firebase-core: 9.0.0" Android WebView со встроенным видео с YouTube, полноэкранная кнопка замораживает видео Диспетчер аналитики и управление конфигурацией для пользовательского использования GPS-сервис в Android Программно получать цвета темы Как сохранить изображение как blob в Sqlite и как его получить? Как просмотреть базу данных SQL в режиме отладки Eclipse для Android Android-приложение. Разметка в документе, следующем за корневым элементом, должна быть хорошо сформирована Захват истории просмотров из браузеров Android за последние несколько минут Перезапустить фрагмент внутри действия Как исправить тень на масштабированном плавающем устройстве с поддержкой библиотеки поддержки 23 Стилирование пользовательских представлений Жизненный цикл Android onEnabled () после процесса был убит Как заставить api.ai агент узнать что-то динамически? Как получить модель телефона Android, версию, информацию о sdk?

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

Я пытаюсь следовать примеру привязки данных из официального документа 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; }