2010-06-25 3 views
2

PreferenceActivity кажется действительно легким вспомогательным классом для управления предпочтениями приложения.Использование PreferencesActivity от виджета?

Я также хотел бы использовать тот же класс из виджета.

В первом экземпляре виджета я хочу, чтобы PreferenceActivity появился. Это было очень легко сделать из конфигурации, но вот глюк ...

Я не могу сказать, когда редактирование предпочтений будет завершено!

Все примеры предпочтений виджетов Я вижу в сети использовать экран настроек вручную, а не вспомогательный класс PreferenceActivity, а затем прослушивать нажатие кнопки «Сохранить».

Как это сделать с помощью функции PreferenceActivity, поскольку в этой операции нет кнопки сохранения. Вы просто используете кнопку «назад» для фиксации изменений настроек.

Спасибо!

+0

Это может также помочь вам: http://stackoverflow.com/questions/2697233/how-to-add-a-button-to-preferencescreen –

ответ

4

Я пытался сделать то же самое, и я думаю, что я его взломал. Я обрабатываю событие onBackPressed() в PreferenceActivity и выполняю обновление виджета с помощью 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 не поддерживает так Закомментируйте @Override для onBackPressed и добавить этот код

@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

Это не помогает ... где определяется updateWidgetView()? И как это применимо к обновлению всех виджетов? – swinefeaster

+0

@swinefeaster просто используйте this.onUpdate в провайдере –

0

Вы должны уметь указать, когда редактирование настроек завершено, реализовав SharedPreferences.OnShredPreferenceChangeListener. Используя это, вы можете обновлять только при изменении определенных ключей или безоговорочно, когда они будут изменены. Не забудьте зарегистрировать его в своей PreferenceActivity onCreate и отменить регистрацию в onDestroy.

В этом случае вы можете сделать что-то похожее на Android: How do I force the update of all widgets of a particular kind внутри слушателя, чтобы все ваши виджеты обновлялись на основе изменения SharedPreference.

Это старый вопрос, поэтому это может быть не актуально.

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