2

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

我有以下布局类:

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: Binary XML file line #2: Error inflating class com.trollhammaren.SquareLayout

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

我究竟做错了什么?

4

1 回答 1

2

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

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

于 2012-10-16T20:12:18.570 回答