#android #android-widget #android-intent #android-service #android-preferences
#Android #android-виджет #android-намерение #android-сервис #android-настройки
Вопрос:
Когда я пытаюсь поместить свой виджет погоды на рабочий стол, я хочу предоставить пользователю возможность выбора города в этот момент, и виджет начинает показывать погоду для этого города. Для этого я использовал метод onEnabled в классе Provider.
Итак, что я здесь делаю, это просто запускаю действие для некоторого класса предпочтений, где я использую string array, чтобы предоставить пользователю возможность выбора. А затем OnSharedPreferenceChangeListener внутри onEnabled снова я начинаю другое действие с URL города. Этот новый класс acitvity будет обрабатывать логику погоды при запуске, когда я впервые попытаюсь поместить виджет погоды на домашний экран. Итак, я просто пытаюсь установить некоторые текстовые поля в этом новом классе activity, чтобы они отображались в виджете, когда я помещаю их на экран, но я не могу, я не знаю, почему он не применяется. Вот приведенный ниже код моего AppWidgetProvider.
public class MyWeatherAppWidgetProvider extends AppWidgetProvider{
private String url;
@Override
public void onEnabled(Context context) {
// TODO Auto-generated method stub
super.onEnabled(context);
final Context this_context = context;
Intent intent = new Intent(context.getApplicationContext(), EditPrefs.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this_context);
url = prefs.getString("cities", "http://www.yr.no/place/Nepal/Bagmati/Kathmandu/forecast.xml");
System.out.println(url);
Intent intent = new Intent(this_context.getApplicationContext(), VaxjoWeather.class);
intent.putExtra("city", url);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this_context.startActivity(intent);
}
};
prefs.registerOnSharedPreferenceChangeListener(listener);
url = prefs.getString("cities", "http://www.yr.no/place/Nepal/Bagmati/Kathmandu/forecast.xml");
System.out.println(url);
}
Ответ №1:
Я бы не стал полагаться на onEnabled
, чтобы делать все правильно для вас. Насколько я знаю, все еще существует ошибка, которая позволяет widgetIds задерживаться при отмене настройки виджета. Это означает, что когда вы размещаете первый виджет и отменяете настройку, идентификатор для конкретного AppWidgetProvider все еще сохраняется в системе, и, следовательно, onEnabled не вызывается при повторном размещении, поскольку у него все еще есть «призрачный» идентификатор в его appWidgetProviderIds.
Комментарии:
1. но можем ли мы изменить отдельные компоненты представления в виджете без удаленных представлений ….. в настоящее время я пытаюсь это сделать
2. Вы также можете без проблем изменять детали виджета извне, например, из вашего PreferenceActivity. AppWidgetManager — это синглтон, вы можете запросить идентификаторы определенного AppWidgetProvider и перебирать их, изменяя удаленные представления.