2017-10-12 113 views
0

我在這裏看到很多答案,他們都沒有工作..!一旦我點擊了它旁邊的一個按鈕,我只想讓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哦,究竟有多詳細,?你有解決我所面臨的問題嗎? –

回答

0

我想通了最後,我見過很多方法來處理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); 
    } 

} 
0

只要看看下面的代碼:

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

嗯,好的,那該怎麼做呢?因爲這裏有大量的小部件,可以立即提供一些結果,例如計算器小部件,秒錶小部件以及帶有刷新按鈕的天氣小部件。這些都可以在點擊按鈕時得到即時結果。我想我會舉一個簡單的計數器作爲例子。有一定的辦法。 –

相關問題