3

前へ/次への 2 つのテキストビューと 2 つのボタンを持つシンプルなアプリ ウィジェットを設計したいと考えています。アプリ ウィジェットでのボタン クリックの処理が難しくなっています。実際に私の望みは、ユーザーが前のボタンをクリックすると前の値を表示し、ユーザーが次のボタンをクリックするとデータベースから次の値を表示したいということです。どのボタンがクリックされたかを知るには?ここで、このようなボタンクリックリスナーを登録します

  public static class UpdateWidgetService extends IntentService {

    public UpdateWidgetService() {
        super("UpdateWidgetService");

    }

    @Override
    protected void onHandleIntent(Intent intent) {
        AppWidgetManager appWidgetManager = AppWidgetManager
                .getInstance(this);

        int incomingAppWidgetId = intent.getIntExtra(EXTRA_APPWIDGET_ID,
                INVALID_APPWIDGET_ID);
        if (incomingAppWidgetId != INVALID_APPWIDGET_ID) {
            updateOneAppWidget(appWidgetManager, incomingAppWidgetId);

        }

    }


    private void updateOneAppWidget(AppWidgetManager appWidgetManager,
            int appWidgetId) {
        DatabaseManager dbManager = new DatabaseManager(this);

        dbManager.open();
        String contactNumber, date, status, message;
        ArrayList<QueuedMessage> listOfQuedMessage =        (ArrayList<QueuedMessage>) dbManager
                .fetchContactNumber();
        if (listOfQuedMessage.size() == 0)
            Log.i("Db", "null");
        else{
        date = dbManager.fetchDate();
        message = dbManager.fetchMessage();
        status = dbManager.fetchStatus();

        dbManager.closeDatabase();

        RemoteViews views = new RemoteViews(this.getPackageName(),
                R.layout.schdulesms_appwidget_layout);
        views.setTextViewText(R.id.to_appwidget_saved_data,
                listOfQuedMessage.get(count).contacNumber);
        views.setTextViewText(R.id.date_appwidget_saved_data, date);
        views.setTextViewText(R.id.status_appwidget_saved, status);
        views.setTextViewText(R.id.message_appwidgset_saved_data, message);

                    **//here i want do**
                   if(button1){
               btnNxtClick(views, appWidgetId,listOfQuedMessage.size());
                    }else{
                 btPrevClick(views, appWidgetId, listOfQuedMessage.size());
                    }

        appWidgetManager.updateAppWidget(appWidgetId, views);
        }

    }

    private void btnNxtClick(RemoteViews views, int appWidgetId,int sizeOfList) {
        Intent btnNextIntent = new Intent(this, this.getClass());
        btnNextIntent.putExtra(EXTRA_APPWIDGET_ID, appWidgetId);
        PendingIntent btnNextPendingIntent = PendingIntent.getService(this,
                0, btnNextIntent,    PendingIntent.FLAG_UPDATE_CURRENT);
        views.setOnClickPendingIntent(R.id.btnNext, btnNextPendingIntent);

    }
    private void btPrevClick(RemoteViews views, int appWidgetId,int sizeOfList) {
        Intent btnNextIntent = new Intent(this, this.getClass());
        btnNextIntent.putExtra(EXTRA_APPWIDGET_ID, appWidgetId);
        PendingIntent btnNextPendingIntent = PendingIntent.getService(this,
                0, btnNextIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        views.setOnClickPendingIntent(R.id.btnPrev, btnNextPendingIntent);

    }

}

誰でもこの問題から私を助けることができますか?? ありがとう

4

1 に答える 1

9

どのボタンがクリックされたかを知るには、次の手順に従います。

ステップ 1: btnNext と btnPrev の 2 つの受信者を登録する

 <intent-filter >
 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
 <action android:name="com.app.example.MyWidget.ACTION_WIDGET_CLICK_NEXT"/>
 <action android:name="com.app.example.MyWidget.ACTION_WIDGET_CLICK_PREV"/>
 </intent-filter>

ステップ 2: btnNext および btnPrev アクション文字列の場合:

public class MyWidget extends AppWidgetProvider {
public static String ACTION_WIDGET_CLICK_NEXT = "Action_nextbtn";
public static String ACTION_WIDGET_CLICK_PREV = "Action_prevbtn";
}

ステップ 3: onReceive で

@Override
        public void onReceive(Context paramContext, Intent paramIntent)
        {
          String str = paramIntent.getAction();
            if (paramIntent.getAction().equals(ACTION_WIDGET_CLICK_NEXT)) {
                updateWidgetState(paramContext, str);   
            }
            if (paramIntent.getAction().equals(ACTION_WIDGET_CLICK_PREV)) {
                updateWidgetState(paramContext, str);   
            }
        }

ステップ 4: ウィジェットの状態を更新するメソッドを作成します。

static void updateWidgetState(Context paramContext, String paramString)
          {
            RemoteViews localRemoteViews = buildUpdate(paramContext, paramString);
            ComponentName localComponentName = new ComponentName(paramContext, MyWidget.class);
            AppWidgetManager.getInstance(paramContext).updateAppWidget(localComponentName, localRemoteViews);
          }

ステップ 5:

private static RemoteViews buildUpdate(Context paramContext, String paramString)
          {

            rview = new RemoteViews(paramContext.getPackageName(), R.layout.widget_layout);
            Intent activebtnnext = new Intent(paramContext, MyWidget.class);
            active.setAction(ACTION_WIDGET_CLICK_NEXT);
            PendingIntent configPendingIntentnext = PendingIntent.getBroadcast(paramContext, 0, activebtnnext , 0);
            rmViews.setOnClickPendingIntent(R.id.btnNext, configPendingIntentnext);

            Intent activeprevbtn = new Intent(paramContext, MyWidget.class);
            active.setAction(ACTION_WIDGET_CLICK_PREV);
            PendingIntent configPendingIntentprev = PendingIntent.getBroadcast(paramContext, 0, activeprevbtn , 0);
            rmViews.setOnClickPendingIntent(R.id.btnprev, configPendingIntentprev);
            if(parmString.equals(ACTION_WIDGET_CLICK_NEXT))
            {

             //

            }  
            if(parmString.equals(ACTION_WIDGET_CLICK_PREV))
            {

             //

            }           
             return rview; 
          }
于 2012-04-11T06:08:56.050 に答える