簡體   English   中英

<fragment> XML 和數據綁定中的標記給出膨脹異常</fragment>

[英]<fragment> tag in XML and Databinding gives inflate exception

我正在處理一個現有項目,該項目使用DrawerLayout和自定義片段進行側邊導航,但是當我使用數據綁定時,它會在<fragment>標記處的 XML 文件中給出膨脹異常。 下面是我的代碼。

活動主頁.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>

HomeActivity.java

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM