二进制XML文件行#13:二进制XML文件行#13:错误膨胀类片段

时间:2017-01-17 01:43:57

标签: android android-fragments fragment

我注意到通过XML膨胀初始片段的问题。我注意到的是onPause()onDestroy()生命周期方法没有被正确调用。如果我替换这个片段,一切正常。问题是只有首次启动应用程序并且初始片段通过XML膨胀时才会出现问题。为了避免这种冲突,我尝试以编程方式启动初始片段,但我一直收到inflating class error

java.lang.RuntimeException: Unable to start activity ComponentInfo{com..tap/com.example.tap.activity.MainActivity}: android.view.InflateException: Binary XML file line #13: Binary XML file line #13: Error inflating class fragment
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3254)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350)
    at android.app.ActivityThread.access$1100(ActivityThread.java:222)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7237)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
 Caused by: android.view.InflateException: Binary XML file line #13: Binary XML file line #13: Error inflating class fragment
    at android.view.LayoutInflater.inflate(LayoutInflater.java:551)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:380)
    at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284)
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:143)
    at com.example.tap.activity.MainActivity.onCreate(MainActivity.java:69)
    at android.app.Activity.performCreate(Activity.java:6876)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) 
    at android.app.ActivityThread.access$1100(ActivityThread.java:222) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:158) 
    at android.app.ActivityThread.main(ActivityThread.java:7237) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
 Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class fragment
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:794)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:527)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:380) 
    at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284) 
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:143) 
    at com.example.tap.activity.MainActivity.onCreate(MainActivity.java:69) 
    at android.app.Activity.performCreate(Activity.java:6876) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) 
    at android.app.ActivityThread.access$1100(ActivityThread.java:222) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:158) 
    at android.app.ActivityThread.main(ActivityThread.java:7237) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
 Caused by: java.lang.NullPointerException
    at java.lang.VMClassLoader.findLoadedClass(Native Method)
    at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:499)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    at android.support.v4.app.Fragment.isSupportFragmentClass(Fragment.java:469)
    at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2384)
    at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120)
    at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:378)
    at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:33)
    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:77)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:766)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:847) 
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:527) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:380) 
    at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284) 
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:143) 
    at com.example.tap.activity.MainActivity.onCreate(MainActivity.java:69) 
    at android.app.Activity.performCreate(Activity.java:6876) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) 
    at android.app.ActivityThread.access$1100(ActivityThread.java:222) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:158) 
    at android.app.ActivityThread.main(ActivityThread.java:7237) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

以下是我如何通过XML扩充我的初始片段。在首次启动的Activity中,我将此段代码添加到其布局

<fragment
    android:id="@+id/frag_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.example.fragments.MainFragment" />

当我更改片段时,例如单击选项卡,我使用以下方法替换片段

public void addFragmentReplace(int containerId, Fragment fragment) {
    // check if the fragment has been added already
    Fragment temp = mFragmentManager.findFragmentByTag(fragment.getClass().getSimpleName());
    if (!Utils.checkIfNull(temp) && temp.isAdded()) {
        return;
    }

    // replace fragment and transition with animation
    try {
        if (!Utils.isStringEmpty(getTopFragment().getTag()) && getTopFragment().isAdded()) {
            // pop back stack
            popBackStack();
        }
        mFragmentManager.beginTransaction().replace(containerId, fragment,
                fragment.getClass().getSimpleName()).addToBackStack(null).commit();
    } catch (IllegalStateException e) {
        e.printStackTrace();
        mFragmentManager.beginTransaction().replace(containerId, fragment,
                fragment.getClass().getSimpleName()).addToBackStack(null)
                .commitAllowingStateLoss(); // used as last resort
    }
}

更改标签后,片段生命周期完美运行。即使返回原始标签。但是,当片段通过XML膨胀时,如何让生命周期最初工作?或者如何从XML中删除类属性并添加片段?

在最初启动的Activity中添加片段会导致膨胀错误。这是我使用以下方法添加片段的方式

public void addFragment(int containerId, Fragment fragment) {
    // check if the fragment has been added already
    Fragment temp = mFragmentManager.findFragmentByTag(fragment.getClass().getSimpleName());
    if (!Utils.checkIfNull(temp) && temp.isAdded()) {
        return;
    }

    // add fragment and transition with animation
    mFragmentManager.beginTransaction().add(containerId, fragment,
            fragment.getClass().getSimpleName()).addToBackStack(null).commit();
}

提前谢谢!

0 个答案:

没有答案