5

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(); 
    } 



} 

}

+0

È possibile utilizzare il trigger del valore nullo come metodo per avviare nuovamente la finestra di dialogo per ottenere una risposta? – TronicZomB

+0

Posso verificare se non è stato selezionato alcun valore e riattivare la finestra di dialogo. Questa è davvero una soluzione, grazie. – markbratanov

+2

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

risposta

6

Aha! Devi chiamare setCancelable(false) su DialogFragment, non su AlertDialog.builder. Vedi questa domanda: AlertDialog's setCancelable(false) method not working.

La documentazione per DialogFragment.setCancelable(boolean cancelable) stati:

di controllo se la finestra di dialogo mostrata è annullabile. Utilizzare questo invece di chiamare direttamente Dialog.setCancelable (booleano), perché DialogFragment deve cambiare il suo comportamento in base a questo.

Hai solo bisogno di aggiungere 1 riga di codice:

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

Inoltre, sarebbe un bel controllo di sicurezza di avere una città predefinita per ricadere, se in qualche modo la città tornò dalla Dialog è null.

+0

Woooo, questo ha funzionato. Grazie! – markbratanov

2

vorrei solo usare un AlertDialog invece di DialogFragment per questo.

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(); 
+1

Non sono d'accordo, Google ti consiglia di usare 'DialogFragment's - http://android-developers.blogspot.com/2012/05/using-dialogfragments.html –

+0

È un po 'di confusione perché il AlertDialog consente infatti di utilizzare 'alertDialog.setCanceledOnTouchOutside (false);' e 'alertDialog.setCancelable (false);' ma non riesco a ottenere un ListView all'interno di un alertDialog senza utilizzare il builder, che restituisce: ** Il metodo setCanceledOnTouchOutside (booleano) non è definito per il tipo AlertDialog.Builder ** – markbratanov

+0

Probabilmente è necessario utilizzare [setMultiChoiceItems] (http://developer.android.com/reference/android/app/AlertDialog .Builder.html # setMultiChoiceItems (java.lang.CharSequence [], boolean [], android.content.DialogInterface.OnMultiChoiceClickListener)) .Vedo il metodo setCanceledOnTouchOutside nel DialogInterface. Quindi è necessario prima costruire la finestra di avviso e quindi utilizzare tale metodo. – 500865

-2

disattivare il tasto indietro di

@Override 
public void onBackPressed() { 

} 
+1

Quindi l'utente non può mai usare il pulsante Indietro in questo 'Attività' ... non è una buona idea – codeMagic

+2

D'accordo, questo è un hack amatoriale, non una soluzione. –

Problemi correlati