5

第一次啓動應用程序時,我想提示用戶(通過對話框)選擇他們的城市,然後保存他們的偏好並將適當的數據加載到列表視圖中。但是,我注意到可以通過後退按鈕關閉對話框,或者向對話框外部的任何位置推入對話框,然後觸發數據庫的空值。強制用戶在對話框中選擇選項

是否有反正我可以強制對話框保持打開,直到用戶選擇了一個選項?我已經實施了.setCancelable(false),這似乎不起作用。我的代碼如下,DialogSetup是我正在使用的內部類。

任何幫助/想法,將不勝感激。

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

您可以使用該空值觸發器作爲再次啓動對話框以獲取答案的方式嗎? – TronicZomB 2013-04-10 19:02:56

+0

我可以檢查是否未選擇任何值並重新觸發對話框。這確實是一個解決方案,謝謝。 – markbratanov 2013-04-10 19:04:27

+2

我相信你也可以使用'onDismissListener'來不排除沒有價值。 Althoug,我不知道爲什麼'setCancelable(false)'不起作用。我沒有使用'DialogFragment',但在其他'Dialogs'中正常工作 – codeMagic 2013-04-10 19:05:08

回答

6

啊哈禁用後退按鈕!您必須撥打DialogFragment上的setCancelable(false),而不是AlertDialog.builder。看到這個問題:AlertDialog's setCancelable(false) method not working

的文檔DialogFragment.setCancelable(boolean cancelable)狀態:

控制所示的對話框是否取消。使用它而不是直接調用Dialog.setCancelable(boolean),因爲DialogFragment需要根據這個來改變它的行爲。

你只需要加1行代碼:

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

而且,這將是一個很好的安全檢查,有一個默認的城市回落到,如果以某種方式從城市Dialog返回是null

+0

Woooo,這工作。謝謝! – markbratanov 2013-04-10 21:27:10

2

我只想用一個AlertDialog,而不是DialogFragment這一點。

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

不贊同,Google建議您使用'DialogFragment's - http://android-developers.blogspot.com/2012/05/using-dialogfragments.html – 2013-04-10 19:33:37

+0

這有點令人困惑,因爲AlertDialog確實允許你使用'alertDialog.setCanceledOnTouchOutside(false)'和'alertDialog.setCancelable(false)';'但是我似乎無法在不使用構建器的情況下在alertDialog中獲得ListView返回: **類型AlertDialog.Builder的setCanceledOnTouchOutside(boolean)方法未定義** – markbratanov 2013-04-10 19:42:01

+0

可能需要使用[setMultiChoiceItems](http://developer.android.com/reference/android/app/AlertDialog .Builder.html#setMultiChoiceItems(java.lang.CharSequence [],boolean [],android.content.DialogInterface.OnMultiChoiceClickListener)) 。我在DialogInterface中看到setCanceledOnTouchOutside方法。所以你需要先建立警報對話框,然後使用該方法。 – 500865 2013-04-10 19:50:04

-2

通過

@Override 
public void onBackPressed() { 

} 
+1

然後用戶永遠不能使用後面的按鈕在這個'活動'...不是一個好主意 – codeMagic 2013-04-10 19:35:23

+2

同意,這是一個業餘黑客,而不是一個解決方案。 – 2013-04-10 19:36:25