Как применить изменения к виджету при размещении его на рабочем столе в onEnabled?

#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 и перебирать их, изменяя удаленные представления.