在Activity中设置内容视图,合并标记为root?

时间:2013-01-25 16:42:32

标签: android merge android-framelayout

我有一个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

2 个答案:

答案 0 :(得分:1)

男人,尝试删除HoloEverywhere。它会导致合并标记出现问题。

答案 1 :(得分:1)

好奇,这种行为似乎并不普遍。我可以在模拟器或我的一个Nexus设备上运行一个简单的示例,并且应用程序可以使用<merge>标记作为层次结构的根来扩展主布局。你能在多台设备上重现这个吗?

从技术上讲,只需一瞥AOSP,Android WindowActivity实施就无法实现此行为,除非特定的OEM修改了其行为(摩托罗拉因此而臭名昭着)。在AOSP来源:

  1. 只有在使用LayoutInflater.inflate()父视图参数调用null时才会出现异常。
  2. Activity只是将setContentView()传递给其父Window
  3. Window以内容视图作为父级调用LayoutInflater.inflate(),如果在此阶段为空,则框架代码将抛出令人讨厌的RuntimeException
  4. 作为旁注,这可能不是你想要做的事情。我理解想要在层次结构中替换看似无用的父级的原因,但有一点可以保证您的应用程序始终知道它的父级是什么,因此它可以正确地期望LayoutParams被评估。使用<merge>时,您的层次结构的根内容视图可能是FrameLayoutLinearLayout或其他视图,具体取决于设备上的Android版本,这可能会导致令人困惑的行为期望root LayoutParams以特定方式运行。