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?
- Error de Android: no se puede realizar esta operación porque se ha cerrado el grupo de conexiones
- Uso de android Inflate fuera de onCreateView
- Establecer tema para un fragmento
- Fragmentos, DialogFragment y Rotación de Pantalla
- Cómo obtener clics de botón en fragmento de host del fragmento de diálogo
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(); } }
}
- Viewpager no funciona correctamente en lollipop 5.0 cuando uso otros fragmentos
- ¿Cómo puedo obtener una referencia a un fragmento en un ViewPager?
- Obtener una referencia a un niño Fragmento después de que el fragmento padre se ha recreado
- Android API TabActivity deprecation
- android no puede resolver el método setcontentview
- Cómo iniciar la actividad en una nueva ventana Utilización de WebView?
- Mide la vista en el fragmento
- cómo comprobar si una actividad implementa una interfaz después de onAttach (Activity activity) ha sido depreciada
¡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() { }