vista studio rotación rotacion pantalla orientacion manejando horizontal forzar fijar detectar cambio cambiar android rotation android-appwidget homescreen

studio - Detectar la rotación de la pantalla de inicio de Android



rotacion de pantalla android studio (7)

Tengo un Widget de aplicación que, cuando se actualiza, recupera una imagen que tiene dimensiones que coinciden con el widget y coloca esa imagen en un ImageView (a través de RemoteViews ). Funciona bien

Pero para los dispositivos que admiten la rotación de la pantalla de inicio (y no estoy hablando de rotación de, por ejemplo, una Activity basada en la orientación del dispositivo, sino de la rotación de la pantalla de inicio ), las dimensiones y la relación de aspecto del widget cambian un poco cuando se va de paisaje a retrato y viceversa ... es decir, no se mantiene un tamaño fijo.

Por lo tanto, mi widget debe ser capaz de detectar cuándo gira la pantalla de inicio y buscar una nueva imagen (o al menos cargar una imagen pre-captada diferente).

No puedo por mi vida averiguar si y cómo esto es posible. ¿Alguna pista?


Comprueba este código funciona:

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


Puede escuchar la emisión ACTION_CONFIGURATION_CHANGED que se envía por el sistema Android cuando la configuración actual del dispositivo (orientación, configuración regional, etc.) ha cambiado. Según la documentación:

ACTION_CONFIGURATION_CHANGED:

Acción de difusión: la configuración actual del dispositivo (orientación, configuración regional, etc.) ha cambiado. Cuando ocurra un cambio de este tipo, las IU (jerarquía de vista) deberán reconstruirse en base a esta nueva información; En su mayor parte, las aplicaciones no tienen que preocuparse por esto, porque el sistema se encargará de detener y reiniciar la aplicación para asegurarse de que ve los nuevos cambios. Algunos códigos del sistema que no se pueden reiniciar deberán estar atentos a esta acción y manejarlo adecuadamente.

No puede recibir esto a través de componentes declarados en manifiestos, solo registrándose explícitamente con Context.registerReceiver ().

Esta es una intención protegida que solo puede ser enviada por el sistema.

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


Puede verificarlo utilizando el ancho y el alto de los widgets como se hace en el siguiente fragmento de código:

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


Tal vez podrías enmarcar tu imagen con un fondo transparente. Si la imagen es lo suficientemente pequeña como para caber también cuando está girada, no necesitará volver a buscarla.


Utilice el código de abajo para detectar la orientación:

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


Utilice el método de actividad onConfigurationChanged. Vea el siguiente código:

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

De acuerdo, para los widgets tenemos que agregar nuestra clase de aplicación como se muestra a continuación y no olvide declararla también en manifiesto, el método básicamente envía una difusión de actualización a todas las instancias de su widget.

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

y en manifiesto ...

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


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