5

初めてアプリケーションを起動するときに、ダイアログを表示してユーザに都市を選択させ、結果としてその優先度を保存し、適切なデータをリストビューにロードしたかった。しかし、私はダイアログが戻るボタンで閉じることができること、またはダイアログボックスの外側を押すことでデータベースのNULL値をトリガーすることに気がつきました。ユーザがダイアログでオプションを選択するように強制する

とにかくユーザーがオプションを選択するまでダイアログボックスを開いたままにすることはできますか?

私は既に.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

答えを得るためにダイアログを再開する方法として、null値トリガを使用できますか? – TronicZomB

+0

値が選択されていないかどうかを確認し、ダイアログを再トリガーすることができます。それは確かに解決策です、ありがとう。 – markbratanov

+2

また、値がなければ 'onDismissListener'を使用して却下しないこともできます。 Althoug、なぜ 'setCancelable(false)'が機能しないのか分かりません。私は 'DialogFragment'を使用していませんが、他の' Dialogs'でもうまくいきます。 – codeMagic

答えて

6

アハで戻るボタンを無効にします! ではなく、DialogFragmentsetCancelable(false)に電話する必要があります。この質問を参照してください:AlertDialog's setCancelable(false) method not working

DialogFragment.setCancelable(boolean cancelable)状態のドキュメント:示すダイアログがキャンセル可能かどうかを

コントロール。 DialogFragmentはこれに基づいて動作を変更する必要があるため、Dialog.setCancelable(boolean)を直接呼び出す代わりにこれを使用します。何とか市はDialogから返された場合、バックにフォールするデフォルトの街を持っている素敵な安全確認となり、また

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

は、あなただけのコードの1行を追加する必要がありますnullです。

+0

Woooo、これはうまくいった。ありがとうございました! – markbratanov

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

反対に、あなたは 'DialogFragment'sを使うことをお勧めします - http://android-developers.blogspot.com/2012/05/using-dialogfragments.html –

+0

AlertDialogは本当に 'alertDialog.setCanceledOnTouchOutside(false);'と 'alertDialog.setCancelable(false);'を使用できるので少し混乱しますが、Builderを使用せずにalertDialog内でListViewを取得できないようです戻り値: **タイプAlertDialog.Builder **のsetCanceledOnTouchOutside(boolean)メソッドは未定義です** – markbratanov

+0

おそらく[setMultiChoiceItems](http://developer.android.com/reference/android/app/AlertDialog)を使用する必要があります。 .Builder.html#setMultiChoiceItems(java.lang.CharSequence []、boolean []、android.content.DialogInterface.OnMultiChoiceClickListener)) 。DialogInterfaceにsetCanceledOnTouchOutsideメソッドがあります。したがって、最初に警告ダイアログを作成し、その方法を使用する必要があります。 – 500865

-2

@Override 
public void onBackPressed() { 

} 
+1

その後、この「アクティビティ」の中でバックボタンを使用することはできません。良い考えではありません – codeMagic

+2

合意しました。これは、アマチュアのハックであり解決策ではありません。 –

関連する問題