Android - Widget在放置时立即消失

时间:2015-01-12 21:15:11

标签: java android xml widget

我试图将小部件添加到我的应用中,但我遇到了问题。每当我抓住小部件并将其放在我的主屏幕上时,它就会消失。我只能看到它约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中没有任何错误。

谢谢!

2 个答案:

答案 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);