Использование 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);
У меня отлично работает.