2

我有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
4

2 回答 2

1

伙计,尝试删除 HoloEverywhere。它会导致合并标签出现问题。

于 2013-01-25T18:46:23.367 回答
1

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

Window从技术上讲,仅从 AOSP 看,这种行为在 Android和实施中是不可能的,Activity除非特定 OEM 修改了其行为(摩托罗拉因这样做而臭名昭著)。在 AOSP 源代码中:

  1. 只有在使用父视图参数LayoutInflater.inflate()调用时才会出现异常。null
  2. Activity只是传递setContentView()给它的父母Window
  3. Window以内容视图作为父级调用LayoutInflater.inflate(),如果在这个阶段它为空,RuntimeException框架代码就会抛出一个讨厌的东西。

作为旁注,这可能不是您想要做的事情。我理解想要替换层次结构中看似无用的父级的原因,但可以保证的一件事是您的应用程序始终知道其父级是什么,因此可以正确地期望LayoutParams对其进行评估。使用 时<merge>,层次结构的根内容视图可能是FrameLayoutLinearLayout或其他,具体取决于设备上的 Android 版本,如果您希望 rootLayoutParams以特定方式运行,这可能会导致混淆行为。

于 2013-01-25T20:20:39.220 回答