Forzar al usuario a seleccionar la opción en el diálogo

Al iniciar la aplicación por primera vez quería pedir al usuario (por diálogo) para seleccionar su ciudad, que a continuación, en consecuencia, guardar su preferencia y cargar los datos adecuados en el listview. Sin embargo, he notado que un diálogo puede ser cerrado por el botón de retroceso, o empujar en cualquier lugar fuera del cuadro de diálogo, que luego activa un valor nulo para la base de datos.

¿Hay de todos modos puedo forzar el cuadro de diálogo a permanecer abierto hasta que el usuario ha seleccionado una opción?

Ya he implementado .setCancelable(false) y esto no parece funcionar. Mi código está abajo, DialogSetup es la clase interna con la que estoy trabajando.

Cualquier ayuda / ideas sería apreciada.

 public class MainActivity extends ListActivity { private Cursor lines; private MetroSleepDb db; private ListAdapter adapter; public static final String PREFS_NAME = "METROSLEEP_PREFS"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); chooseCityDialog(); } public void setAdapters() { db = new MetroSleepDb(this); lines = db.getLines(); // you would not typically call this on the main thread //ListView listView = (ListView) findViewById(R.id.li); adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, lines, new String[] {"line_id"}, new int[] {android.R.id.text1}, 0); getListView().setAdapter(adapter); getListView().setOnItemClickListener(onAnswerClicked); } public String getItem(int pos) { Cursor c = (Cursor) adapter.getItem(pos); String value = c.getString(c.getColumnIndex("line_id")); return value; } private OnItemClickListener onAnswerClicked = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String line_value = getItem(position); Intent intent = new Intent(MainActivity.this, ChooseStations.class); intent.putExtra("line", line_value); startActivity(intent); } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // This ID represents the Home or Up button. In the case of this // activity, the Up button is shown. Use NavUtils to allow users // to navigate up one level in the application structure. For // more details, see the Navigation pattern on Android Design: // // http://developer.android.com/design/patterns/navigation.html#up-vs-back // NavUtils.navigateUpFromSameTask(this); return true; case R.id.menu_settings: Intent intent = new Intent(this, SettingsActivity.class); startActivity(intent); return true; } return super.onOptionsItemSelected(item); } public void chooseCityDialog() { DialogFragment newFragment = new DialogSetup(); newFragment.show(getFragmentManager(), "citypref"); } public static final class DialogSetup extends DialogFragment { public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.prompt_choose_city) .setCancelable(false) .setItems(R.array.Cities, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // } }); return builder.create(); } } 

}

¡Ah! setCancelable(false) llamar a setCancelable(false) en el DialogFragment , no al AlertDialog.builder . Vea esta pregunta: El método setCancelable (false) de AlertDialog no funciona .

La documentación para DialogFragment.setCancelable(boolean cancelable) indica:

Controlar si el cuadro de diálogo mostrado es cancelable. Use esto en lugar de llamar directamente a Dialog.setCancelable (boolean), porque DialogFragment necesita cambiar su comportamiento basado en esto.

Sólo tienes que añadir 1 línea de código:

 public void chooseCityDialog() { DialogFragment newFragment = new DialogSetup(); newFragment.setCancelable(false); newFragment.show(getFragmentManager(), "citypref"); } 

Además, sería un buen chequeo de seguridad para tener una ciudad por defecto a la que recurrir, si de alguna manera la ciudad devuelta desde el Dialog es null .

Sólo usaría un AlertDialog lugar de DialogFragment para esto.

  AlertDialog dlgBuilder = new AlertDialog.Builder(this); dlgBuilder.setMessage("Title"); dlgBuilder.setCancelable(false) .setPositiveButton("OK", new OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { okCalledMethodInactivity(); dialogInterface.dismiss(); } }) .setNegativeButton("Exit app", new OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { finish(); } }); AlertDialog dlg = dlgBuilder.create(); dlg.show(); 

Deshabilitar el botón de retroceso

 @Override public void onBackPressed() { } 
  • ¿Puedo añadir AnimationListener para la traducción Fragment?
  • Mapview y Fragmento
  • Edittext obtiene automáticamente el foco cuando se mueve entre páginas en un paginador de vista
  • HorizontalScrollView en TabHost añadiendo espacio adicional al final
  • Fragmento de niño que reemplaza el diseño de raíz de fragmento padre
  • Manera correcta de dar datos iniciales a los fragmentos?
  • TabLayout dentro de la barra de herramientas
  • método no sobrescribe el método de su superclase. Fragmento Android
  • Borde alrededor del botón transparente
  • Android - Deslizamiento de fragmentos al hacer clic en elemento de lista
  • Funciones de llamada dentro de fragmentos en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.