誰かが私を助けてくれることを願っています。「カスケード」警告ダイアログのシステムを実装する必要があります。ユーザーは一連の情報をフローのように挿入し、ダイアログから別のダイアログに渡され、データを配列に格納します。特定の条件が検証された場合、このフローの最後に配列のデータをデータベースに格納します。
これを実装できる私のコードは次のとおりです。
これは、フローを実装するサイクルであり、onMenuItemClick イベントによって起動されます
count=0;
do{
AlertDialog dialog;
dialog = alertSequence(view,label,edit);
dialog.show();
}while(count<4);
そしてこれがalertSequence()
関数です
public AlertDialog alertSequence(View v,TextView t,EditText e){
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
final EditText edit = e;
switch(count){
case 0:
builder.setView(v);
t.setText("Inserisci il titolo per il nuovo canto");
builder.setPositiveButton("Continua", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
String elem = edit.getText().toString().trim();
if(elem.equals(null) || elem.length()==0){
// non faccio nulla
}
else{
info[count] = elem;
count++;
}
}
}).setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
count = 10;
dialog.cancel();
}
});
break;
case 1:
builder.setView(v);
t.setText("Inserisci l'autore per il nuovo canto");
builder.setPositiveButton("Continua", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
String elem = edit.getText().toString().trim();
if(elem.equals(null) || elem.length()==0){
// non faccio nulla
}
else{
info[count] = elem;
count++;
}
}
}).setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
count = 10;
dialog.cancel();
}
});
break;
case 2:
builder.setMessage("Seleziona la categoria da assegnare");
int i=1;
String query = "SELECT titolo FROM categorie WHERE titolo<>'uncategorized' ORDER BY titolo ASC";
Cursor c = mydb.select(query);
if(!c.equals(null)){
options = new String[c.getCount()+1];
options[0] = "(annulla)";
while(c.moveToNext()){
options[i] = c.getString(0);
i++;
}
}
c.close();
mydb.close();
builder.setCancelable(false);
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
if(options[which].equals("(annulla)"))
count = 10;
else{
info[count] = options[which];
count++;
}
}
});
break;
case 3:
builder.setView(v);
t.setText("Inserisci il testo per il nuovo canto");
edit.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
edit.setHeight((int) 300d);
edit.setGravity(Gravity.LEFT | Gravity.TOP);
edit.setHorizontallyScrolling(false);
builder.setPositiveButton("Continua", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
String elem = edit.getText().toString().trim();
if(elem.equals(null) || elem.length()==0){
// non faccio nulla
}
else{
info[count] = elem;
count++;
}
}
}).setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
count = 10;
dialog.cancel();
}
});
break;
}
return builder.create();
}
私のスコープに合っていますか?これがWindowManager$BadTokenException を生成しただけです - ウィンドウ トークンを追加できません null はdialog.show()
、do-while サイクルで呼び出したときにアプリケーション用ではありません。何がありえますか?手伝ってくれてありがとう。
編集:
ブラックベルトに感謝します。解決しました。しかし、別のエラーIllegalstateexception - The specified child already has a parent android you must call removeView()
from the child's parent on dialog.show()
. 私はこの問題の何かを赤くしていますが、それを解決する方法がわかりません。助言がありますか?