0

私はこれについて検索して検索しましたが、残念ながら、カスタムダイアログで以前に膨らんだビューを再利用する方法についての有用な情報は見つかりませんでした。

これは私が試したものです(どれもうまくいきませんでした)

アプローチ1:

alertdialog Builderをグローバルに保ち、onCreate()必要なことを実行します。

private AlertDialog.Builder dialog;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dialog = new AlertDialog.Builder(this);
        detailView = getLayoutInflater().inflate(R.layout.detail, null);
        TextView textview1 = (TextView)detailView.findViewById(R.id.lblName);
        TextView textview2 = (TextView)detailView.findViewById(R.id.lblSubtitle);

        textview1.setText("Test1");
        textview2.setText("Test2");
        dialog.setView(detailView);
        dialog.create();

    btnSearch = (ImageView)findViewById(R.id.btnSearch);
    btnSearch.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            dialog.show();
        }
    });
    }

そして、必要なときにそれを表示します。dialog.show();

動作しませんでした、LogCat出力:

Uncaught handler: thread main exiting due to uncaught exception
java.lang.IllegalStateException: The specified child already has a parent. 
You must call removeView() on the child's parent first.

アプローチ2:

onCreate()レイアウトを膨らませてクリックイベントで:

dialog = new AlertDialog.Builder(this);
    TextView textview1 = (TextView)detailView.findViewById(R.id.lblName);
    TextView textview2 = (TextView)detailView.findViewById(R.id.lblSubtitle);
    textview1.setText("Test1");
    textview2.setText("Test2");
    dialog.setView(detailView);
    dialog.create();

しかし、クラッシュして同じエラー出力が表示されました。

もちろん、出力を読んで親を見つけようとしたので、親はダイアログ自体になると思いましたが、ビューを削除する方法がないため、どうすればよいかわかりません。

また、textview参照を再利用する方法はありますか?

(コーディングが不十分であることはわかっています。機能させたいだけで、適切にリファクタリングします。

4

2 に答える 2

1

ダイアログをキャンセルまたは閉じるときは、膨らんだビューを削除する必要があります。次のコードはこれを行います:

dialog.setOnDismissListener(new OnDismissListener() {
  @Override
  public void onDismiss(DialogInterface dialog) {
    try{
      ((FrameLayout)detailView.getParent()).removeView(detailView);
    }catch(Exception e){
      //todo handle the case detailView doesn't have a parent
    }
  }
});

次に、detailViewを新しいダイアログに再度追加できます。

于 2012-10-24T18:33:16.503 に答える
0

すでにそれを解決しました:

問題は次のとおりです。

AlertDialog.Builder私はではなくを表示しようとしていましたAlertDialog。と宣言したときに何を考えていたのかわかりませんdialog

AlertDialogを宣言し、の結果を割り当てたところ、意図したとおりに機能し、1回だけ膨らみbuilder.create()ました。

特に@LaurenceDawsonに感謝します。彼の答えは、私のコードが間違っていることに気づきました。

于 2012-10-24T18:48:51.863 に答える