Intereting Posts
Android: макеты «скользят» с экрана? Ведение позиции Drag & Dropped при перезапуске Установите анимационный прослушиватель на анимацию активности Установите верхний регистр для TextView Как изменить битрейт аудиофайла на 32 кбит / с в Android Получение ошибки / предупреждения для множественного числа: «Количество« один »соответствует более чем одному конкретному номеру …» IPv6 Socket на Android Как полностью заменить listView / GridView с помощью RecyclerView? Почему для линейного макета невозможно использовать атрибуты стиля Интегрируйте dropbox в мое приложение, которое показывает предупреждение безопасности Gson и Active Android: Попытка сериализации java.lang.Class. Забыл зарегистрировать адаптер типа? Просмотр пейджера с универсальным загрузчиком изображений Отображение огромной карты с хорошей производительностью на Android? Android_app-> activity-> internalDataPath все еще NULL в 2.3.8 NDK r8 Как получить цвет фона уведомлений по умолчанию для пользовательского уведомления в Lollipop?

Обнаружение вращения главного экрана Android

У меня есть виджет приложения, который при его обновлении извлекает изображение, имеющее размеры в соответствии с виджетами, и помещает это изображение в ImageView (через RemoteViews ). Он работает отлично.

Но для устройств, поддерживающих вращение главного экрана (и я не говорю о вращении, например, Activity основанной на ориентации устройства, но о вращении самого домашнего экрана ), размеры и соотношение сторон виджета немного меняются при движении От пейзажа к портрету и наоборот … т.е. фиксированный размер не поддерживается.

Таким образом, мой виджет должен иметь возможность обнаруживать, когда главный экран вращается, и извлекает новое изображение (или, по крайней мере, загружает другое предварительно загруженное изображение).

Я не могу для жизни меня разобраться, возможно ли и как это возможно. Любые подсказки?

Solutions Collecting From Web of "Обнаружение вращения главного экрана Android"

Для определения ориентации используйте код ниже:

  View view = getWindow().getDecorView(); int orientation = getResources().getConfiguration().orientation; if (Configuration.ORIENTATION_LANDSCAPE == orientation) { relativeLayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.log_landscape)); imageview_Logo.setImageResource(R.drawable.log_landscape_2); Log.d("Landscape", String.valueOf(orientation)); //Do SomeThing; // Landscape } else { relativeLayout.setBackgroundDrawable( getResources().getDrawable(R.drawable.login_bg) ); imageview_Logo.setImageResource(R.drawable.logo_login); //Do SomeThing; // Portrait Log.d("Portrait", String.valueOf(orientation)); } 

Проверьте этот код:

  myButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { int rotation = getWindowManager().getDefaultDisplay() .getRotation(); // DisplayMetrics dm = new DisplayMetrics(); // getWindowManager().getDefaultDisplay().getMetrics(dm); int orientation; CharSequence text; switch (rotation) { case Surface.ROTATION_0: text = "SCREEN_ORIENTATION_PORTRAIT"; break; case Surface.ROTATION_90: text = "SCREEN_ORIENTATION_LANDSCAPE"; break; case Surface.ROTATION_180: text = "SCREEN_ORIENTATION_REVERSE_PORTRAIT"; break; case Surface.ROTATION_270: text = "SCREEN_ORIENTATION_REVERSE_LANDSCAPE"; break; default: text = "SCREEN_ORIENTATION_PORTRAIT"; break; } // CharSequence text = String.valueOf(orientation); Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER | Gravity.CENTER, 10, 0); toast.show(); } }); 

Используйте метод Activity onConfigurationChanged. См. Следующий код:

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Checks the orientation of the screen if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); } } 

Итак, для виджетов мы должны добавить наш класс приложения, как показано ниже, и не забудьте также объявить его в манифесте, этот метод в основном отправляет обновление для всех экземпляров вашего виджета.

 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); } } 

И в манифесте …

 <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 --> 

Возможно, вы можете создать изображение с прозрачным фоном. Если изображение достаточно маленькое, чтобы оно соответствовало также при повороте, вам не нужно будет повторно его извлекать.

Вы можете прослушивать трансляцию ACTION_CONFIGURATION_CHANGED, которая отправляется системой Android, когда изменилась текущая конфигурация устройства (ориентация, локаль и т. Д.). Согласно документации:

ACTION_CONFIGURATION_CHANGED:

Трансляция: текущая конфигурация устройства (ориентация, локаль и т. Д.) Изменилась. Когда такое изменение произойдет, пользовательские интерфейсы (иерархия представления) необходимо будет перестроить на основе этой новой информации; По большей части, приложениям не нужно беспокоиться об этом, потому что система позаботится о том, чтобы остановить и перезапустить приложение, чтобы убедиться, что оно видит новые изменения. Некоторый системный код, который не может быть перезапущен, должен будет следить за этим действием и обрабатывать его соответствующим образом.

Вы не можете получить это через компоненты, объявленные в манифесте, только путем явной регистрации для него с помощью Context.registerReceiver ().

Это защищенный объект, который может быть отправлен системой.

 public class YourWidgetProvider extends AppWidgetProvider { @Override public void onEnabled(Context context) { super.onEnabled(context); context.registerReceiver(mOrientationChangeReceiver,new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED)); } @Override public void onDisabled(Context context) { context.unregisterReceiver(mOrientationChangeReceiver); super.onDisabled(context); } public BroadcastReceiver mOrientationChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent myIntent) { if ( myIntent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) { if(context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){ // landscape orientation //write logic for building remote view here // buildRemoteViews(); } else { //portrait orientation //write logic for building remote view here // buildRemoteViews(); } } } }; } 

Вы можете проверить его с помощью ширины и высоты виджетов, как это сделано в следующем фрагменте кода:

 WindowManager wm; Display ds; public boolean portrait; public void checkOrientation() { wm = getWindowManager(); ds=wm.getDefaultDisplay(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); checkOrientation(); if (ds.getWidth() > ds.getHeight()) { // ---landscape mode--- portrait = false; } else if (ds.getWidth() < ds.getHeight()) { // ---portrait mode--- portrait = true; } } 
 View view = getWindow().getDecorView(); int orientation = getResources().getConfiguration().orientation; if (Configuration.ORIENTATION_LANDSCAPE == orientation) { relativeLayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.log_landscape)); imageview_Logo.setImageResource(R.drawable.log_landscape_2); Log.d("Landscape", String.valueOf(orientation)); //Do SomeThing; // Landscape } else { relativeLayout.setBackgroundDrawable( getResources().getDrawable(R.drawable.login_bg) ); imageview_Logo.setImageResource(R.drawable.logo_login); //Do SomeThing; // Portrait Log.d("Portrait", String.valueOf(orientation)); }