2012-02-11 2 views
18

私は、ダイアログを作成してそこから値を取得するためのコーディングをするクラスを持っています。それは1つのために正常に動作します。私が2回目にダイアログを呼び出そうとすると、次のエラーメッセージが表示されます。指定された子にはすでに親があります。最初に子の親に対してremoveView()を呼び出さなければなりません

:java.lang.IllegalStateException:指定された子がすでに親を持っています。子の親で最初にremoveView()を呼び出す必要があります。

removeView()を削除する方法を教えてください。

ここはクラスのコードです。

package com.util; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.widget.EditText; 

/** 
* helper for Prompt-Dialog creation 
*/ 
public abstract class PromptDialog extends AlertDialog.Builder implements OnClickListener { 
private final EditText input; 

/** 
    * @param context 
    * @param title resource id 
    * @param message resource id 
    */ 
public PromptDialog(Context context, int title, int message) { 
    super(context); 
    setTitle(title); 
    //:TODO Display msg only if not empty 
    //setMessage(message); 

    input = new EditText(context); 
    setView(input); 

    setPositiveButton("ok", this); 
    setNegativeButton("cancel", this); 
} 

/** 
    * will be called when "cancel" pressed. 
    * closes the dialog. 
    * can be overridden. 
    * @param dialog 
    */ 
public void onCancelClicked(DialogInterface dialog) { 
    dialog.dismiss(); 
} 

@Override 
public void onClick(DialogInterface dialog, int which) { 
    if (which == DialogInterface.BUTTON_POSITIVE) { 
    if (onOkClicked(input.getText().toString())) { 
    dialog.dismiss(); 
    } 
    } else { 
    onCancelClicked(dialog); 
    } 
} 

/** 

     * called when "ok" pressed. 
     * @param input 
     * @return true, if the dialog should be closed. false, if not. 
     */ 
    abstract public boolean onOkClicked(String input); 
    } 

ここで私がクラスのインスタンスと呼ぶコードです。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 



final PromptDialog dlgName = new PromptDialog(this, R.string.enterName, R.string.enter_comment) { 
      @Override 
      public boolean onOkClicked(String input) { 
       // do something 
       mName = input; 
        save(); 
          //end do some thing 
       return true; // true = close dialog 
      } 
     };  


    mTxtShiftName = (TextView) findViewById(R.id.shiftname); 
      mTxtShiftName.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       dlgName.show(); 
      } 
     }); 
+0

2回目の試行でもう一度ダイアログコンストラクタを呼び出していますか? –

+0

私が使用しているすべてのコードが私の質問でコピーされています。私はそれが理由だと思う。しかし、私はこれを避ける方法を知らない? – SAN

+0

ボタンをクリックしたときにコンストラクタを2度コールしないでください。 Dialogコンストラクタで 'onCreate'でダイアログを一度作成するか、単にコードで' onPrepareDailog'を作成し、表示したいときはdialog.show()を呼び出してください。 –

答えて

1

代わりonCreate(Bundle)onCreateDialog(int)コールバックメソッド内ダイアログコンストラクタを呼び出すコードを配置する必要があります。あなたのコードでは、dlgName.show()に電話すると暗黙のうちにダイアログが初期化されます。その結果、ダイアログを2回目に呼び出すと、ダイアログコンストラクタが表示されます。

66

私のフラグメントのonCreateView()コールで間違ったinflateメソッドを呼び出すことからこのエラーが発生しました。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_saves, container, false); 
} 
+1

私の人生を保存した最後の議論のように嘘つき!ありがとう! –

+0

その男にメダルを贈る!ありがとう – Karoly

0

チェックこのアウト:

http://developer.android.com/reference/android/view/LayoutInflater.html#inflate(int,android.view.ViewGroup,boolean)

具体的

、boolean型の引数と戻り値これに

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_saves, container); 
} 

私はこのことから変更することで、それを修正しましたLayoutInflatorのinflateメソッド:

戻り値 膨張した階層のルートビュー。 rootが指定され、attachToRootがtrueの場合、これはrootです。 これは、拡張されたXMLファイルのルートです。

View dialogView = inflater.inflate(R.layout.brush_opts_dialog, rootView, false); 

あなたは膨張したビューのルートではなくアクティビティの内部断片全体だろう「これ」、より作成したビューであることをしたいです。

関連する問題

 関連する問題