android.view.InflateException:二进制XML文件:错误膨胀类的片段
我有一个非常令人沮丧的错误,我无法解释。 我创build了一个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上运行它。 它注意到这个错误:
Ĵ
ava.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)
请告诉我如何解决错误,谢谢:)
经过长时间的debugging,我已经解决了这个问题。 (虽然我仍然无法解释为什么)。 我将属性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" />
希望这个帮助:)
使用提供的答案我无法解决我的问题。 最后我改变了这个:
<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 。
这可能不再需要你,但如果更多的读者觉得有帮助。 我有完全相同的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.
运行Android Studio 0.8.9 on Ubuntu 12.04.
我有同样的问题,问题,尝试所有的答案在这个线程无济于事。 我的解决scheme是,我没有在活动XML中添加一个ID。 我不认为这是重要的,但它确实。
所以在Activity 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"/>
如果有人会乐意评论这是为什么,我全部耳朵,其他,我希望这可以帮助。
你的NavigationDrawerFragment扩展了android.support.v4.app.Fragment吗? 换句话说,你是否正在导入正确的软件包?
import android.support.v4.app.Fragment;
我有同样的问题,因为我没有实现监听器。 用/*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); } }
编辑:
在Fragment
的onCreate
函数出现exception的情况下,我也会注意到这个错误信息。 我有以下几点:
@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
指针exception。 我build议你也要留意这样的错误。
我也有这个问题。 我通过replaceMainActivity
和NavigationDrawerFragment
的导入来解决它
从
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(); }
我有类似的问题。 错误消息通常提供非常less的细节,无论实际的原因如何。 但是我find了一个获得更多有用信息的方法。 事实certificate,内部android类'LayoutInflater.java'(在android.view包中)有一个'膨胀'的方法,重新抛出一个exception,但没有拿起细节,所以你失去了原因的信息。
我使用了AndroidStudio,并在LayoutInflator行539(我正在使用的版本)中设置一个断点,这是'inflate'方法中一个genericsexception的catch块的第一行:
} catch (Exception e) { InflateException ex = new InflateException( parser.getPositionDescription() + ": " + e.getMessage()); ex.initCause(e); throw ex;
如果您在debugging器中查看“e”,您将看到“原因”字段。 在给你提示真正发生的事情方面,这可能会非常有帮助。 例如,我发现如果包含的片段的父项必须有一个id,即使没有在您的代码中使用。 或者说,一个TextView有一个维度的问题。
TL / DR : 创build从更高级布局XML引用的片段时发生exception。 这种例外导致更高层次的布局通货膨胀失败,但最初的例外情况没有被报告 。 只有更高层次的通货膨胀失败才会出现在堆栈轨迹中。 要find根本原因,您必须捕获并logging最初的exception 。
错误的最初原因可能是各种各样的事情,这就是为什么这里有很多不同的答案,为什么每个人都解决了这个问题。 对于某些人来说,它必须处理id
, class
或name
属性。 对于其他人,这是由于权限问题或构build设置。 对我来说,这些问题并没有解决。 而是有一个可绘制的资源只存在于drawable-ldrtl-xhdpi
,而不是像drawable
这样的可用的地方。
但这些只是细节。 大问题是,在logcat中显示的错误消息没有描述启动它的所有exception。 当更高级别的布局XML引用片段时,片段的onCreateView()
被调用。 当片段的onCreateView()
发生exception (例如,在扩展片段的布局XML时),会导致更高级布局XML的通胀失败。 这种更高层次的通货膨胀失败是错误日志中的例外情况。 但是,最初的例外情况似乎没有足够好地报道。
鉴于这种情况,问题是如何暴露最初的exception,当它不出现在错误日志中。
解决scheme非常简单:在片段的onCreateView()
的内容周围放置try
/ catch
块,并在catch
子句中loggingexception:
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的情况下,发生exception的应用程序的代码是
at android.app.Activity.setContentView(Activity.java:1901)
这是
setContentView(R.layout.activity_main);
因此,您需要捕获布局activity_main
引用的任何片段的onCreateView()
的exception。
在我的情况下,根本原因exception结果是
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}
这个exception没有显示在错误日志中,直到我在onCreateView()
捕获并显式logging。 一旦它被logging,这个问题很容易诊断和修复(出于某种原因,仅存在于ldrtl-xhdpi
文件夹中的details_view.xml
文件)。 关键在于捕捉作为问题根源的例外,并将其暴露出来。
在所有片段的onCreateView()
方法中,这样做并不会伤害到它的样板。 如果在那里有一个没有捕获到的exception,不pipe怎样,都会崩溃。 唯一的区别是,如果你在onCreateView()
捕获并logging这个exception,你将不会处于黑暗的状态。
PS我刚刚意识到这个答案是关于@ DaveHubbard的,但使用不同的方法来find根本原因(日志logging与debugging器)。
以防万一有人需要这个。 假设:设备电话连接到USB电缆,您的IDE读取启动应用程序。 转到命令提示符以确定问题:inputadb logcat
然后从IDE启动您的应用程序。 你会例外。
在我的情况下:我正在部署一个版本2.3的Android应用程序到移动设备,不支持小部件“空间”
当你有一个自定义类来扩展一个不同的类(在这个例子中是一个视图)时,这个问题就出现了,并且不会导入这个类所需的所有构造函数。
例如:公共类CustomTextView扩展TextView {}
这个类将有4个构造函数,如果你错过了任何一个,它会崩溃。 事实上,我错过了棒棒糖使用的最后一个添加了构造函数,工作正常。
我们还必须在build.gradle(app)中添加以下内容
compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1'
每当我们使用新的布局或新的devisefunction。 希望这可以帮助你。
我遇到了这个问题,并通过使用下面的代码来解决它。 我正在通过使用childfragmentpipe理器开始片段交易。
布局:
<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; }
在这里没有任何答案帮助我,我select运行应用程序在debugging模式中移动我的片段(你的案例中的NavigationDrawerFragment)onCreateView的每一行。 注意到这个片段由于NullPointerException而导致膨胀困难。 例如
mySeekBar = (SeekBar) getActivity().findViewById(R.id.mySeekBar); mySeekBar.setOnSeekBarChangeListener(this);
在这里,mySeekBar被设置为null(因为我错过了在适当的布局中添加控件),下一行进入NPE,出现InflateException。 另外,如上所示,将android:name重命名为class。
这个问题可能由于上述各种原因而产生。 我会推荐一行一行的debuggingstream程来知道什么是错误的。
我不知道这是否会有所帮助。
我有一个TextView的问题,我在布局中试图膨胀( android.view.InflateException:二进制XML文件行#45:错误膨胀类TextView )。
我已经设置了以下XML属性android:textSize =“?android:attr / textAppearanceLarge” ,它不允许布局被夸大。
不知道究竟为什么,( 我对Android还是有点新鲜 – 不到一年的经验 ),可能与调用系统属性idk有关,我知道的只要我用普通的旧@ dimen / md_text_16sp ( 这是我的习惯 ),问题解决:)
希望这可以帮助…
我认为基本的问题是在AndroidManifest.xml中定义的“android:targetSdkVersion”。 就我而言,我定义的初始值是:
android:targetSdkVersion=16
我把它改成:
android:targetSdkVersion=22
这解决了我所有的错误。 因此,在构buildAndroid应用程序之前,设置正确的“targetSdkVersion”也很重要。
如果有人来到这里,但答案不能帮助解决问题,还有一件事要尝试。
正如其他人所提到的,这通常是由embedded在XML本身中的问题引起的,而不是你在Java中做错的事情。 就我而言,这是一个非常容易(和愚蠢的)错误修复。
我有这样的代码:
<view android:layout_width="fill_parent" android:layout_height="1dip" android:id="@+id/view44" android:background="@color/gray" />
当我所要做的只是在“视图”中将v大写,以便系统识别它。 检查您的自定义视图(或碎片,recyclerviews等)都有适当的大写的声明,以便XML自动完成将匹配到适当的观点。
对于一些还没有find解决scheme,对我来说,这是因为我有一个OOM(内存不足)问题。 这可能发生在你长时间使用应用程序时出现内存泄漏的情况。 在我的堆栈跟踪中,这是主要原因。
我有一个4.4.2的设备,但5 +罚款。 原因:在一个自定义视图的初始化,我创build一个TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes)
,这是API 21 +。
即使它是注释TargetApi(21)
Android Studio 2.1也不会抱怨它。 显然,Android Studio 2.2会纠正这个错误,并将其正确显示。
希望这有助于某人。
我也有这个错误,并经过很长时间debugging接缝的问题是,我的MainClass扩展活动,而不是FrameActivity,在我的情况下,XML不是一个问题。 希望能帮助你。
如前一篇文章所述,
改名
android:name="com.fragment.NavigationDrawerFragment"
至
class = "com.fragment.NavigationDrawerFragment"
尽pipe如此,它并没有为我工作。 然后,我只是使用没有com.fragment部分的类名,并说它工作。 所以最后改为
class = "NavigationDrawerFragment"
在我的情况。
我试图膨胀的布局了
<include layout = "...." />
标记,删除它修复它。
我正在尝试将之前为Actvitydevise的布局充填到视图分页器适配器中。
我的错误是由不同的问题引起的。
我从一个活动传递一个包到它的片段。 当我评论接收片段中的包的代码时,错误消失了。 事实certificate,我的错误是由于下面的“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();
我正在用箭头创build一个新的片段。 而我应该使用已经有我的包的预先实例化的片段。 所以应该是:
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,但这解决了我的错误,以防有人有相同的情况