异常: 二进制 XML 文件: 类片段膨胀错误

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

<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)

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

524679 次浏览

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

import android.support.v4.app.Fragment;

经过长时间的调试,我已经解决了这个问题。(虽然我仍然不能解释为什么)。将属性 android:name更改为 class。(尽管在 Android 文档中,他们说这些属性是一样的,但是它们是有效的! ! !)

因此,它应该从:

 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.view.InflateException:...Error inflating class fragment。我有所有正确的图书馆包括在内。通过在 AndroidManifest.xml文件中添加一个用户权限(即 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>)解决了这个问题

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

我也有这个问题。我通过替换 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();获取操作栏

我在 NavigationDrawerFragment中更新了以下函数

private ActionBar getActionBar()
{
return ((ActionBarActivity)getActivity()).getSupportActionBar();
}
以防有人需要这个。 假设: 设备电话连接到 USB 电缆和您的 IDE 读取启动 应用程序。 转到命令提示符以确定问题: 输入 adb logcat

然后从 IDE 启动你的应用程序。 你将是一个例外 在我的案例中: 我正在将一个2.3版本的 Android 应用程序部署到移动设备上 不支持小部件“ Space”

我有同样的问题,问题,尝试了所有的答案,在这个帖子没有用。我的解决方案是,我没有在 ActivityXML 中添加 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"/>

如果有人愿意解释一下为什么会这样,我洗耳恭听,希望能有所帮助。

我有同样的问题,因为我没有实现侦听器。

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指针异常。我建议你也注意这样的错误。

我认为最基本的问题是在 AndroidManifest.xml 中定义的“ android: targetSdkVersion”。在我的例子中,初始值定义为:

android:targetSdkVersion=16

我改成了:

android:targetSdkVersion=22

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

如果其他人来到这里并且答案不能帮助解决问题,还有一件事可以尝试。

正如其他人所提到的,这通常是由嵌套在 XML 本身中的问题引起的,而不是您在 Java 中做错的事情引起的。对我来说,这是一个非常容易(也非常愚蠢)的错误。

我有这样的代码:

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

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

对于你们中的一些人来说,还没有找到解决这个问题的办法,在我的例子中,这是因为我有一个 OOM (内存不足)问题而发生的。这种情况可能发生在你的应用程序内存泄漏的情况下,例如当你长时间使用它的时候。在我的堆栈跟踪中,这是主要原因。

我不知道这能不能帮上忙。

我有这个问题与文本视图,我有在布局,我试图充气(例外: 二进制 XML 文件行 # 45: 类 TextView 的膨胀错误)。

我设置了以下 XML 属性 Android: ttSize = “ ? android: attr/textExplaranceLarge”,它不允许布局膨胀。

不知道确切的原因,(我对安卓系统还是有点新鲜——还不到一年的经验) ,可能与调用系统属性有关,idk,我所知道的是一旦我使用普通的旧 @ dimen/md _ text _ 16sp(这是我的习惯) ,问题就解决了:)

希望这个能帮上忙。

我不能用提供的答案来解决我的问题,最后我改变了这一点:

<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();
}
它工作了 如果在片段中使用它,请使用 获取儿童碎片管理器而不是 GetSupportFragmentManager

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

例如: public class CustomTextView extends TextView{}

这个类有4个构造函数,如果错过了其中任何一个,它就会崩溃。事实上,我错过了最后一个是由棒棒糖使用添加了构造函数和工作良好。

我在一个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会纠正这个错误,并将其正确显示为一个错误。

希望这对谁有帮助。

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

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
每当我们使用新的布局或新的设计特性时。 希望这能帮到你

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

我断断续续地遇到过类似的问题。无论实际原因如何,错误消息通常只提供很少的细节。但我找到了更有用的信息。事实证明,内部 android 类“ Layoutflater.java”(在 android.view 包中)有一个“充气”方法,它会重新引发异常,但是不会获取细节信息,所以你会丢失原因的信息。

我使用了 AndroidStudio,并在我正在处理的版本中的 Layout 539行上设置了一个断点,这是 catch 块的第一行,用于处理那个“充气”方法中的一个通用异常:

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

