novedades - android oreo descargar
Problema de orientaciĆ³n de la pantalla de Android 8.1: voltear para orientar una pantalla vertical (10)
Tengo todas las actividades en modo vertical, excepto la que uso para reproducir un video que siempre es horizontal. Descubrí que en Android 8.1 cada vez que abro la actividad de video y la cierro, la actividad anterior va al paisaje, incluso si está configurada como "vertical" en el manifiesto.
- A veces va al retrato y luego al paisaje y permanece en el paisaje.
- A veces va al retrato, luego al paisaje y finalmente al retrato nuevamente.
Esto solo sucede cuando retrocede de una actividad que es paisaje.
¿Alguien está experimentando esto?
Gracias.
EDITAR
Reporto el error en Google: https://issuetracker.google.com/issues/69168442
EDITAR 2
Parece arreglado en Android 9
Acabo de encontrar este problema en mi propia aplicación.
La solución que funciona para mí es la siguiente:
onCreate(){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
onPause(){
if (android.os.Build.VERSION.SDK_INT >= 27) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
}
onResume(){
if (android.os.Build.VERSION.SDK_INT >= 27) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
}
El código anterior debe ir en la actividad que está en modo horizontal (es decir, la segunda actividad y la que presiona el botón Atrás)
Me gustaría señalar que esta solución no era mía, y la tomé de la publicación número 20 en el siguiente enlace (que también se observa en el OP):
https://issuetracker.google.com/issues/69168442
Simplemente pensé que podría ser más fácil para las personas acceder si no tienen que buscar en otra página.
El uso de
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)
en la Actividad anterior resolvió mi problema.
En el método onCreate de cada actividad, inserte esta línea
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
por el paisaje y
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
para los retratos
Esto solucionó el problema.
Anule el método onBackPressed () de la actividad horizontal y configure la orientación en vertical .
@Override
public void onBackPressed() {
super.onBackPressed();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
La próxima solución puede ayudarlo a resolver el problema.
Debes extender todas tus actividades usando la que está en el código. Se encarga de establecer y restaurar las orientaciones correctas siempre que se invoquen los métodos onPause / onResume.
La solución alternativa funcionará para cualquier tipo de orientación definida en las etiquetas de actividad de manifiesto.
Para mis propios fines, extiendo esta clase desde ComponentActivity , por lo que es posible que desee cambiar esto para extender desde Activity , ActivityCompat o cualquier tipo de actividad que esté utilizando en su código.
public abstract class AbsBaseActivity extends ComponentActivity
{
private int currentActivityOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
private int parentActivityOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@CallSuper
@Override
protected void onCreate(@Nullable final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.cacheOrientations();
}
private void cacheOrientations()
{
if (this.currentActivityOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
{
final Intent parentIntent = this.getParentActivityIntent();
if (parentIntent != null)
{
final ComponentName parentComponentName = parentIntent.getComponent();
if (parentComponentName != null)
{
this.currentActivityOrientation = this.getConfiguredOrientation(this.getComponentName());
this.parentActivityOrientation = this.getConfiguredOrientation(parentComponentName);
}
}
}
}
private int getConfiguredOrientation(@NonNull final ComponentName source)
{
try
{
final PackageManager packageManager = this.getPackageManager();
final ActivityInfo activityInfo = packageManager.getActivityInfo(source, 0);
return activityInfo.screenOrientation;
}
catch (PackageManager.NameNotFoundException e)
{
e.printStackTrace();
}
return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
}
@CallSuper
@Override
protected void onPause()
{
if (this.parentActivityOrientation != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
{
this.setRequestedOrientation(this.parentActivityOrientation);
}
super.onPause();
}
@CallSuper
@Override
protected void onResume()
{
super.onResume();
if (this.currentActivityOrientation != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
{
this.setRequestedOrientation(this.currentActivityOrientation);
}
}
}
Para solucionar este problema:
Cuando regrese a la Actividad A desde la Actividad B y si conoce la orientación de la pantalla de la Actividad A, configure la orientación de la pantalla en la destrucción de la Actividad B.
@Override
protected void onDestroy() {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
super.onDestroy();
}
Si necesita apoyar los cambios de orientación en la actividad de los padres, considere usar la orientación actual en onPause () de su actividad de paisaje.
onCreate(){
super.onCreate();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
onPause(){
super.onPause();
if (android.os.Build.VERSION.SDK_INT >= 27) {
setRequestedOrientation(getResources().getConfiguration().orientation);
}
}
onResume(){
super.onResume();
if (android.os.Build.VERSION.SDK_INT >= 27) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
}
Esta respuesta se basa en la de TheTestSpecimen .
Si tiene DialogTheme like theme = Theme.AppCompat.Light.Dialog en su manifiesto, elimine la etiqueta de orientación establecida para esa actividad de Diálogo del manifiesto, tomará la Orientación de la actividad anterior y colocará la etiqueta de orientación para las actividades restantes
y para las siguientes versiones coloque esto en oncreate
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
y configure el tema para la aplicación Theme.AppCompat.Light.DarkActionBar sin necesidad de agregar un tema a las actividades
Tuve tal problema y he estado probando todos los casos de uso anteriores. La mayoría de ellos funcionan, pero hay un caso que debe saber:
La razón final fue el uso de fragmentos dentro de un diseño de contenido de actividad en el caso de Android 8 . Por ejemplo: la actividad se inicia en modo horizontal , pero el fragmento muestra el diseño vertical .
Intenta evitar fragmentos.
de la respuesta de Narmi :
Cuando regrese a la Actividad A desde la Actividad B y si conoce la orientación de la pantalla de la Actividad A, configure la orientación de la pantalla en la destrucción de la Actividad B.
debe detectar si la actividad se está destruyendo por el cambio de configuración, por lo tanto, agregue el campo
isConfigurationChanged = false
, luego en el método
onSaveInstanceState
gírelo a
true
y en el método
onDestroy
agregue esto:
@Override protected void onDestroy() { if(!isConfigurationChanged) setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); super.onDestroy(); }