Si está manejando cambios de orientación usted mismo, entonces este es un enfoque.
Yo no pretendo que esta es una solución elegante, pero funciona:
Puede hacer un seguimiento de si el diálogo tiene una instancia activa dentro de la misma clase de diálogo, mediante el uso de un activeInstance variable estática, y anulando onStart() para establecer activeInstance = this y onCancel() para establecer activeInstance = null.
Proporcionar un método estático updateConfigurationForAnyCurrentInstance() que pone a prueba esa variable activeInstance y, si no nulo, invoca un método activeInstance.reInitializeDialog(), que es un método que se va a escribir para contener la llamada setContentView() más el código de que conecta los controladores para los controles de diálogo (botón en los manejadores Click, etc.), este es el código que normalmente aparecería en onCreate()). Después de eso, restauraría cualquier información mostrada a esos controles (de variables miembro en su objeto de diálogo). Entonces, por ejemplo, si tenía una lista de elementos para ser vistos, y el usuario estaba viendo el elemento tres de esa lista antes de que cambie la orientación, volvería a mostrar el mismo elemento tres al final de updateConfigurationForAnyCurrentInstance(), justo después volver a cargar los controles desde el recurso de diálogo y volver a cablear los controladores de control.
A continuación, llamar a ese mismo método reInitializeDialog() desde onCreate(), justo después de super.onCreate(), y colocar su onCreate() - código de inicialización específica (por ejemplo, la creación de la lista de elementos a partir del cual el usuario podría elegir, como se describe arriba) después de esa llamada.
Esto hará que se cargue el recurso apropiado (vertical u horizontal) para la nueva orientación del diálogo (siempre que tenga dos recursos definidos con el mismo nombre, uno en la carpeta de diseño y el otro en la carpeta layout-land , como siempre).
Aquí hay un código que estaría en una clase llamada YourDialog:
ArrayList<String> listOfPossibleChoices = null;
int currentUserChoice = 0;
static private YourDialog activeInstance = null;
@Override
protected void onStart() {
super.onStart();
activeInstance = this;
}
@Override
public void cancel() {
super.cancel();
activeInstance = null;
}
static public void updateConfigurationForAnyCurrentInstance() {
if(activeInstance != null) {
activeInstance.reInitializeDialog();
displayCurrentUserChoice();
}
}
private void reInitializeDialog() {
setContentView(R.layout.your_dialog);
btnClose = (Button) findViewById(R.id.btnClose);
btnClose.setOnClickListener(this);
btnNextChoice = (Button) findViewById(R.id.btnNextChoice);
btnNextChoice.setOnClickListener(this);
btnPriorChoice = (Button) findViewById(R.id.btnPriorChoice);
btnPriorChoice.setOnClickListener(this);
tvCurrentChoice = (TextView) findViewById(R.id.tvCurrentChoice);
}
private void displayCurrentUserChoice() {
tvCurrentChoice.setText(listOfPossibleChoices.get(currentUserChoice));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
reInitializeDialog();
listOfPossibleChoices = new ArrayList<String>();
listOfPossibleChoices.add("One");
listOfPossibleChoices.add("Two");
listOfPossibleChoices.add("Three");
currentUserChoice = 0;
displayCurrentUserChoice();
}
@Override
public void onClick(View v) {
int viewID = v.getId();
if(viewID == R.id.btnNextChoice) {
if(currentUserChoice < (listOfPossibleChoices.size() - 1))
currentUserChoice++;
displayCurrentUserChoice();
}
}
else if(viewID == R.id.btnPriorChoice) {
if(currentUserChoice > 0) {
currentUserChoice--;
displayCurrentUserChoice();
}
}
Etc.
Luego, en el método de su actividad onConfigurationChanged(), que acaba de invocar YourDialog.updateConfigurationForAnyCurrentInstance() siempre onConfigurationChanged() es llamado por el sistema operativo.
Creo que sería una experiencia de usuario extraña si el usuario no puede girar la pantalla cuando se muestra un cuadro de diálogo. – Flo
Posiblemente, pero pronto aprenderían a no hacerlo. Girar mientras tienen el diálogo abierto significa guardar el estado del diálogo, descartar el diálogo, abrirlo nuevamente y poner toda la lógica que estaba en onCreateDialog en onPrepareDialog, y finalmente restaurar el estado. Algo desordenado – locka
Por supuesto que pueden aprenderlo, pero cuando uso una aplicación, quiero que encaje en la experiencia general de Android. Y la experiencia general de las aplicaciones estándar de Android no me impide rotar mi dispositivo cuando quiero. Por supuesto, es más fácil bloquear la rotación, pero a sus usuarios no les importa si es más fácil de implementar, solo les interesa el comportamiento de la aplicación. Solo mis 2 centavos. – Flo