带有 SharedPreferences 的 AppWidget 必须更新两次



我正在构建一个小部件,它显示一个文本视图,该文本视图可在配置类中作为编辑文本进行编辑。我刚刚实现了共享首选项,因此当用户第二次或第三次编辑小部件等时,已经输入的文本将出现在配置类的编辑文本字段中。

我猜它有效。好吧,在我实现共享首选项之前,小部件在配置后会很好地更新。但是现在,我编辑文本,按应用,但小部件没有更新,然后我再次编辑小部件,小部件使用我之前应用于它的文本进行更新。所以我想你可以说,这是一个更新延迟。我希望我说清楚,这有点难以解释。

所以我做错了什么,我无法让它工作,任何帮助将不胜感激。

法典:

public class WidgetConfig extends Activity implements OnClickListener {

    AppWidgetManager awm;
    int awID;
    Context c;
    EditText info;
    Button b;
    String note;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.widgetconfig);
        c = WidgetConfig.this;
        info = (EditText)findViewById(R.id.etwidgetconfig);
        b = (Button)findViewById(R.id.bwidgetconfig);
        loadPrefs();
        b.setOnClickListener(this);
        //Getting Info about the widget that launched this activity
        Intent i = getIntent();
        Bundle extras = i.getExtras();
        if (extras != null){
            awID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID );
        }
        awm = AppWidgetManager.getInstance(c);
    }
    private void loadPrefs(){
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        note = sp.getString("NOTE", "DEFAULT");
        info.setText(note);
    }
    private void savePrefs(String key, String value){
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = preferences.edit();       
        editor.putString(key, value); // value to store
        editor.commit();   
    }
    public void onClick(View v) {
        // TODO Auto-generated method stub
        savePrefs("NOTE", info.getText().toString());
        RemoteViews views = new RemoteViews(c.getPackageName(), R.layout.widget);
        views.setTextViewText(R.id.tvConfigInput, note);

        ComponentName thisWidget = new ComponentName(this, Widget.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(this);
        manager.updateAppWidget(thisWidget, views);
        Intent in = new Intent(c, WidgetConfig.class);
        PendingIntent pi = PendingIntent.getActivity(c, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);

        views.setOnClickPendingIntent(R.id.B_EditAgain, pi);
        awm.updateAppWidget(awID, views);

        Intent result = new Intent();
        result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);
        setResult(RESULT_OK, result);
        finish();
    }
}

您实际上并没有使用 EditText 字段的值更新文本视图。您的伪代码当前如下所示:

String note;
onCreate(){
    note = getSharedPref(NOTE);
}
onClick(){
    putSharedPref(info.getText());
    views.setText(note);
}

这将忽略 EditText 中的值,直到您下次调用 onCreate(您观察到的)为止。

您应该使用编辑文本中的文本更新视图:

onClick(){
   putSharedPref(info.getText());
   views.setText(info.getText());
}

最新更新