【问题标题】:Android: Intent's extra is missing (working with widget)Android:缺少 Intent 的额外功能(使用小部件)
【发布时间】:2014-04-18 20:08:21
【问题描述】:

我想制作一个带有 2 个按钮的小部件(一个是带有数字的 Textview)。一个按钮应该增加数字,另一个按钮减少它。

这是我的变量(2x 动作名称和数字的 int)

    private static final String PLUS_ONE = "Plus1";
    private static final String MINUS_ONE = "minus1";
    static int counter = 0;

onUpdate():

 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
 final int N = appWidgetIds.length;
 for (int i=0; i<N; i++) {
     int appWidgetId = appWidgetIds[i];
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.plus1counter_widget);
     remoteViews.setOnClickPendingIntent(R.id.counter_widget, getPendingSelfIntent(context, PLUS_ONE, counter));
     remoteViews.setOnClickPendingIntent(R.id.img_downWid, getPendingSelfIntent(context, MINUS_ONE, counter));

     appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
 }}

getPendingSelfIntent 是我创建意图的方法,将 int 值放入其中并返回 PendingIntent 这里详细介绍:

    protected PendingIntent getPendingSelfIntent(Context context, String action, int i) {
    Intent intent = new Intent(context, Plus1CounterAppWidgetProvider.class);
    intent.setAction(action);
    intent.putExtra("safeInt", i);
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);}

最后是我的 onReturn(),我想在其中将计数器设置为我给 Intent 的值并执行操作:

 @Override
 public void onReceive(Context context, Intent intent) {
 super.onReceive(context, intent);
 counter = intent.getIntExtra("safeInt", 0); 

 if (PLUS_ONE.equals(intent.getAction())) {
     counter++;
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.plus1counter_widget);
     remoteViews.setTextViewText(R.id.counter_widget, Integer.toString(counter));
     AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context, Plus1CounterAppWidgetProvider.class), remoteViews);
 }

 if (MINUS_ONE.equals(intent.getAction())) {
     counter--;
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.plus1counter_widget);
     remoteViews.setTextViewText(R.id.counter_widget, Integer.toString(counter));
     AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context, Plus1CounterAppWidgetProvider.class), remoteViews);
 }}

通过调用

counter = intent.getIntExtra("safeInt", 0); 

计数器始终设置为 0,这意味着没有额外的值。 我只是不明白为什么!任何解决方案? :)

【问题讨论】:

    标签: android android-intent widget android-pendingintent


    【解决方案1】:

    我找到了另一个解决方案。 我只是使用 SharedPreferences 而不是 Intent 并且它有效! :) 代码如下:

    import android.app.PendingIntent;
    import android.appwidget.AppWidgetManager;
    import android.appwidget.AppWidgetProvider;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.widget.RemoteViews;
    
    public class Plus1CounterAppWidgetProvider extends AppWidgetProvider{
    
    private static final String PLUS_ONE = "Plus1";
    private static final String MINUS_ONE = "Minus1";
    private static final String REFRESH_COUNTER = "Refresh";
    static int counter = 0;
    
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[]  appWidgetIds) {
     final int N = appWidgetIds.length;
     for (int i=0; i<N; i++) {
         int appWidgetId = appWidgetIds[i];
         RemoteViews remoteViews = new RemoteViews(context.getPackageName(),  R.layout.plus1counter_widget);
         remoteViews.setOnClickPendingIntent(R.id.counter_widget, getPendingSelfIntent(context, PLUS_ONE));
         remoteViews.setOnClickPendingIntent(R.id.img_downWid, getPendingSelfIntent(context, MINUS_ONE));
         remoteViews.setOnClickPendingIntent(R.id.img_refreshWid, getPendingSelfIntent(context, REFRESH_COUNTER));
         appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
      }
     }
    
     @Override
     public void onReceive(Context context, Intent intent) {
     super.onReceive(context, intent);
    
     SharedPreferences sharedPref = context.getSharedPreferences("com.plus1counter.safeFile", Context.MODE_PRIVATE);
     counter = sharedPref.getInt("safeFile", 0);
     if(counter == 100){
         counter = 0;
     }
    
     if (PLUS_ONE.equals(intent.getAction())) {
         counter++;
         writeSharedPrefs(sharedPref);         
     }
    
     if (MINUS_ONE.equals(intent.getAction())) {
         counter--;
         writeSharedPrefs(sharedPref);
     }
    
     if(REFRESH_COUNTER.equals(intent.getAction())){
         counter = 0;
         writeSharedPrefs(sharedPref);
     }
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.plus1counter_widget);
     remoteViews.setTextViewText(R.id.counter_widget, Integer.toString(counter));
     AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context, Plus1CounterAppWidgetProvider.class), remoteViews);
     }
    
     public void writeSharedPrefs(SharedPreferences sharedPref){
     SharedPreferences.Editor editor = sharedPref.edit();
     editor.putInt("safeFile", counter);
     editor.commit();
     }
    
     protected PendingIntent getPendingSelfIntent(Context context, String action) {
     Intent intent = new Intent(context, Plus1CounterAppWidgetProvider.class);
     intent.setAction(action);
     return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
     }
    
     }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2020-09-02
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    相关资源
    最近更新 更多