【问题标题】:android.view.InflateException: Binary XML file: Error inflating class fragmentandroid.view.InflateException:二进制 XML 文件:膨胀类片段时出错
【发布时间】:2013-11-21 09:31:46
【问题描述】:

我有一个非常令人沮丧的错误,我无法解释。我创建了一个使用Android AppCompat 的Android 应用程序,以使其与旧版本兼容。这是我的主要活动布局文件:

<android.support.v4.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"
    tools:context=".MainActivity">

    <!-- As the main content view, the view below consumes the entire
         space available using match_parent in both dimensions. -->
    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- android:layout_gravity="start" tells DrawerLayout to treat
         this as a sliding drawer on the left side for left-to-right
         languages and on the right side for right-to-left languages.
         If you're not building against API 17 or higher, use
         android:layout_gravity="left" instead. -->

    <!-- The drawer is given a fixed width in dp and extends the full height of
         the container. -->
    <fragment android:id="@+id/navigation_drawer"
        android:layout_width="@dimen/navigation_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:name="com.fragment.NavigationDrawerFragment" />

</android.support.v4.widget.DrawerLayout>

这是我活动的主要代码:

public class MainActivity extends ActionBarActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
   }
}

这里的主要问题是:上面的代码在几乎设备(模拟设备,或一些真实设备)上运行流畅。但是当我在三星 S3 上运行它时。它注意到这个错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{view.MainActivity}: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2081)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2106)
            at android.app.ActivityThread.access$700(ActivityThread.java:134)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1217)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4856)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316)
            at android.app.Activity.setContentView(Activity.java:1901)
            at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:208)
            at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:111)
            at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:76)

请告诉我如何修复错误,谢谢:)

【问题讨论】:

  • 在这一行中你会得到异常检查类名和包名是否正确..android:name="com.hqt.hac.view.fragment.NavigationDrawerFragment"
  • 我已经检查过了,这个类是真的。我可以在某些设备上编译和运行,但不能在三星 s3 上编译和运行。我认为这里有一些奇怪的问题:(
  • 你是对的,如果它在某些设备上而不是在 s3 上执行,这是一个奇怪的问题..我的建议是一次尝试使用 sherlacFragment chek..
  • 我已经在这里解决了问题:stackoverflow.com/a/33128448/4366715
  • 对于那些试图诊断此错误原因的人:这里的轶事修复是一个红鲱鱼。在未显示在堆栈跟踪中的片段膨胀期间发生先前的异常。它可以是任何东西。要解决此问题,您必须找出先前的异常是什么。为此,请参阅我的回答或 @DaveHubbard 的回答。

标签: android


【解决方案1】:

经过长时间的调试,我已经解决了这个问题。 (虽然我仍然无法解释为什么)。我将属性android:name 更改为class。 (尽管在 Android Document 上,他们说这些属性是相同的,但它可以工作!!!)

所以,它应该从:

 android:name="com.fragment.NavigationDrawerFragment"

class = "com.fragment.NavigationDrawerFragment"

所以,新的布局应该是:

<!-- As the main content view, the view below consumes the entire
     space available using match_parent in both dimensions. -->
<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<!-- android:layout_gravity="start" tells DrawerLayout to treat
     this as a sliding drawer on the left side for left-to-right
     languages and on the right side for right-to-left languages.
     If you're not building against API 17 or higher, use
     android:layout_gravity="left" instead. -->

<!-- The drawer is given a fixed width in dp and extends the full height of
     the container. -->
<fragment android:id="@+id/navigation_drawer"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    class = "com.fragment.NavigationDrawerFragment" />

希望有帮助:)

