0

ウィジェットを開発したいのですが、AppWidgetProvider からウィジェットに文字列を渡すときに問題が発生します...共有設定を使用してこれを行っています

問題は、変数を SharedPreferences に格納するときに発生します。その値を取得しようとすると、null 値ではなく、次のような値が返されます。

WidgetPrefs.xml にその変数が存在するにもかかわらず、この値が返されます。prefs 変数にエラーがあると思いますが、よくわかりません

これは WidgetConfig のコードです。

public class ActivityWidgetConfig extends Activity implements OnClickListener{

private int widgetId = 0;

private String titlestring;
private String textstring;

private EditText etTitle;
private EditText etText;

private ImageButton btnTitle;
private ImageButton btnText;

private ImageView previewIcon;

private Button iconButton;
private Button createButton;

private int icon_id;

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

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

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

    setResult(RESULT_CANCELED);

    etTitle = (EditText) findViewById(R.id.etTitle);
    etText = (EditText) findViewById(R.id.etText);
    btnTitle = (ImageButton) findViewById(R.id.btnTitle);
    btnText = (ImageButton) findViewById(R.id.btnText);
    createButton = (Button)findViewById(R.id.createButton);
    iconButton = (Button)findViewById(R.id.iconButton);

    btnTitle.setOnClickListener(this);
    btnText.setOnClickListener(this);
    createButton.setOnClickListener(this);
    iconButton.setOnClickListener(this);

    SharedPreferences prefs = getSharedPreferences("WidgetPrefs", Context.MODE_PRIVATE);
    titlestring = prefs.getString("widgettitle", "");
    textstring = prefs.getString("widgettext", "");
    icon_id = prefs.getInt("widgeticon_id", android.R.drawable.stat_sys_warning);

    etTitle.setText(titlestring);
    etText.setText(textstring);

    previewIcon = (ImageView) findViewById(R.id.previewIcon);
    previewIcon.setImageResource(icon_id);

}

@Override
public void onClick(View v) {
    SharedPreferences prefs = getSharedPreferences("WidgetPrefs", Context.MODE_PRIVATE);
    Editor editor = prefs.edit();
    switch (v.getId()){
        case R.id.btnTitle:
            editor.remove("widgettitle");
            editor.commit();
            etTitle.setText("");
            break;
        case R.id.btnText:
            editor.remove("widgettext");
            editor.commit();
            etText.setText("");
            break;
        case R.id.createButton:
            editor.putString("widgettitle", titlestring);  
            final String textstring=etText.getText().toString();
            editor.putString("widgettext", textstring);
            editor.putInt("widgeticon_id", icon_id);
            editor.commit();

            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(ActivityWidgetConfig.this);
            WidgetOne.updateWidget(ActivityWidgetConfig.this, appWidgetManager, widgetId);
            Intent resultado = new Intent();
            resultado.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
            setResult(RESULT_OK, resultado);
            finish();
            break;
        case R.id.iconButton:
            Intent i = new Intent(this, ActivityIcons.class); 
            startActivityForResult(i, 1);
            break;
    }
}
 }

そして、これはウィジェットのコードです:

public class WidgetOne extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        for (int i = 0; i < appWidgetIds.length; i++) 
        {
            //ID del widget actual
            int widgetId = appWidgetIds[i];

            //Actualizamos el widget actual
            //updateWidget(context, appWidgetManager, widgetId);
        }

}


@Override
public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equals("com.iamaner.ACTUALIZAR_WIDGET")) {

//          //Obtenemos el widget manager y la lista de IDs de nuestro widget
//          ComponentName wgt = 
//              new ComponentName(context, MiWidget.class);
//          
//          AppWidgetManager widgetManager =
//              AppWidgetManager.getInstance(context);
//          
//          int[] appWidgetIds = widgetManager.getAppWidgetIds(wgt);
//          
//          //Actualizamos todos los widgets
//          for(int i=0; i<appWidgetIds.length; i++)
//              actualizarWidget(context, widgetManager, appWidgetIds[i]);

        //Obtenemos el ID del widget a actualizar
        int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

        //Obtenemos el widget manager de nuestro contexto
        AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);

        //Actualizamos el widget
        //if (widgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
        //  actualizarWidget(context, widgetManager, widgetId);
        //}
    }

    super.onReceive(context, intent);
}

public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int widgetId)
{
    SharedPreferences prefs = context.getSharedPreferences("WidgetPrefs", Context.MODE_PRIVATE);
    RemoteViews controles = new RemoteViews(context.getPackageName(), R.layout.widget_1);

    //Asociamos los 'eventos' al widget
    Intent intent = new Intent("com.iamaner.ACTUALIZAR_WIDGET");
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);

    controles.setTextViewText(R.id.txtMensaje, prefs.getString("widgettitle", ""));
    controles.setTextViewText(R.id.txtMensaje, prefs.getString("widgetext", ""));

    controles.setImageViewResource(R.id.ivIcon, icon_id);

    appWidgetManager.updateAppWidget(widgetId, controles);
}

}
4

1 に答える 1

0

問題は、sharedpreferences 文字列に異なる名前を割り当てたことでした...

Widget クラスでこれを行うことで解決しました:

prefs.getString("widgettext","");
于 2012-10-08T11:22:18.877 に答える