【问题标题】:Set content view in Activity with merge tag as root?在活动中设置内容视图,合并标签为根?
【发布时间】:2013-01-25 16:42:32
【问题描述】:

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

【问题讨论】:

  • 我认为问题出在这个com.my.layout 布局上。我可以知道你是如何声明的吗?
  • 不,不是。您也可以使用 LinearLayout 重现它。

标签: android merge android-framelayout


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    很好奇,这种行为似乎并非普遍适用。我可以在模拟器或我的一个 Nexus 设备上运行一个简单的示例,并且应用程序可以毫无问题地使用 &lt;merge&gt; 标记作为层次结构的根的主布局。你能在多台设备上重现这个吗?

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

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

    附带说明,这可能不是您想做的事情。我理解想要替换层次结构中看似无用的父级的原因,但可以保证的一件事是您的应用程序始终知道其父级是什么,因此它可以正确地期望 LayoutParams 被评估。使用 &lt;merge&gt; 时,层次结构的根内容视图可能是 FrameLayoutLinearLayout 或其他取决于设备上的 Android 版本,如果您希望 root LayoutParams以特定的方式行事。

    【讨论】:

    • HoloEverywhere 就是这样,无论如何感谢您的全面回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    相关资源
    最近更新 更多