Привязка данных "ошибка: не удается найти классы моделей" - PullRequest
0 голосов
/ 15 ноября 2018

Во-первых, я должен признать явно очень похожий , но не повторяющийся выпуск здесь . Ни одно из предложенных решений в этой теме не работает.

Структура моего приложения выглядит следующим образом:

app
  java
    [mydomain].[myapplication]
      Models
        DataModel.java
      MainActivity.java
  res
    layout
      activity_main.xml
      content_main.xml
      my_inner_layout.xml

Мое приложение build.gradle содержит

dataBinding {
    enabled = true
}

В MainActivity.java У меня

import [mydomain].[myapplication].Models.DataModel;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemsSelectedListener {

    DataModel dataModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ... <other layout creation template code> ...

        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        dataModel = new DataModel();
        binding.setValues(dataModel);
    }

    <navigation and auto-generated methods>
}

Мой my_inner_layout.xml содержит

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="values"
            type="[mydomain].[myapplication].Models.DataModel" />
    </data>
    <android.support.constraint.ConstraintLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible"
        >

        <TextView
            android:id="@+id/intro_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:text="@{values.valueOne}"/>

        <TextView
            android:id="@+id/buying_recommendation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/intro_text"
            app:layout_constraintTop_toBottomOf="@id/intro_text"
            android:text="@{values.valueTwo}"/>
    </android.support.constraint.ConstraintLayout>
</layout>

Я передаю bind:values="@{values}" через активность_основания к его include d app_bar_main к его содержимому_основе к его my_inner_layout с тем же значением <data> в каждом. Android Studio сообщает, что «пространство имен« привязка »не связана».

Если я пытаюсь запустить это, я получаю «Компиляция не удалась; подробности смотрите в выводе ошибки компилятора» Глядя в выходные данные сборки, я вижу:

Java compiler errors when building

В тексте ошибки по-разному error: cannot find symbol class Models и error: package Models does not exist

Если я переместу DataModel.java из пакета Models и сразу в [mydomain]. [Myapplication], тогда я получу другой результат. Он выполняет сборку и запуск в эмуляторе, но большая часть информации о макете не отображается. Нет меню гамбургера в верхнем левом углу, нет текста заголовка в заголовке и нет кнопки настроек в верхнем правом углу, значения которых ранее автоматически включались автоматически созданным кодом в Android Studio. Я также не могу установить заголовок в коде с помощью setTitle.

Смахивание слева приводит к , однако, открывает навигационный ящик.

Я пытался сделать недействительными кэши и перезапустить их, очистить, восстановить как с файлом модели в Моделях, так и отдельно.

Главное, что я хочу - это иметь возможность использовать структуру проекта, которую я хочу. Поместить мои классы моделей в подпакет моделей. Как только это будет завершено, я хочу убедиться, что вся информация о макете будет получена, включая значок меню гамбургера, значок настроек и заголовок. Как мне этого добиться?

Ответы [ 4 ]

0 голосов
/ 04 августа 2019

Просто преобразуйте ваши существующие макеты в макеты привязки данных (не забудьте добавить variable в ваш xml, указав тип деятельности)

Пример:

<variable name="navdrawer" type="com.example.sampleapp.HomeScreenActivity" />

При этом будет создан класс привязки данных для NavigationHeaderView в этом формате (может отличаться) NavHeaderYourActivityName .

При привязке родительской активности вы будетеиспользуйте этот экземпляр привязки, чтобы получить DrawerLayout и ваш NavigationView , соответственно.

Пример кода, чтобы уменьшить шаблон для инициализации представлений в вашем коде:

NavHeaderHomeScreenBinding navHeaderHomeScreenBinding = 
DataBindingUtil.setContentView(this, R.layout.nav_header_home_screen);
AppBarHomeScreenBinding appBarHomeScreenBinding = 
DataBindingUtil.setContentView(this, R.layout.app_bar_home_screen);
ActionBarDrawerToggle toggle = 
new ActionBarDrawerToggle(this, binding.drawerLayout, appBarHomeScreenBinding.toolbar, 
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
binding.drawerLayout.addDrawerListener(toggle);
toggle.syncState();
binding.navView.setNavigationItemSelectedListener(this);

Надеюсь, это кому-нибудь поможет!Спасибо!

0 голосов
/ 15 ноября 2018

Сначала попытайтесь удалить избыточность setContentView(R.layout.activity_main);

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

Второе добавление в конец функции "onCreate"

binding.included.setValues(dataModel);
binding.executePendingBindings();

, если вы используете include, вы можете добавить его в id включениянапример

<include
    android:id="@+id/included"
    layout="@layout/content_main"
    app:values="@{DataModel}"/>

и использовать

binding.included.setValues(dataModel);

исследование об использовании привязки данных с включенными макетами

0 голосов
/ 15 ноября 2018

Хорошо, я понял, откуда взялась вещь "Модели классов не существует". Я не знаю, виновата ли моя собственная глупость или тупо придирчивый способ, которым эта привязка реализована на Android. Пакет должен называться models со строчной буквой "m", а не Models. Обязательный объект автоматического преобразования имен должен был думать, что Models был классом, а не пакетом.

Чтобы исправить макет, метод onCreate должен был быть изменен на

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    dataModel = new DataModel();
    cycleInformationBinding.setRecommendation(dataModel);

    // set toolbar
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    // Drawer layout setting
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

В частности, вещи должны были происходить в следующем порядке:

  1. setContentView к основной деятельности
  2. Настройка привязки модели данных
  3. Компоновка относится к ящику и панели инструментов.

Любой другой порядок может привести к сбою привязки модели или к некорректному отображению панели инструментов.

0 голосов
/ 15 ноября 2018

В вашем XML-файле вы должны добавить полный путь к классу модели, как показано ниже:

<data>
    <variable
        name="values"
        type="[mydomain].[myapplication].Models.DataModel" />
</data>

Проблема : вы не упомянули полный путь к модели в XML.Забыл написать .Model

...