我有一个Activity
和一个简单的布局。
的活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.my.layout
android:id="@+id/my_id"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.my.layout>
</FrameLayout>
我想用合并代码替换FrameLayout
,但结果我在setContentView
期间遇到以下错误:
01-25 17:08:24.660: E/AndroidRuntime(25837):
java.lang.RuntimeException: Unable to start activity ComponentInfo{my.app/my.app.MyActivity}:
android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true
答案 0 :(得分:1)
男人,尝试删除HoloEverywhere。它会导致合并标记出现问题。
答案 1 :(得分:1)
好奇,这种行为似乎并不普遍。我可以在模拟器或我的一个Nexus设备上运行一个简单的示例,并且应用程序可以使用<merge>
标记作为层次结构的根来扩展主布局。你能在多台设备上重现这个吗?
从技术上讲,只需一瞥AOSP,Android Window
和Activity
实施就无法实现此行为,除非特定的OEM修改了其行为(摩托罗拉因此而臭名昭着)。在AOSP来源:
LayoutInflater.inflate()
父视图参数调用null
时才会出现异常。Activity
只是将setContentView()
传递给其父Window
Window
以内容视图作为父级调用LayoutInflater.inflate()
,如果在此阶段为空,则框架代码将抛出令人讨厌的RuntimeException
。作为旁注,这可能不是你想要做的事情。我理解想要在层次结构中替换看似无用的父级的原因,但有一点可以保证您的应用程序始终知道它的父级是什么,因此它可以正确地期望LayoutParams
被评估。使用<merge>
时,您的层次结构的根内容视图可能是FrameLayout
,LinearLayout
或其他视图,具体取决于设备上的Android版本,这可能会导致令人困惑的行为期望root LayoutParams
以特定方式运行。