如果在调试器中查看“ e”,您将看到一个“ cause”字段。它可以给你一个关于真正发生了什么的提示,这非常有帮助。例如,我就是这样发现所包含片段的父片段必须有一个 id,即使在代码中没有使用也是如此。或者 TextView 与维度有问题。

我遇到了这个问题,并通过使用以下代码解决了它。

布局:

                  <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);

下面的代码解释了我如何删除片段,添加使用的儿童碎片管理器。

@Override
public void onDestroyView() {
super.onDestroyView();


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


if (youTubePlayerFragment != null)
{
getChildFragmentManager().beginTransaction().remove(youTubePlayerFragment).commitAllowingStateLoss();
}


youTubePlayer = null;
}
正如上一篇文章中提到的, 重命名
android:name="com.fragment.NavigationDrawerFragment"

class = "com.fragment.NavigationDrawerFragment"

但我还是不喜欢。然后我只是使用了 Class Name 而没有使用 com.part 部分,瞧,它工作了。所以最后改成

class = "NavigationDrawerFragment"
在这里没有一个答案对我有帮助之后,我选择在调试模式下运行应用程序,在我的片段中移动 onCreateView 的每一行(在你的例子中是 NavigationDrawerFragment)。并且注意到,由于 NullPointerException,片段在充气时遇到了困难。 例如:
mySeekBar = (SeekBar) getActivity().findViewById(R.id.mySeekBar);
mySeekBar.setOnSeekBarChangeListener(this);
在这里,mySeekBar 被设置为 null (因为我错过了在适当的布局中添加控件) ,下一行进入 NPE,得到的结果是充气异常。 另外,按照上面的建议,将 android: name 重命名为 class

由于上述各种原因,可能会出现这个问题。我建议逐行调试流程来知道哪里出错了。

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 有关,但是使用了一种不同的方法来找到根本原因(日志与调试器)。

对我来说。

我想要充气的布局

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

标签,删除它固定它。

我试图将之前为 Activity 设计的布局充气到视图页导航适配器中。

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

我将一个包从 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 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,但这解决了我的错误,以防有人遇到同样的情况

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

我有点迟到了,但这些答案对我的情况没有帮助。我使用谷歌地图作为 支持地图片段自动完成碎片都在我的片段。正如所有的答案指出的那样,问题在于 SupportMapFragment 是要重新创建和重新绘制的映射。

但是我在 PlaceAutoCompleteFragment 上也遇到了问题。因此,对于那些因为 支持地图片段支持地图片段而面临这个问题的人来说,这里有一个可行的解决方案

 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;
}




}

经过长时间的尝试,这是我如何解决这个问题后,以上的答案都不能。

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

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

EDIT

It should be a consistency between the Activity and Layout. If the Layout has one of the AppCompat Theme such like Theme.AppCompat.Light, your Activity should extends AppCompatActivity.

I wanted to have the burger icon and a Navigation Drawer that looks like the Android Gmail App, but I ended up with an ugly Navigation Drawer. All that because all my Classes extends Activity instead of AppCompatActivity.

I re-factored the entire project to extend AppCompatActivity, then Right-Click on the Layout Folder, chose new -> Activity then Navigation Drawer Activity and Boom, everything is done for me!

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

android.enableAapt2=false

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

当我将回收视图放在 bragment.xml 的根目录时,出现了这个错误,

但是当我用 ViewGroup 包装它的时候,这个应用程序工作得很好。

在导航中添加此名称字段

Name = “ androidx.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">

Android: name 和 class: 可以互换吗?

大概是吧。我只使用了 class,这似乎是大多数 Google 示例所使用的,但我确实看到了他们在一些示例中使用 android: name 的地方。遗憾的是,没有关于片段的正式和完整的文档。

使用

class = "com.fragment.NavigationDrawerFragment"

而不是

android:name="com.fragment.NavigationDrawerFragment"

这似乎意味着程序首先看起来像“ class”属性。在失败时看起来是“ name”属性。因此,如果使用“ class”效率更高,那么它就是正确的

