All'avvio dell'applicazione per la prima volta volevo chiedere all'utente (tramite la finestra di dialogo) di selezionare la città, quindi salvare le proprie preferenze e caricare i dati corretti in listview. Tuttavia, ho notato che una finestra di dialogo può essere chiusa dal pulsante Indietro, o spingere ovunque al di fuori della finestra di dialogo, che quindi attiva un valore nullo per il database.Forza l'utente a selezionare l'opzione nella finestra di dialogo
Esiste comunque la possibilità che la finestra di dialogo rimanga aperta finché l'utente non ha selezionato un'opzione?
Ho già implementato .setCancelable(false)
e questo non sembra funzionare. Il mio codice è sotto, DialogSetup essere la classe interna con cui sto lavorando.
Qualsiasi aiuto/idea sarebbe apprezzato.
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();
}
}
}
È possibile utilizzare il trigger del valore nullo come metodo per avviare nuovamente la finestra di dialogo per ottenere una risposta? – TronicZomB
Posso verificare se non è stato selezionato alcun valore e riattivare la finestra di dialogo. Questa è davvero una soluzione, grazie. – markbratanov
Si potrebbe anche usare un 'onDismissListener' per non ignorare se non c'è alcun valore, credo. Althoug, non so perché 'setCancelable (false)' non funzioni. Non ho usato un 'DialogFragment' ma funziona bene in altri' Dialoghi' – codeMagic