How to Handle Button Click on Widget

╄→尐↘猪︶ㄣ 提交于 2019-12-03 23:07:41

问题


I've a widget on my app and Service in order to update automatically.

Widget has a ImageButton which triggers updating content manually. But I couldn't handle click event.

Here is my AppWidgetProvider:

public class MyWidget extends AppWidgetProvider {

    public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);

        RemoteViews rmViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

        Intent active = new Intent(context, MyWidget.class);
        active.setAction(ACTION_WIDGET_RECEIVER);
        active.putExtra("msg", "Message for Button 1");
        PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, active, 0);

        rmViews.setOnClickPendingIntent(R.id.buttonus1, configPendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds, rmViews );
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
            if(intent.getAction().equals(ACTION_WIDGET_RECEIVER)) {
                Log.d(debug_tag, intent.getAction());
            }
    }
}

When I clicked the button nothing changed. It doesn't even logged.

Manifest.xml declaration:

<receiver android:name=".MyWidget" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        <action android:name="com.app.example.MyWidget.ACTION_WIDGET_RECEIVER"/>
        </intent-filter>
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget"/>
</receiver>

What's wrong?

By the way, if I could handle the click, how should I use for updating manually? Do I pass it to service and which way?

Edit: Changed getActivity() with getBroadcast() and handled click well. But couldn't pass this message to Service. Any recommendations?


回答1:


Update your `AppWidgetProvider`:


public class MyWidget extends AppWidgetProvider {
        public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";

        public static int appid[];
        public static RemoteViews rview;
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
                int[] appWidgetIds){
            updateWidgetState(context, ""); 
        }
        @Override
        public void onReceive(Context paramContext, Intent paramIntent)
          {
             String str = paramIntent.getAction();
            if (paramIntent.getAction().equals(ACTION_WIDGET_RECEIVER)) {
                updateWidgetState(paramContext, str);   
            }
            else
            {
                    if ("android.appwidget.action.APPWIDGET_DELETED".equals(str))
                      {
                        int i = paramIntent.getExtras().getInt("appWidgetId", 0);
                        if (i == 0)
                        {

                        }
                        else
                        {
                            int[] arrayOfInt = new int[1];
                            arrayOfInt[0] = i;
                            onDeleted(paramContext, arrayOfInt);
                        }
                      }
              super.onReceive(paramContext, paramIntent);
            }
          }
         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);
          }
         private static RemoteViews buildUpdate(Context paramContext, String paramString)
          {
            // Toast.makeText(paramContext, "buildUpdate() ::"+paramString, Toast.LENGTH_SHORT).show();
            rview = new RemoteViews(paramContext.getPackageName(), R.layout.widget_layout);
            Intent active = new Intent(paramContext, MyWidget.class);
            active.setAction(ACTION_WIDGET_RECEIVER);
            active.putExtra("msg", "Message for Button 1");
            PendingIntent configPendingIntent = PendingIntent.getActivity(paramContext, 0, active, 0);
            rmViews.setOnClickPendingIntent(R.id.buttonus1, configPendingIntent);
            if(parmString.equals(ACTION_WIDGET_RECEIVER))
            {
             //your code for update and what you want on button click

            }  
             return rview; 
          }
        @Override
        public void onEnabled(Context context){
            super.onEnabled(context);
           // Toast.makeText(context, "onEnabled()  ", Toast.LENGTH_SHORT).show();
        }
        // Called each time an instance of the App Widget is removed from the host
        @Override
        public void onDeleted(Context context, int [] appWidgetId){
            super.onDeleted(context, appWidgetId);
           // Toast.makeText(context, "onDeleted()  ", Toast.LENGTH_SHORT).show();
        }
        // Called when last instance of App Widget is deleted from the App Widget host.
        @Override
        public void onDisabled(Context context) {
            super.onDisabled(context);
           // Toast.makeText(context, "onDisabled()  ", Toast.LENGTH_SHORT).show();
        }

    }



回答2:


public class MyWidget extends AppWidgetProvider {

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    RemoteViews remoteViews;
    ComponentName watchWidget;

    remoteViews = new RemoteViews(context.getPackageName(), R.layout.panic_widget_layout);
    watchWidget = new ComponentName(context, MyWidget .class);
    remoteViews.setOnClickPendingIntent(R.id.update, getPendingSelfIntent(context, SYNC_CLICKED));
    appWidgetManager.updateAppWidget(watchWidget, remoteViews);
}

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    super.onReceive(context, intent);

    if (SYNC_CLICKED.equals(intent.getAction())) {

        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

        RemoteViews remoteViews;
        ComponentName watchWidget;

        remoteViews = new RemoteViews(context.getPackageName(), R.layout.panic_widget_layout);
        watchWidget = new ComponentName(context, MyWidget .class);

        remoteViews.setTextViewText(R.id.update, "TESTING");
        customToast.showToast("manage your click here" ,context);
        appWidgetManager.updateAppWidget(watchWidget, remoteViews);

    }
}

protected PendingIntent getPendingSelfIntent(Context context, String action) {
    Intent intent = new Intent(context, getClass());
    intent.setAction(action);
    return PendingIntent.getBroadcast(context, 0, intent, 0);
}


来源:https://stackoverflow.com/questions/9633100/how-to-handle-button-click-on-widget

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!