0

アプリケーションが起動したら、リストビューと最初のアイテムを使用してアクティビティを呼び出します。私のウィジェットは、onUpdate() の listView に新しい 1 つの項目を追加します。

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

           RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main_widget);
           myString = context.getResources().getStringArray(R.array.quotes); 

           Intent active = new Intent(context, Widget.class);
           active.setAction(ACTION_WIDGET_RECEIVER);

           Intent archive = new Intent(context, Widget.class);
           archive.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           archive.setAction(ACTION_WIDGET_ARCHIVE);

           String q = myString[rgenerator.nextInt(myString.length)];
           active.putExtra("msg", q);
           if (getQuotes(context).size()>1)
           remoteViews.setTextViewText(R.id.widget_textview, q);

           PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0);
           PendingIntent archivePendingIntent = PendingIntent.getBroadcast(context, 0, archive,PendingIntent.FLAG_UPDATE_CURRENT);

           remoteViews.setOnClickPendingIntent(R.id.widgetFrameLayout, archivePendingIntent);
           Time now = new Time();
           now.setToNow();
           String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());

           // adding new item to the listView
           saveQuote(context, q, mydate);
           appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
      }

ユーザーがウィジェットを画面に追加すると、もう 1 つの項目が自動的にリストに追加されます。android:updatePeriodMillisしかし、期間が過ぎてから追加する必要があります。どうすればこれを実装できますか?

4

1 に答える 1

0

私は次のように解決しました: SharedPreferences を使用して 2 つのメソッドを作成し、現在実行中のメソッドのフラグを設定しました:

 private void setWidgetActive(Context context, boolean active,String field){
        Context appContext = context.getApplicationContext();
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
        SharedPreferences.Editor edit = prefs.edit();
        edit.putBoolean(field, active);
        edit.commit();
    }
  private boolean getWidgetActive(Context context, String field)
  {
      Context appContext = context.getApplicationContext();
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
    return prefs.getBoolean(field, false);
  }

次に、私の onEnabled メソッド:

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        setWidgetActive(context,true, WIDGET_ACTIVE);
    }

onUpdate メソッドで:

  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
      setWidgetActive(context,true, WIDGET_UPDATE);
      if (getWidgetActive(context, WIDGET_UPDATE) & !getWidgetActive(context, WIDGET_ACTIVE))
       {
           myString = context.getResources().getStringArray(R.array.quotes); 
           q = myString[rgenerator.nextInt(myString.length)];
           mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
           saveQuote(context, q, mydate);
       }
       else
       {
          ArrayList<Quote> importList = getQuotes(context);
          q = importList.get(importList.size() - 1).getText();
          mydate = importList.get(importList.size() - 1).getDate();
          setWidgetActive(context,false, WIDGET_ACTIVE);

       }
}

そのため、ウィジェットが今追加された場合、getWidgetActive(context, WIDGET_ACTIVE) は true を返し、データベースの最後に追加されたフィールドを取得してウィジェットの TextView に送信します。その場合、定義された時間が経過すると、配列から新しいランダム文字列を取得してデータベースに保存し、TextView にも送信します。

于 2013-04-28T09:16:09.707 に答える