FWIW: 我得到了 ”Android、视图、充气异常 Message = Binary XML 文件行 # 1: Binary XML 文件行 # 1: 类 android.view. TextureView 膨胀错误”

我是机器人表单设计的新手。在尝试给一些按钮添加边框时,我发现了一篇 SO 文章,它启发我创建了 buttonborder.xml,它看起来像:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@android:color/transparent" />
<stroke android:width="1dp" android:color="@android:color/white"/>

然后为每个按钮我添加

android:background="@drawable/buttonborder"

然而,由于我的热情,我还把它添加到了 TextureView 中——这是我的问题。当我从 TextureView 中删除该行时,一切正常。

检查前卫

我有这个错误与我的一个类的 ClassNotFoundException相结合,结果只是需要检查我的 proguard-rules.pro。该文件位于 YourAppName目录中的 app目录下。我需要添加以下两行:

-keep class com.gbros.tabslite.data.** { *; }
-keepattributes Exceptions, Signature, InnerClasses

其中 tabslite是我的应用程序名称,我得到的 ClassNotFoundException文件在 data文件夹中。

这个错误真的很令人困惑。在我的例子中,缺少片段的缺省空参数 less 构造函数。在片段中添加空构造函数后,问题解决了。

当管理片段的活动停止并尝试再次打开它时,可能会发生此异常,因此在这种情况下,NavHostFragment 将不会被丢失状态的活动识别出来。 要修复它,请尝试完成活动的循环生命周期,以便通过 FrgamentManager 再次重新加载 NavHostFragment。译注:

在你的活动中,你管理你的片段的地方放下面的内容:

@Override
protected void onStop() {
super.onStop();
this.finishActivity(0);
}

在我的特殊情况下,问题是我在 TextView 中添加了这一行:

android:background="?attr/selectableItemBackground"

移除这个之后,一切开始正常运转。

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"/>
我使用了一个 style 属性,该属性引用了 Material Component 属性。 但是我的 styles.xml 有...

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
....
</style>
类解析面临冲突的地方。我的视图属性引用了一个在应用程序主题中没有定义的属性。正确的父母主题从材料组件帮助我。 因此,我将父属性更改为...

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

这样问题就解决了。

我也遇到了这个错误。

尝试捕捉抛出错误的方法,我找到了解决我的具体问题的方法。

在我的例子中,我使用两个标准主题: 光明和黑暗。

正因为如此,我不得不(在必要的地方)以这种方式将颜色资源引用应用到颜色、绘图和视图中:

android:color="?accentColor"

这样系统就会知道根据当前主题使用哪种颜色。

在 DrawerLayout 中,我为 ListView 项目(菜单)提供了一个自定义选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="?colorAccent" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="?colorAccent" />
</shape>
</item>
</selector>

到目前为止,较低的 API 已经很好地解析了这些颜色引用。

为每个主题制作一个选择器,将任意 ?colorAccent分别改为 t1colorAccentt2colorAccent,解决了我的问题。

对我来说,我复制粘贴一个活动布局,我没有改变的价值

<androidx.constraintlayout.widget.ConstraintLayout>
...
tools:context=""  <!-- Check this value -->
</androidx.constraintlayout.widget.ConstraintLayout>

在使用新的活动名称更新之后,它对我起作用了。

我不知道发生了什么,但改变片段为框架布局解决了我的问题后,许多小时的斗争。

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

在我的例子中,我使用的是 Hilt Dagger 库,在 ViewModel 类中,我没有在类的顶部提到 @HiltViewModel注释。

所以只要添加注释就解决了问题。您还可以检查是否为所有活动和片段添加了注释。

经过2个小时的努力,我发现我的一个可绘制的文件是在 v24,但我是在 Api 23设备上测试应用程序。要解决这个问题,请遵循以下步骤:

  1. 确保你的文件在 res > draable 文件夹中,而不是 res > draable-v24。
  2. 有时候你的 android 工作室没有显示可绘制的 -24文件夹和你的文件在 res > 可绘制的文件夹与 v24标签。
  3. 删除该文件并重新添加。