Handling a button click in a home screen widget

落花浮王杯 提交于 2019-12-11 14:15:09

问题


I am trying to make a home screen widget which will toggle on and off the gps (Location in settings). I still don't understand how to handle a button click event.

I took this code from a tutorial online.

public class LocationWidget extends AppWidgetProvider {
private static String SYNC_CLICKED = "automaticWidgetSyncButtonClick";

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    final int count = appWidgetIds.length;
    String status;
    LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

    for (int i = 0; i < count; i++) {
        int widgetId = appWidgetIds[i];
        if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            status = "OFF";
        } else {
            status = "ON";
        }
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.activity_main);
        remoteViews.setTextViewText(R.id.textView, status);

        Intent intent = new Intent(context, LocationWidget.class);
        intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.actionButton, pendingIntent);
        appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }
}

public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.activity_main);
    remoteViews.setTextViewText(R.id.textView, "Button clicked");
    Log.v("ACTION", intent.getAction());
}

}

Inside onReceive, Log.v returns "ACTION﹕android.appwidget.action.APPWIDGET_UPDATE". So I need help to make the button behave the way i want when clicked. Can someone explain how and why?


回答1:


i will open my heplactivity you can change and add your setting intent

appwidget.java

public class MyWidget extends AppWidgetProvider {
        Button btnhelp;

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

            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
            Intent configIntent = new Intent(context, HelpActivity.class);
            PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0);
            remoteViews.setOnClickPendingIntent(R.id.btnhelp, configPendingIntent);
            appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
        }
    }

manifest

<receiver android:name=".MyWidget">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/widget_info" />
    </receiver>

resource xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/widget_layout"
    android:minHeight="70dp"
    android:minWidth="70dp"
    android:updatePeriodMillis="300000"></appwidget-provider>

layout xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="8dip"
    android:background="@drawable/ic_dashboard_help"
    android:clickable="true">

    <Button
        android:id="@+id/btnhelp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_margin="4dip"
        android:background="@android:color/transparent" />

</LinearLayout> 



回答2:


I got it.

public class LocationWidget extends AppWidgetProvider {
    public static String WIDGET_BUTTON = "MY_PACKAGE_NAME.WIDGET_BUTTON";

    private static final String ACTION_CLICK = "ACTION_CLICK";

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int count = appWidgetIds.length;
        String status;
        LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        for (int i = 0; i < count; i++) {
            int widgetId = appWidgetIds[i];
            if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                status = "OFF";
            } else {
                status = "ON";
            }
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.activity_main);


            if (status == "ON") {
                remoteViews.setInt(R.id.actionButton, "setBackgroundColor", Color.GREEN);
                remoteViews.setTextViewText(R.id.actionButton, "Location Service On");
            }
            if (status == "OFF") {
                remoteViews.setInt(R.id.actionButton, "setBackgroundColor", Color.RED);
                remoteViews.setTextViewText(R.id.actionButton, "Location Service Off");
            }
            Intent intent = new Intent(context, LocationWidget.class);
            intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

            String buttonclick = "buttonclick";

            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.actionButton, getPendingSelfIntent(context, buttonclick));

            appWidgetManager.updateAppWidget(widgetId, remoteViews);
        }
    }

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

    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.activity_main);


        if (intent.getAction() == "buttonclick") {
            Log.v("ACTION", "buttonclick");

            Intent callGPSSettingIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            callGPSSettingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(callGPSSettingIntent);


        }


    }




}



回答3:


You should be able to do

if( intent.getAction() == <action_type> ) { /*Handling code here*/ }



来源:https://stackoverflow.com/questions/34148103/handling-a-button-click-in-a-home-screen-widget

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