2014-04-18 3 views
0

Я хочу сделать виджет с 2 кнопками (один из них представляет собой текстовое изображение с номером). Одна кнопка должна увеличивать число, а другая - уменьшать ее.Android: Отсутствует дополнение Intent (работает с виджетами)

Вот мои переменные (2x остросюжетные имена и ИНТ для числа)

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(), в котором я хочу, чтобы установить счетчик на значение, которое я дал Намерению и выполнить действие:

@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, что означает, что дополнительного значения нет. Я просто не понимаю почему! Любые решения? :)

ответ

0

Я нашел другое решение. Я просто использовал SharedPreferences вместо намерения, и это сработало! :) Вот код:

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); 
} 

} 
+0

здесь окончательное применение [plus1counter] (https://play.google.com/store/apps/details?id=com.apperrant.plus1counter) –

Смежные вопросы