使用小部件中的PreferencesActivity?

时间:2010-06-25 16:15:46

标签: android-widget

PreferenceActivity似乎是一个非常简单的帮助类来管理应用程序的首选项。

我也想从小部件中使用同一个类。

在小部件的第一个实例上,我希望PreferenceActivity出现。从配置活动中可以很容易地做到这一点,但这是故障......

我无法确定偏好编辑何时完成!

我在网上看到的所有小部件首选项示例都使用手动构建的首选项屏幕而不是PreferenceActivity助手类,然后监听被点击的“保存”按钮。

如何使用PreferenceActivity执行此操作,因为该活动没有保存按钮。您只需使用“后退”按钮即可提交首选项更改。

谢谢!

2 个答案:

答案 0 :(得分:4)

我一直在尝试做同样的事情,我想我已经破解了它。我在PreferenceActivity中处理onBackPressed()事件,并使用sendBroadcast()从那里执行小部件更新。

在PreferenceActivity中:

@Override
public void onBackPressed() {
    Intent intent=getIntent();
    Bundle extras=intent.getExtras();   
    int widgetId=extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

    // this is the intent broadcast/returned to the widget
    Intent updateIntent = new Intent(this, WidgetProvider.class);
    updateIntent.setAction("PreferencesUpdated");
    updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
    sendBroadcast(updateIntent);
}

在你的WidgetProvider中:

@Override
public void onReceive(Context context, Intent intent) {
    if ("PreferencesUpdated".equals(action)) {
        // update your widget here
        // my widget supports multiple instances so I needed to uniquely identify them like this
        RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget);
        int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
        updateWidgetView(context, remoteView, appWidgetId);
    }   
}

注意:在1.5 onBackPressed不支持所以注释掉onBackPressed的@Override并添加此代码

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.d(LOG_TAG, "onKeyDown() "+ keyCode);
    if (keyCode==KeyEvent.KEYCODE_BACK && Integer.parseInt(Build.VERSION.SDK)<5) {
        onBackPressed();
    }
}

我应该补充一点,我是Android开发的新手,所以我可能完全错了。我只能说这对我有用:)

让我知道你是怎么过的。

答案 1 :(得分:0)

您应该能够通过实施SharedPreferences.OnShredPreferenceChangeListener来判断偏好编辑何时完成。使用此功能,您只能在更改某些键时更新,或者在更改任何键时无条件更新。请记住在PreferenceActivity onCreate中注册它,并在onDestroy中取消注册。

在这种情况下,您可以在侦听器中执行与Android: How do I force the update of all widgets of a particular kind类似的操作,以使所有窗口小部件根据SharedPreference更改进行更新。

这是一个老问题,所以这可能不再适用了。