0

ユーザーが問題を抱えていたキューカードのセットをゆっくりと回転/反復する単純なウィジェットを作成しようとしています (Windows Phone のライブタイルに似ています)。

ウィジェットを作成でき、「何もロードされていません」などと言うように設定したデフォルトのテキストが表示され、コールバックを取得していますが、ウィジェットのテキストは更新されません。

Android ドキュメントとスタック オーバーフローを精査しましたが、答えが見つかりません。ComponentName が間違っているのではないかと考えたので、ウィジェット マネージャーでウィジェットの配列を取得し、それらを反復処理しました。ウィジェットのリストを取得するので、正しいようです...

私は何を間違っていますか?

どうもありがとう、豚

public class MistakeArchiveWidgetProvider extends AppWidgetProvider 
{
  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
      int[] appWidgetIds)
  {
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 60000);

    // When the widget is clicked, launch the app.
    for (int i = 0; i < appWidgetIds.length; i++) 
    {
        int appWidgetId = appWidgetIds[i];

        Intent intent = new Intent(context, QuizActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

        // Get the layout for the App Widget and attach an on-click listener
        // to the button
        RemoteViews views = new RemoteViews(context.getPackageName(),
            R.layout.mistake_archive_widget);
        views.setOnClickPendingIntent(R.id.STATIC_CUE, pendingIntent);
        views.setOnClickPendingIntent(R.id.STATIC_ANSWER, pendingIntent);

        // Tell the AppWidgetManager to perform an update on the current app widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
  }

  private class MyTime extends TimerTask
  {
    public MyTime(Context context, AppWidgetManager appWidgetManager)
    {
      this.m_appWidgetManager = appWidgetManager;
      m_remoteViews = new RemoteViews(context.getPackageName(), 
          R.layout.mistake_archive_widget);

      m_componentName = new ComponentName(context, MistakeArchiveWidgetProvider.class);
      m_context = context;
    }

    @Override
    public void run()
    {
      MistakeArchive archive = new MistakeArchive();
      if(archive.restoreState(m_context))
      {
        SharedPreferences prefs = 
            PreferenceManager.getDefaultSharedPreferences(m_context);

        int activeIndex = prefs.getInt(
            MyPrefs.PREFKEY_ACTIVE_MISTAKE_ARCHIVE_HASH_INDEX, 0);

        activeIndex++;
        SharedPreferences.Editor editor = prefs.edit();
        editor.putInt(MyPrefs.PREFKEY_ACTIVE_MISTAKE_ARCHIVE_HASH_INDEX, 
            activeIndex);
        editor.commit();

        CueLine cueLine = archive.getMistake(activeIndex);
        if(cueLine != null)
        {
          m_remoteViews.setTextViewText(R.id.STATIC_CUE, cueLine.GetCue());
          m_remoteViews.setViewVisibility(R.id.STATIC_CUE, View.VISIBLE);
          m_remoteViews.setTextViewText(R.id.STATIC_ANSWER, cueLine.GetAnswer());

          int[] appWidgetIds = m_appWidgetManager.getAppWidgetIds(m_componentName);
          for (int i = 0; i < appWidgetIds.length; i++) 
          {
            m_appWidgetManager.updateAppWidget(i, m_remoteViews);
          }
        }
      }
    }

    RemoteViews m_remoteViews;
    AppWidgetManager m_appWidgetManager;
    ComponentName m_componentName;
    Context m_context;
  }
}

私のマニフェストxmlには次のものがあります:

 <receiver android:name="myApp.MistakeArchiveWidgetProvider" android:label="@string/IDST_APP_NAME">
   <intent-filter>
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
   </intent-filter>
   <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/mistake_archive_widget_provider" />
 </receiver>

miss_archive_widget_provider.xml:

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

miss_archive_widget.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:orientation="vertical"
    android:background="@drawable/widget_background"
    >

        <TextView
            android:id="@+id/STATIC_CUE"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:gravity="center"
            android:layout_weight="1"
            android:textStyle="bold"
            android:visibility="gone" 
            android:text=""
            />

        <TextView android:id="@+id/STATIC_ANSWER"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:gravity="center"
                  android:layout_weight="1"
                  android:text="@string/IDST_NO_CUES_LOADED"
                  />

</LinearLayout>
4

1 に答える 1

0

わかりました: TimerTask を使用しないでください。これは期待どおりに機能しません。このようにするように言われたどこかの例に従っていたと確信していますが、よく考えてみると、欠陥があるように見えます。

onUpdate() で行われるようにすべてを変更し、すべてのタイマーのものを削除しました。Android は、この関数を最大 30 分ごとに呼び出します。

今もとてもシンプルです:)

解決:

public class MistakeArchiveWidgetProvider extends AppWidgetProvider 
{
  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
      int[] appWidgetIds)
  {
    // When the widget is clicked, launch the app.
    for (int widgetIndex = 0; widgetIndex < appWidgetIds.length; widgetIndex++) 
    {
      int appWidgetId = appWidgetIds[widgetIndex];

      RemoteViews views = new RemoteViews(context.getPackageName(),
          R.layout.mistake_archive_widget);

      // Get the layout for the App Widget and attach an on-click listener.
      {
        Intent intent = new Intent(context, QuizActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

        views.setOnClickPendingIntent(R.id.STATIC_CUE, pendingIntent);
        views.setOnClickPendingIntent(R.id.STATIC_ANSWER, pendingIntent);
      }

      views.setTextViewText(R.id.STATIC_CUE, cueString);
      views.setTextViewText(R.id.STATIC_ANSWER, cueAnswer);

      // Tell the AppWidgetManager to perform an update on the current app widget
      appWidgetManager.updateAppWidget(appWidgetId, views);
    }
  }
}
于 2012-05-29T16:57:04.170 に答える