Использование ViewBinding с несколькими макетами

Изменить - решение

При использовании привязки представления для каждого xml создается файл привязки Java. Проблема заключалась в том, что при изменении xml файлы Java не восстанавливались. Итак, когда я добавил тег ID в App_bar_main в activity_main.xml, я получал сообщение об ошибке, в котором говорилось, что он не может найти этот тег не потому, что он ему не нравится, а потому, что он все еще использовал старые файлы Java. Аннулирование кешей и перезапуск не повлияли на эти сгенерированные файлы привязки Java.

Единственный способ восстановить файлы - это удалить их.

С добавленным идентификатором мне просто пришлось вызвать appBarMain, используя его идентификатор, вместо того, чтобы пытаться раздуть его макет.

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
...
    private ActivityMainBinding mActivityMainBinding;
    private AppBarMainBinding mAppBarMainBinding;
...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mActivityMainBinding.getRoot());

        mAppBarMainBinding = mActivityMainBinding.appBarMain;
        setSupportActionBar(mAppBarMainBinding.toolbar);

        mAppBarMainBinding.fabCollapse.fab_collapse.setOnClickListener(view -> {
            Log.d(TAG, "Clicked fab_collapse");
        });
   }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:id="@+id/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</androidx.drawerlayout.widget.DrawerLayout>

Спасибо всем за ваш вклад

Оригинал

Я пытаюсь переключить findViewById вызывает в моем приложении недавно добавленные ViewBinding но у меня проблемы с взаимодействием с другими представлениями, кроме вызываемого setContentView().

Я неправильно раздуваю AppBarMainBinding? или мне что-то еще не хватает?

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
...
    private ActivityMainBinding mActivityMainBinding;
    private AppBarMainBinding mAppBarMainBinding;
...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mActivityMainBinding.getRoot());

        mAppBarMainBinding = AppBarMainBinding.inflate(getLayoutInflater());
        setSupportActionBar(mAppBarMainBinding.toolbar);

        mAppBarMainBinding.fabCollapse.fab_collapse.setOnClickListener(view -> {
            Log.d(TAG, "Clicked fab_collapse");
        });
   }
}

В activity_main.xml содержит <include layout="@layout/app_bar_main" /> и меню

app_bar_main.xml содержит панель инструментов и несколько кнопок действий

В этом случае, если я позвоню setContentView(mActivityMainBinding.getRoot()), в onCreat() основного действия приложение запускает activity_mainмакет и отображает кнопку действия и заполнитель панели инструментов, но ни одна из кнопок не работает. Нажатие на кнопку действия не вызывает ееsetOnClickListener и панель инструментов пуста (не реализует setSupportActionBar(toolbar))

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</androidx.drawerlayout.widget.DrawerLayout>

app_bar_main.xml

<?xml version="1.0" encoding="utf-8"?>

<!-- Min api = 21
        Add: Screen capture  -->

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<com.google.android.material.appbar.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</com.google.android.material.appbar.AppBarLayout>

<include layout="@layout/content_main" />

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/fab_collapsed_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/fab_margin"
    app:layout_dodgeInsetEdges="bottom">

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab_collapse"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:backgroundTint="@android:color/holo_orange_dark"
        app:fabSize="mini"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:srcCompat="@android:drawable/arrow_up_float" />

</androidx.constraintlayout.widget.ConstraintLayout>



</androidx.constraintlayout.widget.ConstraintLayout>


</androidx.coordinatorlayout.widget.CoordinatorLayout>

Благодарность

3 ответа

Решение

Вам нужно только настроить представление содержимого, после чего вы можете получить доступ к панели приложений с помощью mActivityMainBinding.appBarMain.

гораздо проще дать включенному макету идентификатор с привязкой к представлению, поэтому

вместо

      <include layout="@layout/content_main" />

просто используйте

      <include 
 android:id="@+id/contentmain"
layout="@layout/content_main" />

И привязка будет binding.contentmain

Можешь попробовать использовать это

mAppBarMainBinding = DataBindingUtil.setContentView(this, R.layout.your_activity);

У меня отлично работает.

Другие вопросы по тегам