我试图将小部件添加到我的应用中,但我遇到了问题。每当我抓住小部件并将其放在我的主屏幕上时,它就会消失。我只能看到它约0.5秒。这是代码:
的Manifest.xml
<receiver
android:label="MyApp"
android:name=".widget.MyWidgetProvider" >
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_info" />
</receiver>
MyWidgetProvider.java
public class MyWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
//IDs
for (int i=0; i<appWidgetIds.length; i++) {
int currentWidgetId = appWidgetIds[i];
// Create data
SharedPreferences prefs = context.getSharedPreferences("com.example.app_preferences", 0);
int number = prefs.getInt("progress", 0);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.appwidget);
Log.w("WidgetExample", String.valueOf(number));
// Set the text
remoteViews.setTextViewText(R.id.widgettext, String.valueOf(number));
// Register an onClickListener
Intent intent = new Intent(context, MyWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.widgettext, pendingIntent);
appWidgetManager.updateAppWidget(currentWidgetId, remoteViews);
Toast.makeText(context, "widget added", Toast.LENGTH_SHORT).show();
}
}
}
appwidget.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widgetlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/widgetimage" >
<TextView
android:id="@+id/widgettext"
style="@android:style/TextAppearance.Medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</RelativeLayout>
widget_info.xml
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:updatePeriodMillis="86400000"
android:minWidth="120dp"
android:minHeight="50dp"
android:initialLayout="@layout/appwidget"
android:previewImage="@drawable/widgetimage"
android:configure="com.example.app.widget.MyWidgetProvider" >
</appwidget-provider>
你可以看到java文件的最后一行包含一个toast。这个toast实际上被调用,并且logcat中没有任何错误。
谢谢!
答案 0 :(得分:1)
你是android:configure元素必须引用一个允许配置你的小部件的活动。此活动必须将结果设置为RESULT_OK,否则将取消配置并删除窗口小部件。
我认为引用窗口小部件提供程序而不是活动与从配置活动返回RESULT_CANCEL具有相同的效果。
如果您没有配置活动,只需删除此条目即可添加小部件,而无需尝试打开此小部件。
答案 1 :(得分:0)
除了3c71的答案之外的另一种可能性是您可能忘记使用setResult(int resultCode, Intent data)
的双参数版本。 data
参数必须包含标识窗口小部件ID的EXTRA。
Intent intent = new Intent();
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, intent);
sendBroadcast(intent);
小部件ID作为Intent中的EXTRA提供给配置活动,该活动在调用时提供给活动。检索它并将其存储为:
mAppWidgetId = getIntent().getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);