【讨论】:

  • 我在尝试遵循官方 Android 教程时遇到了这个问题。您的修复(将android:id 更改为class)对我有用。我还收到了一个 Lint 警告,要求我将 Fragment 更改为 fragment,我做到了。
  • @DownVoter:这个错误很混乱。我幸运地找到了修复的方法。如果我的帖子无法解决您的错误,我真的很抱歉,因为我也无法解释原因。但我认为它不应该被否决。 :)
  • 我想知道你是否可靠地没有name更改为class,我有一些用户报告了这个崩溃但我自己无法重现!
  • 对我不起作用。我很累。开发了 2 小时,但找不到为什么它不起作用(二进制 xml 文件行...错误膨胀类片段)。有什么想法吗?
  • 过时了!对“androidx.fragment.app.FragmentContainerView”有任何想法吗?
【解决方案2】:

TL/DR在创建从更高级别的布局 XML 引用的片段期间发生异常。该异常导致高层布局膨胀失败,但初始异常未上报;只有更高级别的通货膨胀失败出现在堆栈跟踪中。要找到根本原因,您必须捕获并记录初始异常


错误的最初原因可能是多种多样的,这就是为什么这里有这么多不同的答案来解决每个人的问题。对于某些人来说,它与idclassname 属性有关。对于其他人来说,这是由于权限问题或构建设置。对我来说,那些并没有解决问题。相反,有一个仅存在于drawable-ldrtl-xhdpi 中的可绘制资源,而不是像drawable 这样的适用位置。

但这些只是细节。总体问题是 logcat 中显示的错误消息没有描述启动它的异常。当更高级别的布局 XML 引用片段时,将调用片段的 onCreateView()。当片段的onCreateView() 中发生异常时(例如在扩充片段的布局 XML 时),它会导致更高级别的布局 XML 的扩充失败。这种更高级别的通货膨胀失败是错误日志中报告为异常的原因。但最初的异常似乎并没有很好地传播到链条上,不足以被报告。

鉴于这种情况,问题是如何在初始异常未显示在错误日志中时公开它。

解决方案非常简单:在片段的onCreateView() 的内容周围放置一个try/catch 块,并在catch 子句中记录异常:

public View onCreateView(LayoutInflater inflater, ViewGroup contnr, Bundle savedInstSt) {
    try {
        mContentView = inflater.inflate(R.layout.device_detail_frag, null);
        // ... rest of body of onCreateView() ...
    } catch (Exception e) {
        Log.e(TAG, "onCreateView", e);
        throw e;
    }
}

可能不清楚哪个片段类的onCreateView() 这样做,在这种情况下,对导致问题的布局中使用的每个片段类执行此操作。例如,在OP的情况下,发生异常的应用程序代码是

at android.app.Activity.setContentView(Activity.java:1901)

这是

   setContentView(R.layout.activity_main);

因此,您需要在布局activity_main 中引用的任何片段的onCreateView() 中捕获异常。

就我而言,根本原因异常原来是

Caused by: android.content.res.Resources$NotFoundException: Resource
   "com.example.myapp:drawable/details_view" (7f02006f)  is not a
   Drawable (color or path): TypedValue{t=0x1/d=0x7f02006f a=-1
   r=0x7f02006f}

这个异常直到我在onCreateView() 中捕获并明确记录后才出现在错误日志中。一旦记录下来,问题就很容易诊断和修复(由于某种原因,details_view.xml 仅存在于ldrtl-xhdpi 文件夹下)。关键是要捕获作为问题根源的异常并将其暴露出来。

所有你的片段的onCreateView() 方法中作为样板来做这件事并没有什么坏处。如果那里有未捕获的异常,无论如何它都会使活动崩溃。唯一的区别是,如果您在onCreateView() 中捕获并记录异常,您就不会对它发生的原因一无所知。

附:我刚刚意识到这个答案与@DaveHubbard's 有关,但使用不同的方法来查找根本原因(日志记录与调试器)。

【讨论】:

  • 您可能为我节省了数小时的调试时间。赞一个!
  • 对我来说,我通过将内部片段的id 设置为与用于描述外部片段的内部片段相同的id 解决了我的问题。换句话说,view.findViewById(R.id.blah) 然后在“blah”上执行 Ctrl+单击应该会返回多个可能片段的结果。
