Android自定义布局抛出android.view.InflateException

时间:2012-10-16 17:45:21

标签: android android-layout android-widget

我正在尝试为小部件创建方形布局。

我有以下布局类:

package com.trollhammaren;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.LinearLayout;

public class SquareLayout extends LinearLayout {

    // constructors
    public SquareLayout(Context context) {
        super(context);
    }

    public SquareLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    // methods
    @Override
    protected void onMeasure(int width, int height) {
        Log.v("widget", "resized");
        super.onMeasure(width, height);
    }
}

以下xml:

<?xml version="1.0" encoding="utf-8"?>
<com.trollhammaren.SquareLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="8dip"
    android:background="@drawable/myshape" >
</com.trollhammaren.SquareLayout>

我看到一个带有“问题加载小部件”文本的矩形小部件,而不是正方形。当我放置小部件时,我在logcat中看到以下消息:

错误膨胀AppWidget AppWidgetProviderInfo(provider = ComponentInfo {com.trollhammaren.wakeonlandroid / com.trollhammaren.wakeonlandroid.WidgetProvider}):android.view.InflateException:二进制XML文件行#2:错误膨胀类com.trollhammaren.SquareLayout < / p>

如果我将布局更改为LinearLayout,我会看到一个正常的LinearLayout,但它不是正方形。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

在窗口小部件内部,您只能拥有标记为RemoteViews的视图和布局。所以我认为您不能将自己的自定义类发送到AppWidget上下文。必须只使用操作系统版本中以这种方式标记的视图。

要清楚这些工作的方式,托管Widget的上下文不是您的过程。因此,AppWidget的上下文基本上通过类似于RPC的机制将所有内容从您的应用程序发送到另一个上下文的视图。如果它支持自定义小部件,这将允许您基本上将任意代码发送到其他应用程序进程并承担比我打赌他们真正希望您拥有的更多权限。此外,对于IPC来说这将是令人讨厌的,因为您需要将整个类层次结构包裹起来并将其加载到单独的类加载器中,所有这些只是为了保证依赖性得到维护。