导致AppWidget出错

时间:2011-10-27 12:55:33

标签: android widget android-appwidget inflate

我第一次做一个简单的小部件,看起来我正在使用的教程有一些缺失,因为我的LogCat在弹出窗口小部件列表中选择它时会出现“Error inflating AppWidget”。

根据教程,我做了这些。

布局:          

<TextView android:id="@+id/widget_textview" android:text="@string/widget_text"
    android:layout_height="wrap_content" android:layout_width="wrap_content"
    android:layout_gravity="center_horizontal|center"
    android:layout_marginTop="5dip" android:padding="10dip"
    android:textColor="@android:color/black" />
</LinearLayout>

类别:

package hello.widget;

import android.appwidget.AppWidgetProvider;

public class HelloWidget extends AppWidgetProvider {
}

的字符串:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Hello Widget</string>
    <string name="widget_text">Hello Widget!</string>
</resources>

小工具提供商:

<?xml version="1.0" encoding="utf-8"?>
appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android">
    android:minWidth="146dip"
    android:minHeight="72dip"
    android:updatePeriodMillis="10000"
    android:initialLayout="@layout/main"
</appwidget-provider>

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="hello.widget" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="3" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">

    <!-- Broadcast Receiver that will process AppWidget updates -->
    <receiver android:name="hello.widget.HelloWidget" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/hello_widget_provider" />
    </receiver>

    </application>
</manifest>

2 个答案:

答案 0 :(得分:1)

您错过了布局文件中的空缺<LinearLayout>。你在这里所拥有的甚至不应该编译。

您也错过了AppWidgetProvider的整个实施。您需要实现onUpdate()来指定应用小部件应显示的内容。

此外,您的updatePeriodMillis比允许的时间短 - 您无法以这种方式每10秒更新一次应用小部件。

另外,请确保您的布局名为main.xml,或更新android:initialLayout以反映布局的正确名称。

答案 1 :(得分:1)

我的解决方案:

public void onReceive(Context context, Intent intent)
{
    String action = intent.getAction();

    if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action))
    {   
        long days = (((calendar.getTimeInMillis()- date1.getTime())/1000))/86400;
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);

        //Intent AlarmClockIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER).setComponent(new ComponentName("com.android.alarmclock", "com.android.alarmclock.AlarmClock"));
        // PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, AlarmClockIntent, 0);
        Intent Date_Change= new Intent(Intent.ACTION_DATE_CHANGED);
        PendingIntent pendingIntent2=PendingIntent.getActivity(context,0, Date_Change, 0);

        views.setOnClickPendingIntent(R.id.textView1, pendingIntent2);
        views.setTextViewText(R.id.textView1,""+days);

        //views.setOnClickPendingIntent(R.id.AnalogClock, pendingIntent);

        //AppWidgetManager.getInstance(context).updateAppWidget(intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS), views);
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        ComponentName thisWidget = new ComponentName(context, Widget.class);
        appWidgetManager.updateAppWidget(thisWidget, views);
    }
}