[英]<fragment> tag in XML and Databinding gives inflate exception
我正在处理一个现有项目,该项目使用DrawerLayout
和自定义片段进行侧边导航,但是当我使用数据绑定时,它会在<fragment>
标记处的 XML 文件中给出膨胀异常。 下面是我的代码。
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
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
android:id="@+id/layoutParent"
layout="@layout/activity_parent_list_new" />
<fragment
android:id="@+id/navigation_view"
android:name="com.myApp.home.fragment.NavigationDrawerFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true" />
</androidx.drawerlayout.widget.DrawerLayout>
</layout>
public class HomeActivity extends AppCompatActivity{
private ActivityHomeBinding binding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityHomeBinding.inflate(getLayoutInflater());
mExitToast = Toast.makeText(this, getString(R.string.press_to_exit), Toast.LENGTH_SHORT);
mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_view);
mNavigationDrawerFragment.setupViews();
mNavigationDrawerFragment.setDrawerListener(this);
}
/*Other Code*/
}
Process: com.myApp.debug, PID: 18493
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myApp.debug/com.myApp.home.HomeActivity}: android.view.InflateException: Binary XML file line #27 in com.myApp.debug:layout/activity_home: Binary XML file line #27 in com.myApp.debug:layout/activity_home: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3780)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3942)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:109)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2345)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:233)
at android.os.Looper.loop(Looper.java:344)
at android.app.ActivityThread.main(ActivityThread.java:8212)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
Caused by: android.view.InflateException: Binary XML file line #27 in com.myApp.debug:layout/activity_home: Binary XML file line #27 in com.myApp.debug:layout/activity_home: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #27 in com.myApp.debug:layout/activity_home: Error inflating class fragment
Caused by: java.lang.IllegalArgumentException: Binary XML file line #27: Duplicate id 0x7f0a0682, tag null, or parent id 0x7f0a02e9 with another fragment for com.myApp.home.fragment.NavigationDrawerFragment
at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:117)
at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:295)
at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:274)
at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1078)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1006)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:970)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:1132)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1093)
at android.view.LayoutInflater.inflate(LayoutInflater.java:692)
at android.view.LayoutInflater.inflate(LayoutInflater.java:542)
at androidx.databinding.DataBindingUtil.inflate(DataBindingUtil.java:126)
at androidx.databinding.ViewDataBinding.inflateInternal(ViewDataBinding.java:1409)
at com.myApp.databinding.ActivityHomeBinding.inflate(ActivityHomeBinding.java:72)
at com.myApp.databinding.ActivityHomeBinding.inflate(ActivityHomeBinding.java:58)
at com.myApp.home.HomeActivity.onCreate(HomeActivity.java:118)
at android.app.Activity.performCreate(Activity.java:8129)
at android.app.Activity.performCreate(Activity.java:8109)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1344)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3749)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3942)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:109)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2345)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:233)
PS:代码在没有数据绑定的情况下工作正常,但是当我尝试使用数据绑定时它给出了这个错误。
按照 Android 文档中的说明确保您已在项目中正确实施数据绑定: https ://developer.android.com/topic/libraries/data-binding/start
在您的 XML 布局文件中,删除自定义片段的标签并将其替换为标签。 这将允许您在 DrawerLayout 中包含片段的布局,而无需使用片段标记。
在您的 Java 代码中,使用 FragmentManager 以编程方式将片段添加到 DrawerLayout。 这将允许您在自定义片段中使用数据绑定而不会引起冲突。
确保您在 XML 布局文件中使用了正确的数据绑定语法。 例如,如果您使用 ViewModel 来管理片段的数据,则应该使用标签来定义布局中的变量,并使用 bind: 命名空间在布局中访问它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.