2017-10-12 15 views
0

많은 답변을 보았습니다. 텍스트보기를 옆에있는 단추를 클릭하면 바로 업데이트 할 수 있습니다. 토스트 메시지를 인쇄하려고 시도했지만 정상적으로 표시되지만보기를 업데이트하는 것이 문제입니다.버튼 클릭시 즉시 위젯 뷰를 업데이트하는 방법

내 코드

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

코드는,이 점은 RPC 중입니다. 그래서이보기를 자주 업데이트하는 것이 좋습니다. 실제로, 당신의 질문을 좀 더 자세하게 만드십시오. –

+0

@AndrewBrowiski 오, 정확합니다! 내가 직면 한 것에 대한 해결책이 있습니까? –

답변

0

, 내가 본 onC를 처리 할 수있는 많은 방법 위젯을 핥아 라. 그러나 나를 위해 해결 된이 방법은 뷰를 intantally 업데이트한다.

당신이 리모트 뷰 RemoteViews 작업하고

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

흠, 그럼 그걸 어떻게 수행 ..? 거기에 위젯의 톤이 즉시 계산기 위젯, 스톱워치 위젯 및 그것에 새로 고침 버튼과 날씨 위젯과 같은 몇 가지 결과를 제공하기 때문에 ..! 이 모든 것들이 버튼을 클릭 할 때 즉각적인 결과를줍니다. 예를 들어 간단한 카운터를 만들 것이라고 생각했습니다. 방법이있을거야.! –