【问题标题】:How to manually call `onUpdate` from within the widget itself如何从小部件本身手动调用`onUpdate`
【发布时间】:2016-11-24 01:54:05
【问题描述】:
public class VWid extends AppWidgetProvider {

    public static String WIDGET_UPDATE = "WIDGET_UPDATE";

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);

        if (WIDGET_UPDATE.equals(intent.getAction())) {
            Toast.makeText(context, "onReceiver()", Toast.LENGTH_LONG).show();
        }
    }

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this
        // provider
        for (int i = 0; i < N; i++) {
            int appWidgetId = appWidgetIds[i];
            int k, p;
            SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy hh:mm a");

            AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
            int k = audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM);
            Toast.makeText(getActivity(), k+"", Toast.LENGTH_LONG).show();

            Intent imageview2Intent= new Intent(context, VWid.class);
            PendingIntent pendingIntent2= PendingIntent.getBroadcast(context,0, imageview2Intent,0);

            views.setOnClickPendingIntent(R.id.imagebuttonrefresh, pendingIntent2); //

            views.setTextViewText(R.id.textview1, "Last Refresh: " + dateFormat.format(new Date()).toString());

            pushWidgetUpdate(context, views);
        }
    }

    public static void pushWidgetUpdate(Context context, RemoteViews remoteViews) {
        ComponentName myWidget = new ComponentName(context, VWid.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        manager.updateAppWidget(myWidget, remoteViews);
        Log.d("UPDATED", "testing");
    }
}

当我第一次将小部件添加到我的主屏幕时,textview1 显示:Last Refresh: {current date and time}。它还在 Toast 中显示系统音量。

假设我增加/减少系统音量,当我点击刷新时,onUpdate() 函数应该触发显示更新的 Toast 并将 textview1 文本更新为新的数据和时间,但这并没有发生。

如何修改代码实现刷新,本质上是调用onUpdate()函数。

【问题讨论】:

    标签: java android widget


    【解决方案1】:

    试试这个:

    public class WidgetProvider extends AppWidgetProvider {
    
     public static final String REFRESH_ACTION = "com.packagename.REFRESH_ACTION";
    
    @Override
        public void onReceive(Context context, Intent intent) {
            super.onReceive(context, intent);
    
       if (intent.getAction().equals(WidgetProvider.REFRESH_ACTION)) {
            Bundle extras = intent.getExtras();
            if (extras != null) {
                int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
    
                if (appWidgetIds != null && appWidgetIds.length > 0) {
                    Toast.makeText(context, "REFRESH", Toast.LENGTH_SHORT).show();
                    this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
                }
            }
        }
    
    }
    
    
    @Override
    public void onUpdate(final Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;
    
    
        for (int i = 0; i < N; ++i) {
    
            RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
    
            Intent intentServiceCall = new Intent(context, WidgetService.class);
            intentServiceCall.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
    
         //Refresh
            Intent refreshIntent = new Intent(context, WidgetProvider.class);
            refreshIntent.setAction(WidgetProvider.REFRESH_ACTION);
            refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
            intentServiceCall.setData(Uri.parse(intentServiceCall.toUri(Intent.URI_INTENT_SCHEME)));
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            rv.setOnClickPendingIntent(R.id.ivRefreshWidget, pendingIntent);
    
      appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
        }
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }
    

    【讨论】:

    • 这与我最终做的类似。谢谢你。为答案 +1。
    【解决方案2】:

    更改此部分:

    Intent imageview2Intent= new Intent(context, VWid.class);
    imageview2Intent.setAction(WIDGET_UPDATE);
    PendingIntent pendingIntent2= PendingIntent.getBroadcast(context,0, imageview2Intent,0);
    views.setOnClickPendingIntent(R.id.imagebuttonrefresh, pendingIntent2); //
    
    
    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
    
        if (WIDGET_UPDATE.equals(intent.getAction())) {
             pushWidgetUpdate(context);
        }
    }
    

    【讨论】:

    • 我有 AppWidgetProvider 和 BroadcastReceiver 来处理按钮点击。我在哪里添加这个?该按钮也是小部件本身中的图像按钮。
    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多