【解决方案3】:

我无法使用提供的答案解决我的问题。最后我改变了这个:

<fragment
android:id="@+id/fragment_food_image_gallery"
android:name="ir.smartrestaurant.ui.fragment.ImageGalleryFragment"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout="@layout/fragment_image_gallery"
tools:layout="@layout/fragment_image_gallery" />

到这里:

<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="200dp" />

,

private void showGallery() {
    ImageGalleryFragment fragment = new ImageGalleryFragment()
    getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, fragment)
                .commit();
    }

它有效。
如果您在片段中使用它,请使用 getChildFragmentManager 而不是 getSupportFragmentManager

【讨论】:

    【解决方案4】:

    我有同样的问题,问题,尝试了这个线程中的所有答案都无济于事。我的解决方案是,我没有在 Activity XML 中添加 ID。我不认为这很重要,但确实如此。

    所以在我的活动 XML 中:

    <fragment
        android:name="com.covle.hellocarson.SomeFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    

    但应该有:

    <fragment
        android:id="@+id/some_fragment"
        android:name="com.covle.hellocarson.SomeFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    

    如果有人愿意评论为什么会这样,我会全神贯注,希望这会有所帮助。

    【讨论】:

    • 谢谢,这对我有用。几个月来我一直在忽略一个 id,但是在一些布局更改之后,我突然开始崩溃。 Android 很奇怪。
    • 你的回答对我有用。我只是想知道为什么我想在我不在任何地方使用它时放置 id 属性。你能给我解释一下吗?
    【解决方案5】:

    您可能不再需要它,但如果更多读者觉得它有帮助。我有完全相同的android.view.InflateException:...Error inflating class fragment。我包含了所有正确的库。通过在AndroidManifest.xml 文件中添加一个用户权限来解决,即&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/&gt;

    顺便说一句,我正在运行Android Studio 0.8.9 on Ubuntu 12.04.

    【讨论】:

    • 为我工作!非常感谢!
    【解决方案6】:

    我有同样的问题,因为我没有实现监听器。请参阅以下带有/*Add This!*/ 的代码。

    public class SomeActivity extends AppCompatActivity
            implements BlankFragment.OnFragmentInteractionListener /*Add this!*/ 
    {
        @Override                                                  /*Add This!*/
        public void onFragmentInteraction(Uri uri){                /*Add This!*/
        }                                                          /*Add This!*/
    }
    

    仅供参考,我的片段类如下所示:

    public class SomeFragment extends Fragment {
    
        private OnFragmentInteractionListener mListener;
    
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            try {
                mListener = (OnFragmentInteractionListener) activity;
            } catch (ClassCastException e) {
                throw new ClassCastException(activity.toString()
                        + " must implement OnFragmentInteractionListener");
            }
        }
    
        public interface OnFragmentInteractionListener {
            public void onFragmentInteraction(Uri uri);
        }
    }
    

    编辑:

    FragmentonCreate 函数出现异常时,我也注意到了同样的错误消息。我有以下内容:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    
        int ID = getArguments().getInt("val");
    
        return rootView;
    } 
    

    因为我重用了这个片段,我完全忘记了设置参数。那么getArguments() 的结果就是null。显然,我在这里得到了一个null 指针异常。我会建议你留意这样的错误。

    【讨论】:

    • 谢谢!这帮助很大!
    【解决方案7】:

    您的 NavigationDrawerFragment 是否扩展了 android.support.v4.app.Fragment?换句话说,您是否导入了正确的包?

    import android.support.v4.app.Fragment;
    

    【讨论】:

      【解决方案8】:

      我也有这个问题。我通过替换 MainActivityNavigationDrawerFragment 中的导入解决了它

      来自

      import android.app.Activity;
      import android.app.ActionBar;
      

      import android.support.v7.app.ActionBar;
      import android.support.v7.app.ActionBarActivity;
      

      我将 MainActivity 更新为扩展 ActionBarActivity 而不是 Activity

      public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks
      

      同样使用ActionBar actionBar = getSupportActionBar(); 获取ActionBar

      我在NavigationDrawerFragment更新了以下函数

      private ActionBar getActionBar()
      {
          return ((ActionBarActivity)getActivity()).getSupportActionBar();
      }
      

      【讨论】:

      • 我认为这是正确的答案。但我使用 AppCompatActivity 而不是 ActionBarActivity (不推荐),也没有删除 import android.app.ActionBar (因为 onAttach 方法使用它)
      【解决方案9】:

      我遇到了这个问题并通过使用以下代码解决了它。我正在使用子片段管理器开始片段事务。

      布局:

                        <fragment
                          class="com.google.android.youtube.player.YouTubePlayerSupportFragment"
                          android:id="@+id/youtube_fragment"
                          android:layout_width="match_parent"
                          android:layout_height="wrap_content"/>
      

      这就是我开始片段交易的方式:

         youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);
      

      以下代码解释了我如何删除使用 childfragmentmanger 添加的片段。

      @Override
          public void onDestroyView() {
              super.onDestroyView();
      
              youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);
      
              if (youTubePlayerFragment != null)
              {
                  getChildFragmentManager().beginTransaction().remove(youTubePlayerFragment).commitAllowingStateLoss();
              }
      
              youTubePlayer = null;
          }
      

      【讨论】:

      • TY 阿里。你拯救了我的一天!
      • 工作正常。谢谢!
      【解决方案10】:

      我断断续续地遇到过类似的问题。无论实际原因如何,错误消息通常提供的细节很少。但我找到了一种获取更多有用信息的方法。事实证明,内部 android 类“LayoutInflater.java”(在 android.view 包中)有一个“inflate”方法,该方法会重新抛出异常,但不会获取详细信息,因此您会丢失有关原因的信息。

      我使用了 AndroidStudio,并在 LayoutInflator 第 539 行(在我正在使用的版本中)设置了一个断点,这是该“inflate”方法中通用异常的 catch 块的第一行:

              } catch (Exception e) {
                  InflateException ex = new InflateException(
                          parser.getPositionDescription()
                                  + ": " + e.getMessage());
                  ex.initCause(e);
                  throw ex;
      

      如果您在调试器中查看“e”,您将看到一个“原因”字段。它可以为您提供有关真正发生的事情的提示非常有帮助。例如,我发现包含片段的父级必须有一个 id,即使在您的代码中没有使用也是如此。或者 TextView 的尺寸有问题。

      【讨论】:

        【解决方案11】:

        以防万一有人需要。 假设:设备电话连接到 USB 电缆并且您的 IDE 读取启动 应用程序。 转到命令提示符以确定问题: 输入 adb logcat

        然后从 IDE 启动您的应用。 你会例外。

        就我而言:我正在将 2.3 版的 Android 应用程序部署到移动设备上 不支持小部件“Space”

        【讨论】:

          【解决方案12】:

          在导航中添加此名称字段

          android:name="androidx.navigation.fragment.NavHostFragment"

             <fragment
                       android:id="@+id/container"
                       android:layout_width="match_parent"
                       android:layout_height="0dp"
                       android:name="androidx.navigation.fragment.NavHostFragment"
                       app:navGraph="@navigation/navigation"
                       app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
                       app:layout_constraintTop_toTopOf="parent">
          

          【讨论】:

            【解决方案13】:

            当您有一个自定义类扩展了不同的类(在本例中为视图)并且未导入该类所需的所有构造函数时,就会出现此问题。

            例如:public class CustomTextView extends TextView{}

            这个类将有 4 个构造函数,如果你错过任何一个,它就会崩溃。事实上,我错过了 Lollipop 使用的最后一个,添加了该构造函数并且工作正常。

            【讨论】:

              【解决方案14】:

              我们还必须在 build.gradle(app) 中添加以下内容

              compile 'com.android.support:appcompat-v7:23.1.1'
              compile 'com.android.support:design:23.1.1'
              

              每当我们使用新布局或新设计功能时。 希望这对你有帮助。

              【讨论】:

                【解决方案15】:

                如前一篇文章所述,
                重命名

                android:name="com.fragment.NavigationDrawerFragment"
                

                class = "com.fragment.NavigationDrawerFragment"
                

                不过,它对我不起作用。然后我只使用了没有 com.fragment 部分的类名,瞧,它起作用了。所以最后改成

                class = "NavigationDrawerFragment"
                

                【讨论】:

                  【解决方案16】:

                  在此处没有任何答案帮助我之后,我选择在调试模式下运行应用程序,在我的片段中的每一行 onCreateView 移动(在您的情况下为 NavigationDrawerFragment)。并注意到由于 NullPointerException,该片段难以膨胀。 例如

                  mySeekBar = (SeekBar) getActivity().findViewById(R.id.mySeekBar);
                  mySeekBar.setOnSeekBarChangeListener(this);
                  

                  这里 mySeekBar 设置为 null(因为我错过了在适当的布局中添加控件),下一行进入 NPE,它作为 InflateException 出现。 另外,如上所述,将 android:name 重命名为 class。

                  由于上述各种原因,可能会出现此问题。我会推荐逐行调试流程以了解问题所在。

                  【讨论】:

                  • 这个错误是否发生在片段的onCreateView() 方法中?
                  【解决方案17】:

                  经过长时间的尝试,在以上答案都无法解决后,这是我解决问题的方法。

                  1. 为您的Main 活动扩展AppCompatActivity 而不是Activity
                  2. AndroidManifest.xml 中将android:theme="@style/Theme.AppCompat.Light" 添加到您的&lt;Activity..../&gt;
                  3. 在您的 NavigationDrawerFragment 类中,将您的 ActionBar 实例更改为

                    ActionBar mActionBar=((AppCompatActivity)getActivity()).getSupportActionBar();
                    

                  编辑

                  ActivityLayout应该是一致的。 如果 Layout 具有 AppCompat Theme 之一,例如 Theme.AppCompat.Light,您的 Activity 应该是 extends AppCompatActivity

                  我想要一个 burger 图标和一个 Navigation Drawer,看起来像 Android Gmail 应用程序,但我最终得到了一个丑陋的导航抽屉。 这一切都是因为我所有的课程都是extends Activity 而不是AppCompatActivity

                  我重构整个项目以扩展AppCompatActivity,然后右键单击Layout Folder,选择new -> Activity 然后Navigation Drawer Activity 和Boom,一切都为我完成了!

                  【讨论】:

                    【解决方案18】:
                    android.view.InflateException: Binary XML file line #16: Error inflating class com.google.android.material.bottomappbar.BottomAppBar
                    

                    视图可以是任何无法膨胀的东西,当在解析 XML 文件中引用的视图的类名或名称属性时发生冲突时会出现这种错误。

                    当我遇到同样的错误时,我只是在 UI-XML 文件中得到了干净和安全的所有内容, 我使用的视图,

                       <com.google.android.material.bottomappbar.BottomAppBar
                        android:id="@+id/bottomAppBar"
                        style="@style/Widget.MaterialComponents.BottomAppBar.Colored"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_gravity="bottom"
                        app:hideOnScroll="true"
                        app:menu="@menu/bottom_app_bar"
                        app:navigationIcon="@drawable/ic__menu_24"/>
                    

                    我使用的是引用 Material 组件属性的样式属性。 但是我的styles.xml 有...

                    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
                    ....
                    </style>
                    

                    解决类面临冲突的地方。我的视图属性引用了一个未在我的应用主题中定义的属性。材料组件的正确父主题帮助了我。 所以我把父属性改成...

                    <style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
                    ...
                    </style>
                    

                    解决了问题。

                    【讨论】:

                      【解决方案19】:

                      对于仍然没有找到解决方案的一些人来说,就我而言,这是因为我遇到了 OOM(内存不足)问题。例如,当您的应用程序在长时间使用时出现内存泄漏时,就会发生这种情况。在我的堆栈跟踪中,这是主要原因。

                      【讨论】:

                        【解决方案20】:

                        我不知道这是否会有所帮助。

                        我在尝试膨胀的布局中的 TextView 遇到了这个问题(android.view.InflateException: Binary XML file line #45: Error inflating class TextView)。

                        我设置了以下 XML 属性 android:textSize="?android:attr/textAppearanceLarge" 不允许布局膨胀。

                        不知道具体原因,(我对 Android 还是有点陌生​​ - 不到一年的经验),可能与调用系统属性有关,idk,所有我只要我使用普通的旧 @dimen/md_text_16sp这是我的习惯),问题就解决了 :)

                        希望这会有所帮助...

                        【讨论】:

                        • 我没有 Fragments 也没有 textSize android 属性。我的错误与继承 TextAppearance.AppCompat 而不是 Widget.Design.TextInputLayout: 的自定义样式的 TextInputLayout 有关。 stackoverflow.com/questions/19874882/…
                        【解决方案21】:

                        我在 4.4.2 设备上安装了这个,但 5+ 没问题。原因:在自定义视图的初始化中,我创建了一个TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes),即 API 21+。

                        Android Studio 2.1 不会抱怨它,即使它被注释为 TargetApi(21)。显然,Android Studio 2.2 将更正此问题并将其正确显示为错误。

                        希望这对某人有所帮助。

                        【讨论】:

                          【解决方案22】:

                          我参加聚会有点晚了,但这些答案都没有帮助我。我在我的片段中都使用 Google 地图作为 SupportMapFragmentPlaceAutocompleteFragment。正如所有答案都指出,问题在于 SupportMapFragment 是要重新创建和重绘的地图。

                          但我也遇到了 PlaceAutocompleteFragment 的问题。因此,对于那些因 SupportMapFragmentSupportMapFragment

                          而面临此问题的人来说,这是可行的解决方案
                           mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment);
                              FragmentManager fm = getChildFragmentManager();
                          
                              if (mapFragment == null) {
                                  mapFragment = SupportMapFragment.newInstance();
                                  fm.beginTransaction().replace(R.id.mapFragment, mapFragment).commit();
                                  fm.executePendingTransactions();
                              }
                          
                              mapFragment.getMapAsync(this);
                          
                              //Global PlaceAutocompleteFragment autocompleteFragment;
                          
                          
                              if (autocompleteFragment == null) {
                                  autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.place_autoCompleteFragment);
                          
                              }
                          

                          并在 onDestroyView 中清除 SupportMapFragment 和 SupportMapFragment

                          @Override
                          public void onDestroyView() {
                              super.onDestroyView();
                          
                          
                              if (getActivity() != null) {
                                  Log.e("res","place dlted");
                                  android.app.FragmentManager fragmentManager = getActivity().getFragmentManager();
                                  android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                                  fragmentTransaction.remove(autocompleteFragment);
                                  fragmentTransaction.commit();
                          
                                  autocompleteFragment = null;
                              }
                          
                          
                          }
                          

                          【讨论】:

                            【解决方案23】:

                            在我的特殊情况下,问题是我将此行添加到 TextView :

                            android:background="?attr/selectableItemBackground"
                            

                            删除后,一切都开始正常了。

                            【讨论】:

                              【解决方案24】:

                              我认为基本问题在于 AndroidManifest.xml 中定义的“android:targetSdkVersion”。就我而言,我定义为的初始值:

                              android:targetSdkVersion=16

                              我改成:

                              android:targetSdkVersion=22

                              解决了我的所有错误。因此,在构建 Android 应用之前,设置正确的“targetSdkVersion”也很重要。

                              【讨论】:

                                【解决方案25】:

                                如果其他人来到这里并且答案无助于解决问题,请再尝试一件事。

                                正如其他人所提到的,这通常是由嵌套在 XML 本身中的问题引起的,而不是您在 Java 中做错了什么。就我而言,这是一个非常容易(而且愚蠢)的错误来解决。

                                我有这样的代码:

                                <view
                                    android:layout_width="fill_parent"
                                    android:layout_height="1dip"
                                    android:id="@+id/view44"
                                    android:background="@color/gray"
                                    />
                                

                                我所要做的就是将“视图”中的 v 大写,以便系统识别它。检查您的自定义视图(或 Fragments、recyclerviews 等)是否都预先具有正确的大写声明,以便 XML 自动完成将其与适当的视图匹配。

                                【讨论】:

                                  【解决方案26】:

                                  我也有这个错误,经过很长时间的调试,问题似乎是我的 MainClass 扩展了 Activity 而不是 FrameActivity,在我的情况下,xml 不是问题。希望能帮到你。

                                  【讨论】:

                                    【解决方案27】:

                                    就我而言。

                                    我试图膨胀的布局有

                                    <include 
                                     layout  = "...."
                                    />
                                    

                                    标签,删除它修复它。

                                    我试图将以前为 Activity 设计的布局膨胀到 view-pager 适配器中。

                                    【讨论】:

                                      【解决方案28】:

                                      我的错误是由另一个问题引起的。

                                      我正在将一个包从一个 Activity 传递到它的片段。 当我评论在片段中接收包的代码时,错误消失了。 事实证明,我的错误是由于下面的“getArguments();”返回 null 的部分。

                                      Bundle args = getArguments();
                                      

                                      在检查活动发送代码后,我意识到我在下面犯了一个愚蠢的错误;

                                      Bundle bundle =new Bundle();
                                       bundle.putInt("recipeID", recipe_position);
                                       Fragment mainFragment = new MainActivityFragment();
                                       mainFragment.setArguments(bundle);
                                       FragmentManager fragmentManager = getSupportFragmentManager();
                                       --> fragmentManager.beginTransaction()
                                                              .replace(R.id.container, new  MainActivityFragment(),
                                                                      DetailRecipeActivityFragment.TAG)
                                                              .commit();
                                      

                                      我正在用箭头创建一个新片段。而我应该使用已经拥有我的捆绑包的预实例化片段。 所以应该是:

                                      Bundle bundle =new Bundle();
                                       bundle.putInt("recipeID", recipe_position);
                                       Fragment mainFragment = new MainActivityFragment();
                                       mainFragment.setArguments(bundle);
                                       Fragment mainFragment = new MainActivityFragment();
                                       FragmentManager fragmentManager = getSupportFragmentManager();
                                       -->fragmentManager.beginTransaction()
                                                              .replace(R.id.container, mainFragment,
                                                                      DetailRecipeActivityFragment.TAG)
                                                              .commit();
                                      

                                      我不知道为什么它会抛出这个错误而不是 NPE,但这解决了我的错误,以防有人遇到相同的情况

                                      【讨论】:

                                        【解决方案29】:

                                        我遇到了同样的问题,在我的情况下,包名称错误,修复它解决了问题。

                                        【讨论】:

                                          【解决方案30】:

                                          打开 gradle.properties 并添加以下行:

                                          android.enableAapt2=false
                                          

                                          参考:https://github.com/chrisjenx/Calligraphy/issues/417#issuecomment-365177808

                                          【讨论】:

                                          • Android 发出警告说 android.enableAapt2 已被弃用。
                                          猜你喜欢
                                          • 2014-05-21
                                          • 2020-05-30
                                          • 2016-11-16
                                          • 2015-02-08
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2014-08-13
                                          • 1970-01-01
                                          • 2022-01-17
                                          相关资源
                                          最近更新 更多