5

Po uruchomieniu aplikacji po raz pierwszy chciałem poprosić użytkownika (przez okno dialogowe), aby wybrał swoje miasto, które następnie zapisałoby ich preferencje i załadowało odpowiednie dane do listy. Zauważyłem jednak, że okno dialogowe może zostać zamknięte przez przycisk Wstecz lub naciśnięcie w dowolnym miejscu poza oknem dialogowym, które następnie uruchamia wartość pustą dla bazy danych.Wymuszenie wyboru użytkownika w oknie dialogowym

Czy mimo to mogę wymusić otwarcie okna dialogowego, dopóki użytkownik nie wybierze opcji?

Wcześniej zaimplementowałem .setCancelable(false) i wydaje się, że to nie działa. Mój kod jest poniżej, DialogSetup jako wewnętrzna klasa, z którą pracuję.

Każda pomoc/pomysły będą mile widziane.

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

Czy można użyć tego wyzwalacza wartości null jako sposobu ponownego uruchomienia okna dialogowego w celu uzyskania odpowiedzi? – TronicZomB

+0

Mogłem sprawdzić, czy nie wybrano żadnej wartości i ponownie uruchomić okno dialogowe. To jest rzeczywiście rozwiązanie, dzięki. – markbratanov

+2

Można również użyć 'onDismissListener', aby nie odrzucać, jeśli nie ma wartości, jak sądzę. Althoug, nie wiem dlaczego 'setCancelable (false)' nie działa. Nie użyłem 'DialogFragment' ale działa dobrze w innych' 'dialogach' – codeMagic

Odpowiedz

6

Aha! Musisz zadzwonić pod numer setCancelable(false) na DialogFragment, a nie na AlertDialog.builder. Zobacz to pytanie: AlertDialog's setCancelable(false) method not working.

Dokumentacja dla DialogFragment.setCancelable(boolean cancelable) stany:

kontrolować, czy pokazane dialogowe można anulować. Użyj tego zamiast bezpośredniego wywoływania Dialog.setCancelable (boolean), ponieważ DialogFragment musi zmienić swoje zachowanie w oparciu o to.

Wystarczy dodać 1 wiersz kodu:

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

Również byłoby miłym kontrola bezpieczeństwa, aby mieć domyślne miasto, by się znowu na razie jakoś miasto wrócił z Dialog to null.

+0

Woooo, działało. Dziękuję Ci! – markbratanov

2

chciałbym po prostu użyć AlertDialog zamiast DialogFragment do tego.

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

Nie zgadzam się, Google zaleca korzystanie z' DialogFragment's - http://android-developers.blogspot.com/2012/05/using-dialogfragments.html –

+0

To jest trochę mylące, ponieważ AlertDialog rzeczywiście pozwala używać 'alertDialog.setCanceledOnTouchOutside (false);' i 'alertDialog.setCancelable (false);' ale nie mogę dostać ListView wewnątrz alertuDogog bez użycia budowniczego, który powroty: ** metoda setCanceledOnTouchOutside (logiczna) jest nieokreślona dla typu AlertDialog.Builder ** – markbratanov

+0

Prawdopodobnie trzeba użyć [setMultiChoiceItems] (http://developer.android.com/reference/android/app/AlertDialog .Builder.html # setMultiChoiceItems (java.lang.CharSequence [], boolean [], android.content.DialogInterface.OnMultiChoiceClickListener)) .Widzę metodę setCanceledOnTouchOutside w DialogInterface. Musisz więc najpierw zbudować okno alertu, a następnie użyć tej metody. – 500865

-2

Wyłącz przycisk Wstecz przez

@Override 
public void onBackPressed() { 

} 
+1

Wtedy użytkownik nie może nigdy użyć przycisku wstecz w tej "Aktywności" ... nie jest to dobry pomysł. – codeMagic

+2

Zgadzam się, to jest amatorskie włamanie, a nie rozwiązanie. –

Powiązane problemy