如何在点击按钮时立即更新小部件视图

问题描述:

我在这里看到很多答案,他们都没有工作..!一旦我点击了它旁边的一个按钮,我只想让textview立即得到更新。我尝试打印Toast消息并正常显示,但更新视图是问题所在。如何在点击按钮时立即更新小部件视图

我的代码

public class FollowersWidget extends AppWidgetProvider { 

    public static String REFRESH_ACTION = "android.appwidget.action.APPWIDGET_UPDATE"; 

    int x = 0; 

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

    if (intent.getAction().equals(REFRESH_ACTION)) { 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
     final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.followers_widget); 

     x++; 
     views.setTextViewText(R.id.textv_count, x + ""); 

     int[] appWidgetId = AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context, FollowersWidget.class)); 
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 

    } 

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, 
     int appWidgetId) { 

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.followers_widget); 

    try { 

     String count = MyConfigureActivity.getNumCount(context, appWidgetId); 
     views.setTextViewText(R.id.textv_count, count); 

     views.setOnClickPendingIntent(R.id.refreshButton,getRefreshPendingIntent(context, appWidgetId)); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 

    public static PendingIntent getRefreshPendingIntent(Context context, int appWidgetId) { 
    Intent intent = new Intent(REFRESH_ACTION); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    } 

// other widget methods.. 
.. 
. 
} 

我的清单

<receiver android:name=".FollowersWidget"> 
     <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
     </intent-filter> 

     <meta-data 
     android:name="android.appwidget.provider" 
     android:resource="@xml/followers_info"/> 
    </receiver> 
+0

你与remoteViews工作,这件事情是在RPC。这就是为什么经常更新这些视图非常困难的原因。其实,只是让你的问题更详细 –

+0

@AndrewBrowiski哦,究竟有多详细,?你有解决我所面临的问题吗? –

我想通了最后,我见过很多方法来处理onC舔窗口小部件,但这种方式对我来说已经解决了,并且它可以完整地更新视图。

代码

public class TestWidget extends AppWidgetProvider { 

    public static String REFRESH_ACTION = "android.appwidget.action.APPWIDGET_UPDATE"; 
    static private RemoteViews views; 
    private int x = 0; 

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

    if (intent.getAction().equalsIgnoreCase(REFRESH_ACTION)) { 
     views = new RemoteViews(context.getPackageName(), R.layout.test_widget); 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
     int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, TestWidget.class)); 
     x++; 
     views.setTextViewText(R.id.textv_count, x + ""); 
     appWidgetManager.updateAppWidget(appWidgetIds, views); 
    } 
    } 

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { 

    views = new RemoteViews(context.getPackageName(), R.layout.test_widget); 
    views.setTextViewText(R.id.textv_count, x + ""); 
    views.setOnClickPendingIntent(R.id.button, getPenIntent(context)); 
    appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 



    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    for (int appWidgetId : appWidgetIds) { 
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 
    } 

    static private PendingIntent getPenIntent(Context context) { 
    Intent intent = new Intent(context, TestWidget.class); 
    intent.setAction(REFRESH_ACTION); 
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    } 

} 

只要看看下面的代码:

public class WidgetExample extends AppWidgetProvider { 

public static final String REFRESH_ACTION = "YOUR_REFRESH_ACTION"; 
public static final String VALUE_KEY = "VALUE_KEY"; 
public static final String PREFERENCE_FILE_KEY = "PREFERENCE_FILE_KEY"; 

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

    if (intent != null) { 
     if (intent.getAction() != null) { 
      if (intent.getAction().equals(REFRESH_ACTION)) { 
       int value = readValue(context) + 1; 
       saveValue(context , value); 
       AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
       int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetExample.class)); 
       for (int id : appWidgetIds) { 
        final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.followers_widget); 
        views.setTextViewText(R.id.textv_count, String.valueOf(value)); 
        views.setOnClickPendingIntent(R.id.button_refresh, getRefreshPendingIntent(context)); 
        appWidgetManager.updateAppWidget(id, views); 
       } 
      } 
     } 
    } 
} 


@Override 
public void onEnabled(Context context) { 
    int value = readValue(context); 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetExample.class)); 
    for (int id : appWidgetIds) { 

     final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.followers_widget); 
     views.setTextViewText(R.id.textv_count, String.valueOf(value)); 
     views.setOnClickPendingIntent(R.id.button_refresh, getRefreshPendingIntent(context)); 
     appWidgetManager.updateAppWidget(id, views); 
    } 
} 

private void saveValue(Context context, int value) { 
    SharedPreferences sharedPref = context.getSharedPreferences(PREFERENCE_FILE_KEY, Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPref.edit(); 
    editor.putInt(VALUE_KEY, value); 
    editor.apply(); 
} 

private int readValue(Context context) { 
    SharedPreferences sharedPref = context.getSharedPreferences(PREFERENCE_FILE_KEY, Context.MODE_PRIVATE); 
    return sharedPref.getInt(VALUE_KEY, 0); 
} 

public static PendingIntent getRefreshPendingIntent(Context context) { 
    Intent intent = new Intent(REFRESH_ACTION); 
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    } 
} 
+0

它不会立即更新!?当我点击按钮几秒钟后更新textview! –

+0

@Alaa AbuZarifa Dude,问题在于所有操作都在另一个进程上,这就是为什么您使用的是远程视图,其中包含一些关于在启动器进程上呈现的布局的信息。您无法即时更新小部件。 –

+0

嗯,好的,那该怎么做呢?因为这里有大量的小部件,可以立即提供一些结果,例如计算器小部件,秒表小部件以及带有刷新按钮的天气小部件。这些都可以在点击按钮时得到即时结果。我想我会举一个简单的计数器作为例子。有一定的办法。 –