5

编辑 - 解决方案

使用视图绑定时,会为每个 xml 生成一个 Java 绑定文件。问题是当您修改 xml 时,它不会重新生成 Java 文件。因此,当我在 activity_main.xml 中向 App_bar_main 添加一个 ID 标记时,我收到一条错误消息,指出它找不到该标记,不是因为它不喜欢它,而是因为它仍在使用较旧的 Java 文件。使缓存无效并重新启动也不会影响那些生成的 java 绑定文件。

重新生成文件的唯一方法是删除它们。

使用添加的 ID,我只需要使用它的 ID 调用 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())在主 Activity 的 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>

谢谢

4

3 回答 3

3

您只需要设置内容视图,然后您可以通过 mActivityMainBinding.appBarMain 访问 appbar。

于 2019-10-17T21:02:05.400 回答
2

给包含的布局一个带有视图绑定的 id 要容易得多,所以

代替

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

只需使用

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

绑定将是 binding.contentmain

于 2021-07-28T19:41:13.827 回答
0

你能试试用这个吗

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

它对我来说很好。

于 2019-10-17T16:18:27.407 回答