Как обнаружить изменение ориентации в виджете домашнего экрана? - PullRequest
5 голосов
/ 12 марта 2010

Я пишу виджет домашнего экрана и хочу обновить виджет домашнего экрана, когда ориентация устройства меняется с книжной на альбомную или другим способом. Как я могу это сделать?

В настоящее время я попытался повторно выполнить действие CONFIGURATION_CHANGED, как показано в коде ниже, но Android не позволил мне сделать это, сказав, что «компонентам IntentReceiver не разрешено регистрироваться для получения намерений». Кто-нибудь может мне помочь? Спасибо.

public class MyWidget extends AppWidgetProvider {

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        this.registerReceiver(this, new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED));
    }

Ответы [ 4 ]

8 голосов
/ 27 апреля 2014

Я знаю, что это старый вопрос, но действительно есть более простой способ сделать это, чем делегировать обновление IntentService. Способ справиться с изменениями ориентации - прослушать изменения конфигурации в Приложении и передать ACTION_APPWIDGET_UPDATE виджету.

Добавление класса приложения в ваше приложение

public class MyApplication extends Application {

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // create intent to update all instances of the widget
        Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyWidget.class);

        // retrieve all appWidgetIds for the widget & put it into the Intent
        AppWidgetManager appWidgetMgr = AppWidgetManager.getInstance(this);
        ComponentName cm = new ComponentName(this, MyWidget.class);
        int[] appWidgetIds = appWidgetMgr.getAppWidgetIds(cm);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

        // update the widget
        sendBroadcast(intent);
    }
}

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

Определите MyApplication в манифесте

<application
    android:name="yourpackagename.MyApplication"
    android:description="@string/app_name"
    android:label="@string/app_name"
    android:icon="@drawable/app_icon">

    <!-- here go your Activity definitions -->

</application>
3 голосов
/ 12 марта 2010

Вам, вероятно, не нужно этого делать. Вы можете использовать папки layout и layout-land для предоставления разных макетов в каждой ориентации через XML без ручного определения поворота. Тем не менее, вы не должны делать что-то функционально различное в каждой ориентации, так как многие устройства не могут поворачивать домашний экран, и любые функции, которые вы добавили, будут для них недоступны.

2 голосов
/ 13 марта 2010

Хотя я и согласен с ответом jqpubliq, пока вы думаете о том, что делаете, и дизайн имеет значение, вы можете использовать разные макеты для разных ориентаций. Это просто будет сложно.

Полученное вами сообщение об ошибке должно быть самоочевидным: BroadcastReceivers (например, AppWidgetProvider) не может зарегистрироваться для других передач. В конце концов, зарегистрированный манифестом экземпляр BroadcastReceiver должен находиться в памяти в течение миллисекунд, а не вечно.

Следовательно, для реализации этой логики вам необходимо:

  1. Создайте IntentService, который обрабатывает фактические обновления виджета приложения, и пусть ваш AppWidgetProvider делегирует свою работу этому. Вот пример .
  2. Создать отдельную BroadcastReceiver реализацию, зарегистрированную в манифесте для получения CONFIGURATION_CHANGED широковещательной Intents.
  3. Пусть этот новый BroadcastReceiver также использует IntentService (например, позвоните startService()).
  4. IntentService должен обрабатывать обновления для обеих ориентаций, исходящие от обоих приемников.
1 голос
/ 23 февраля 2012

На Android 3.x и выше, который имеет RemoteViewsService, можно использовать

@Override
public void onConfigurationChanged(Configuration newConfig) {
   super.onConfigurationChanged(newConfig);
   //call widget update methods/services/broadcasts 
}

в RemoteViewsService childs. Если виджет не будет обновлен, пользовательский интерфейс виджета может быть очищен или просто зависает и перестает реагировать на внешние события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...