複数のonclickpendingintentsをウィジェットに設定するにはどうすればよいですか?

user3289695

ユーザーがクリックしたウィジェット部分に応じて異なる処理を行う必要があるホーム画面ウィジェットを作成しています。これを実現するために、setOnClickPendingIntentを5回呼び出しますが、最後の呼び出しのみが機能します。ウィジェットのクリックイベントに5つの異なるインテントを設定するにはどうすればよいですか?

package bembibre.coolstar.windowsmobilewidget;

import java.util.Calendar;

import bembibre.coolstar.windowsmobilewidget.backend.CalendarProvider;
import bembibre.coolstar.windowsmobilewidget.backend.CallsProvider;
import bembibre.coolstar.windowsmobilewidget.backend.DateProvider;
import bembibre.coolstar.windowsmobilewidget.backend.MissedCallsContentObserver;
import bembibre.coolstar.windowsmobilewidget.backend.Provider;
import bembibre.coolstar.windowsmobilewidget.backend.SmssContentObserver;
import bembibre.coolstar.windowsmobilewidget.backend.SmssProvider;
import bembibre.coolstar.windowsmobilewidget.backend.WhatsappProvider;
import bembibre.coolstar.windowsmobilewidget.backend.alarms.AlarmSetter;

import android.app.IntentService;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog.Calls;
import android.widget.RemoteViews;
import android.widget.Toast;

public class ExtendedAppWidgetProvider extends AppWidgetProvider{
private MissedCallsContentObserver mcco;
private SmssContentObserver smsco;
private static final String WIDGET_CLICK = "element";

/**
 * Llama a la clase AlarmManager de Android para indicarle que esta aplicación
 * debe ser ejecutada automáticamente en la próxima medianoche. Como este
 * widget contiene la fecha (día, mes y año), cada vez que sea medianoche
 * debe ser ejecutado para que se actualice y cambie de día.
 */
public static void setDayChangeAlarm(Context context){
    AlarmSetter alarmSetter = new AlarmSetter(context);
    Calendar when = Calendar.getInstance();
    when.roll(Calendar.DAY_OF_MONTH, 1);
    when.set(Calendar.HOUR, 0);
    when.set(Calendar.HOUR_OF_DAY, 0);
    when.set(Calendar.MINUTE, 0);
    when.set(Calendar.SECOND, 0);
    when.set(Calendar.MILLISECOND, 0);
    alarmSetter.setAlarm(when);
}

@Override
public void onEnabled(Context context){
    super.onEnabled(context);
    setDayChangeAlarm(context);

    WhatsappProvider provider = new WhatsappProvider(context);
    provider.mDbHelper.open();
    provider.resetNoMessagesField();
    provider.mDbHelper.close();

    this.mcco = new MissedCallsContentObserver(context);
    context.getContentResolver().registerContentObserver(Calls.CONTENT_URI, true, this.mcco);

    this.smsco = new SmssContentObserver(context);
    context.getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, this.smsco);

    Toast.makeText(context, "Widget iniciado", Toast.LENGTH_SHORT).show();
}

