0

更新: クラッシュ時にログに記録されたエラーを取得しなかったため、Eclipse に何か問題があったに違いありません。説明されているようにアプリがクラッシュしても、このエラーは発生しません。

The specified child already has a parent. You must call removeView() on the child's 
parent first.

これは、noteview.show() メソッドを 2 回目に実行したときに発生します。


元の投稿

AlertDialog別の のリスナー内から開始される に問題がありAlertDialogます。

ダイアログとリスナー、およびダイアログを作成するためのコードはshow()次のとおりです。

AlertDialog.Builder mdialog;
ArrayAdapter<String> popmenu;
EditText input;

mdialog = new AlertDialog.Builder(ShoppingListApp03Activity.this);
popmenu  = new ArrayAdapter<String>(ShoppingListApp03Activity.this,
           android.R.layout.select_dialog_item);
popmenu.add("Notes");
popmenu.add("Remove");
noteview = new AlertDialog.Builder(ShoppingListApp03Activity.this)
noteview.setTitle("Notes");
input = new EditText(this);
noteview.setView(input);

lv.setOnItemLongClickListener(new OnItemLongClickListener() {
   @Override
       public boolean onItemLongClick(AdapterView<?> parent, View view, int position,
                                                     long id) {
           final String sitem = items.get(position).getId();
           mdialog.setAdapter(popmenu, new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int item) {
                 if (item == 0) {
                    updateFooter("Not implemented. (" + sitem + ")");
                noteview.show();
                 } else {
                    deleteitem = Integer.parseInt(sitem);
                    rmvdialog.show();
                 }
              }
           });

           mdialog.show();
           return false;
        }
     });

/* Click listener for the "Notes" popup menu: */
noteview.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        Editable value = input.getText();
        // Do something with value!
    }
});
noteview.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // Canceled.
    }
});

onItemLongClickListener、2 つの選択肢を提示するポップアップ メニューを開きます。

で始まる 2 つ目は、rmvdialog()うまく機能します。問題ありません。

メモ ダイアログを開く最初のものには問題があります。最初のアクセスでは、メモ ダイアログが開き、メッセージとOKおよびCancelボタンが表示されます。OKただし、クリックするかメモ ダイアログでリスト (メイン ビュー) に戻った後Cancel(どちらもまだ何もしていないため)、2 回目の長いクリックでメモ ダイアログを選択すると、アプリケーションがクラッシュします。

クラッシュはエラーログなしです。try-catch周りも何も明らかにnoteview.show()しません。

私は自分のコードを見て盲目になるので、おそらく設計に腐敗したものがありますが、何がわかりません。

ここでの全体的な機能は、いくつかの項目を含むリストです。アイテムの 1 つを長押しすると、2 つのエントリを含むポップアップ メニューが表示されます。次に、「メモ」と呼ばれるものを長押しすると、リスト内のアイテムのテキストを表示/編集するためのダイアログが表示されます。

4

1 に答える 1

1

あなたも私がしたのと同じことを知ったので。これが私があなたに要求した私のテスト活動です。ご覧のとおり、これはあなたのバージョンを取り除いたものです(ただし、onlongclickの代わりにonclickを使用します)

public class MainActivity extends Activity {

    private Builder firstDialogBuilder;
    private AlertDialog firstDialog;
    private Builder secondDialogBuilder;
    private AlertDialog secondDialog;
    private ListView secondListView;
    private ListView firstListView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        firstDialogBuilder = new AlertDialog.Builder(this);
        firstListView = new ListView(this);
        firstListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new String[] {"First Item1", "First Item2"}));
        firstDialogBuilder.setView(firstListView);
        firstListView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                secondListView = new ListView(MainActivity.this);
                secondListView.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, new String[] {"Second Item1", "Second Item2"}));
                secondDialogBuilder.setView(secondListView);
                secondDialog = secondDialogBuilder.create();
                secondDialog.show();
            }
        });

        secondDialogBuilder = new AlertDialog.Builder(this);
        secondListView = new ListView(this);
        secondListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new String[] {"Second Item1", "Second Item2"}));
        secondDialogBuilder.setView(secondListView);

        secondDialogBuilder.setPositiveButton("ok", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(getApplicationContext(), "ok on second", Toast.LENGTH_SHORT).show();
                secondDialog.dismiss();
            }
        });
        secondDialogBuilder.setNegativeButton("cancel", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(getApplicationContext(), "cancel on second", Toast.LENGTH_SHORT).show();
                secondDialog.dismiss();
            }
        });

        firstDialog = firstDialogBuilder.create();
        firstDialog.show();
    }
}

次回は、私たちがあなたを助けるのを助けるためにそのようなものを提供してください:)

于 2012-09-24T12:52:16.490 に答える