Настройка активности: виджет запускается только после его повторного запуска из Eclipse - PullRequest
0 голосов
/ 22 марта 2012

Я делаю виджет подсчета с кнопкой сброса.У меня проблема в том, что после того, как я установил его на эмуляторе, всплывающее окно настройки появляется, и после нажатия «ОК» работает только одна кнопка (кнопка «+1» работает, а кнопка «Сброс» - нет).Если я перезапущу программу из Eclipse, когда виджет все еще работает на эмуляторе, он будет работать.Купите, если я перетащу его в корзину, а затем снова открою, он перестанет работать после действия настройки.Я попытался удалить действие настройки, но он просто говорит, что приложение не установлено.

Я новичок в этом, и я был бы признателен за любую помощь.

Мой код выглядит следующим образом:

Для действия по настройке:

package com.diego.widgetprueba;

import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class WidgetConfig extends Activity {

    private int widgetId = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.widget_config);

        Intent intentOrigen = getIntent();
        Bundle params = intentOrigen.getExtras();

    widgetId = params.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

    final Button btnAceptar = (Button)findViewById(R.id.BtnAceptar);
    final Button btnCancelar = (Button)findViewById(R.id.BtnCancelar);

    setResult(RESULT_CANCELED);

    btnCancelar.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            //Devolvemos como resultado: CANCELAR (RESULT_CANCELED)
            finish();
        }
    });

    btnAceptar.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {

                AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(WidgetConfig.this);
                MiWidget.actualizarWidget(WidgetConfig.this, appWidgetManager, widgetId);
                MiWidget.resetearWidget(WidgetConfig.this, appWidgetManager, widgetId);

                Intent resultado = new Intent();
                resultado.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
                setResult(RESULT_OK, resultado);
                finish();
            }
        });
    }
}

Для AppWidgetProvider

package com.diego.widgetprueba;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.widget.RemoteViews;


public class MiWidget extends AppWidgetProvider {
static int mCount=0;

@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    for (int i = 0; i < appWidgetIds.length; i++)
    {
        int widgetId = appWidgetIds[i];

        actualizarWidget(context, appWidgetManager, widgetId);
        resetearWidget(context, appWidgetManager, widgetId);
        }
    }
@Override
public void onDeleted(Context context, int[] appWidgetIds)
{
    SharedPreferences prefs = context.getSharedPreferences("WidgetPrefs", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();

    for(int i=0; i<appWidgetIds.length; i++)
    {
        int widgetId = appWidgetIds[i]; 
        editor.remove("msg_" + widgetId);
    }

    editor.commit();

    super.onDeleted(context, appWidgetIds);
}
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("com.diego.widgetprueba.ACTUALIZAR_WIDGET")) {
        int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);

        AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);

        if (widgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
            actualizarWidget(context, widgetManager, widgetId);
        }
    }
    if (intent.getAction().equals("com.diego.widgetprueba.RESETEAR_WIDGET")) {
        int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);

        AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);

        if (widgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
            resetearWidget(context, widgetManager, widgetId);
        }
    }
    super.onReceive(context, intent);
}
public static void actualizarWidget(Context context, AppWidgetManager appWidgetManager, int widgetId)
{   
    RemoteViews controles = new RemoteViews(context.getPackageName(), R.layout.main);
    Intent intent = new Intent("com.diego.widgetprueba.ACTUALIZAR_WIDGET");
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    controles.setOnClickPendingIntent(R.id.BtnActualizar, pendingIntent);

    mCount++;
    String mCountString = Integer.toString(mCount);     
    controles.setTextViewText(R.id.LblHora, mCountString);

    appWidgetManager.updateAppWidget(widgetId, controles);
}
public static void resetearWidget(Context context, AppWidgetManager appWidgetManager, int widgetId)
{   
    RemoteViews controles = new RemoteViews(context.getPackageName(), R.layout.main);

    Intent intent2 = new Intent("com.diego.widgetprueba.RESETEAR_WIDGET");
    intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
    PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, widgetId, intent2, PendingIntent.FLAG_UPDATE_CURRENT);

    controles.setOnClickPendingIntent(R.id.BtnResetear, pendingIntent2);

    mCount=0;
    String mCountString = Integer.toString(mCount);     
    controles.setTextViewText(R.id.LblHora, mCountString);

    appWidgetManager.updateAppWidget(widgetId, controles);
    }
}

Файл манифеста

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.diego.widgetprueba"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity android:name=".WidgetConfig">
            <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
        </intent-filter>
    </activity>
        <receiver android:name=".MiWidget" android:label="@string/miprimerwidget">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.diego.widgetprueba.ACTUALIZAR_WIDGET"/>
        </intent-filter>
        <intent-filter>
            <action android:name="com.diego.widgetprueba.RESETEAR_WIDGET"/>
        </intent-filter>
        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@layout/miwidget_provider" />
        </receiver>
    </application>

</manifest>

Приветствия

1 Ответ

0 голосов
/ 23 марта 2012

Я решил это, создав следующую функцию в AppWidgetProvider

public static void configurarWidget(Context context, AppWidgetManager appWidgetManager, int widgetId)
{   
    //Obtenemos la lista de controles del widget actual
    RemoteViews controles = new RemoteViews(context.getPackageName(), R.layout.main);

    //Asociamos los 'eventos' al widget
    Intent intent = new Intent("com.diego.widgetprueba.ACTUALIZAR_WIDGET");
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    Intent intent2 = new Intent("com.diego.widgetprueba.RESETEAR_WIDGET");
    intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
    PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, widgetId, intent2, PendingIntent.FLAG_UPDATE_CURRENT);

    controles.setOnClickPendingIntent(R.id.BtnActualizar, pendingIntent);
    controles.setOnClickPendingIntent(R.id.BtnResetear, pendingIntent2);

    //Actualizamos el mensaje en el contador
    mCount=0;
    String mCountString = Integer.toString(mCount);     
    controles.setTextViewText(R.id.LblHora, mCountString);

    //Notificamos al manager de la actualizaciÛn del widget actual
    appWidgetManager.updateAppWidget(widgetId, controles);
}

И затем изменив в операции настройки эти две строки

MiWidget.actualizarWidget(WidgetConfig.this, appWidgetManager, widgetId);
MiWidget.resetearWidget(WidgetConfig.this, appWidgetManager, widgetId);

для

MiWidget.configurarWidget(WidgetConfig.this, appWidgetManager, widgetId);
...