@Override
public void onDisabled(Context context){
    if(this.mcco != null){
        context.getContentResolver().unregisterContentObserver(this.mcco);
    }
    if(this.smsco != null){
        context.getContentResolver().unregisterContentObserver(this.smsco);
    }
}

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction() == null) {
        new SmssProvider(context).setData();

        Bundle extras = intent.getExtras();
        if(extras != null){
            int element = extras.getInt(WIDGET_CLICK);
            switch(element){
                case R.id.widget_date:
                    Toast.makeText(context, "DATE", Toast.LENGTH_SHORT).show();
                    break;

                case R.id.widget_whatsapp:
                    Toast.makeText(context, "WHATSAPP", Toast.LENGTH_SHORT).show();
                    break;

                case R.id.widget_calendar:
                    Toast.makeText(context, "CALENDAR", Toast.LENGTH_SHORT).show();
                    break;

                case R.id.widget_calls:
                    Toast.makeText(context, "CALLS", Toast.LENGTH_SHORT).show();
                    break;

                case R.id.widget_messages:
                    Toast.makeText(context, "MESSAGES", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    } else {
        super.onReceive(context, intent);
    }
}

@Override
public void onUpdate(Context context, AppWidgetManager
appWidgetManager, int[] appWidgetIds) {
    context.startService(new Intent(context,
    ListItemClickService.class));

    setDayChangeAlarm(context);

    /*
     * Para evitar que se muestren eventos del calendario que
     * comienzan en una fecha ya pasada, los actualizamos cada vez
     * que pase un cierto periodo de tiempo y se llame a este
     * método, onUpdate.
     */
    new CalendarProvider(context).setData();

    /*
     * Para evitar que en la parte de mensajes SMS se muestren mensajes ya
     * leídos, la actualizamos periódicamente.
     */
    new SmssProvider(context).setData();
}

// TODO Hacer que no pueda haber más de una instancia de este IntentService
// ejecutándose a la vez.
public static class ListItemClickService extends IntentService {
    public ListItemClickService() {
        super("ExtendedAppWidgetProvider$ListItemClickService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        ComponentName me = new ComponentName(this, ExtendedAppWidgetProvider.class);
        AppWidgetManager mgr = AppWidgetManager.getInstance(this);
        mgr.updateAppWidget(me, buildUpdate(this));
    }

    private void setOnClickPendingIntent(RemoteViews updateViews, int element,
        Context context){

        Intent i = new Intent(this, ExtendedAppWidgetProvider.class);
        i.putExtra(WIDGET_CLICK, element);

        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        updateViews.setOnClickPendingIntent(element, pi);
    }

    private RemoteViews buildUpdate(Context context) {
        RemoteViews updateViews = new
        RemoteViews(context.getPackageName(), R.layout.widget_list);

        Provider dateProvider = new DateProvider(context);
        WhatsappProvider whatsappProvider = new WhatsappProvider(context);
        Provider calendarProvider = new CalendarProvider(context);
        Provider callsProvider = new CallsProvider(context);
        Provider smssProvider = new SmssProvider(context);

        updateViews.setTextViewText(R.id.date, dateProvider.getText());
        updateViews.setTextViewText(R.id.whatsapp, whatsappProvider.getSpannedText());
        updateViews.setTextViewText(R.id.calendar, calendarProvider.getText());
        updateViews.setTextViewText(R.id.calls, callsProvider.getText());
        updateViews.setTextViewText(R.id.messages, smssProvider.getText());

        this.setOnClickPendingIntent(updateViews, R.id.widget_date, context);
        this.setOnClickPendingIntent(updateViews, R.id.widget_whatsapp, context);
        this.setOnClickPendingIntent(updateViews, R.id.widget_calendar, context);
        this.setOnClickPendingIntent(updateViews, R.id.widget_calls, context);
        this.setOnClickPendingIntent(updateViews, R.id.widget_messages, context);

        return updateViews;
    }
}
}
CommonsWare

ウィジェットのクリックイベントに5つの異なるインテントを設定するにはどうすればよいですか?

最も簡単な解決策は、getBroadcast()呼び出しの2番目のパラメーターに異なる値を指定して、5つの異なる値を指定することですPendingIntentsgetBroadcast()(とgetActivity()getService())のみ、新規に作成PendingIntentすでに存在しない場合、そしてあなたのケースでは、あなたの最初のgetBroadcast()呼び出しは、それを作成します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

テキストウィジェットを使用して複数行のテキストを設定するにはどうすればよいですか?

分類Dev

appBarLayoutの上にCardViewウィジェットを設定するにはどうすればよいですか?

分類Dev

SplitLayoutPanelで中央ウィジェットの「setWidgetSize」を設定するにはどうすればよいですか?

分類Dev

QDateEditウィジェットで設定されたユーザー値を別の関数で使用するにはどうすればよいですか?

分類Dev

jQueryカレンダーウィジェットの地域設定を適切に設定するにはどうすればよいですか?

分類Dev

Prestashop1.6でのアカウント作成に複数のチェックボックスを設定するにはどうすればよいですか。

分類Dev

MacOSのPythonTkinterチェックボタンウィジェット:テキストの色を設定するにはどうすればよいですか

分類Dev

内部のタブ/ウィジェットに影響を与えずにQTabWidgetのスタイルを設定するにはどうすればよいですか?

分類Dev

Kivyウィジェットの位置プラットフォームを個別に設定するにはどうすればよいですか?

分類Dev

QT-Designerからウィジェットにデフォルトの可視性値を設定するにはどうすればよいですか?

分類Dev

コード内のテキストの色をAndroidウィジェットに設定するにはどうすればよいですか?

分類Dev

KV langで親からカスタムウィジェットのテキストを設定するにはどうすればよいですか?

分類Dev

Flutter Chipウィジェットの上下の余白をゼロに設定するにはどうすればよいですか?

分類Dev

Androidでタブウィジェットインジケーターの高さを設定するにはどうすればよいですか?

分類Dev

ウィジェットのボタンに画像を設定するにはどうすればよいですか?

分類Dev

tkinter Scaleウィジェットの状態を無効に設定するにはどうすればよいですか?

分類Dev

tkinterで複数のボタンを1つのテキストウィジェットにリンクするにはどうすればよいですか?

分類Dev

IPythonウィジェットのデフォルト値を設定するにはどうすればよいですか?

分類Dev

Matplotlibウィジェット(navBar / canvas)のPyQT4スタイルシートを設定するにはどうすればよいですか?

分類Dev

WTForms:HTML5ウィジェットのデフォルト値を設定するにはどうすればよいですか?

分類Dev

Windowsでウィジェットのテーマを設定するにはどうすればよいですか?

分類Dev

Tkinter.Textウィジェットのスクロールバーの幅を設定するにはどうすればよいですか?

分類Dev

カスタムウィジェットの背景色と境界線の幅を設定するにはどうすればよいですか?

分類Dev

Dojoウィジェットの内部入力要素のIDを設定するにはどうすればよいですか?

分類Dev

スクロールビューに複数のウィジェットを同時に追加するにはどうすればよいですか?

分類Dev

設計段階で非表示にするウィジェットを定義するにはどうすればよいですか?

分類Dev

単一の変数の下にドロップダウンリストに複数の値を設定するにはどうすればよいですか?

分類Dev

tkinterを使用して複数のウィジェットを1行に並べて配置するにはどうすればよいですか?

分類Dev

ウィジェットをビルドする前に共有設定データを取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    テキストウィジェットを使用して複数行のテキストを設定するにはどうすればよいですか?

  2. 2

    appBarLayoutの上にCardViewウィジェットを設定するにはどうすればよいですか?

  3. 3

    SplitLayoutPanelで中央ウィジェットの「setWidgetSize」を設定するにはどうすればよいですか?

  4. 4

    QDateEditウィジェットで設定されたユーザー値を別の関数で使用するにはどうすればよいですか?

  5. 5

    jQueryカレンダーウィジェットの地域設定を適切に設定するにはどうすればよいですか?

  6. 6

    Prestashop1.6でのアカウント作成に複数のチェックボックスを設定するにはどうすればよいですか。

  7. 7

    MacOSのPythonTkinterチェックボタンウィジェット:テキストの色を設定するにはどうすればよいですか

  8. 8

    内部のタブ/ウィジェットに影響を与えずにQTabWidgetのスタイルを設定するにはどうすればよいですか?

  9. 9

    Kivyウィジェットの位置プラットフォームを個別に設定するにはどうすればよいですか?

  10. 10

    QT-Designerからウィジェットにデフォルトの可視性値を設定するにはどうすればよいですか?

  11. 11

    コード内のテキストの色をAndroidウィジェットに設定するにはどうすればよいですか?

  12. 12

    KV langで親からカスタムウィジェットのテキストを設定するにはどうすればよいですか?

  13. 13

    Flutter Chipウィジェットの上下の余白をゼロに設定するにはどうすればよいですか?

  14. 14

    Androidでタブウィジェットインジケーターの高さを設定するにはどうすればよいですか?

  15. 15

    ウィジェットのボタンに画像を設定するにはどうすればよいですか?

  16. 16

    tkinter Scaleウィジェットの状態を無効に設定するにはどうすればよいですか?

  17. 17

    tkinterで複数のボタンを1つのテキストウィジェットにリンクするにはどうすればよいですか?

  18. 18

    IPythonウィジェットのデフォルト値を設定するにはどうすればよいですか?

  19. 19

    Matplotlibウィジェット(navBar / canvas)のPyQT4スタイルシートを設定するにはどうすればよいですか?

  20. 20

    WTForms:HTML5ウィジェットのデフォルト値を設定するにはどうすればよいですか?

  21. 21

    Windowsでウィジェットのテーマを設定するにはどうすればよいですか?

  22. 22

    Tkinter.Textウィジェットのスクロールバーの幅を設定するにはどうすればよいですか?

  23. 23

    カスタムウィジェットの背景色と境界線の幅を設定するにはどうすればよいですか?

  24. 24

    Dojoウィジェットの内部入力要素のIDを設定するにはどうすればよいですか?

  25. 25

    スクロールビューに複数のウィジェットを同時に追加するにはどうすればよいですか?

  26. 26

    設計段階で非表示にするウィジェットを定義するにはどうすればよいですか?

  27. 27

    単一の変数の下にドロップダウンリストに複数の値を設定するにはどうすればよいですか?

  28. 28

    tkinterを使用して複数のウィジェットを1行に並べて配置するにはどうすればよいですか?

  29. 29

    ウィジェットをビルドする前に共有設定データを取得するにはどうすればよいですか?

ホットタグ

アーカイブ