AlertDialog.Builder не удаляется правильно - PullRequest
0 голосов
/ 10 января 2012

Исходя из другого вопроса, который я задал, я создал новый класс для AlertDialog.Builder.Это используется в нескольких классах, продуманных мое приложение.Я создаю объект класса в классе, который я использую, затем вызываю метод show (), когда это необходимо.Это выглядит правильно.

У меня проблема, как только я пытаюсь снова вызвать show (), я получаю следующую ошибку:

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

Я не уверен на 100%, где мне нужночтобы вызвать это removeView или конкретное представление.Ниже приведен код класса диалога

public class CommentDialog {
    private final Context context;
    private final AlertDialog.Builder builder;    
    private String text;

    private EditText editText;

    public CommentDialog(Context context) {
        this.context = context;

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.comment_dialog, null);

        editText = (EditText) layout.findViewById(R.id.comment_text);
        editText.setText(getCommentText());

        builder = new AlertDialog.Builder(context);

        builder.setView(LayoutInflater.from(context).inflate(R.layout.round_comment_dialog, null));
        builder.setTitle(R.string.round_comment_title); 
        builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int id) {

                               setCommentText(editText.getText().toString());

                           }
                        });
        builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int id) {


                           }
                        });
        builder.create();
    }

    public void setCommentText(String pCommentText) {
        text = pCommentText;
    }

    public String getCommentText() {
        return text;
    }

    public void show() {
        builder.show();
    }


}

Спасибо за ваше время

РЕДАКТИРОВАНО

добавлено round_comment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dip"
    android:background="@drawable/border_main"
    android:orientation="vertical" >

        <EditText
            android:id="@+id/comment_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip"
            android:gravity="top|left"
            android:inputType="textMultiLine"
            android:lines="5" >
        </EditText>

</LinearLayout>

РЕДАКТИРОВАННЫЙ MK2

В основном классе я делаю следующее:

над конструктором

private CommentDialog myDialog;

в пределах oncreate ()

myDialog = new CommentDialog(this);

Затем нажмите кнопку:

case R.id.round_comment_button:
            myDialog.setommentText(comentText);
            myDialog.show();

            roundComentText = myDialog.getRoundCommentText();

            break;

Ответы [ 4 ]

1 голос
/ 10 января 2012

Вам лучше просто расширить класс Dialog и создать его, а затем показать его. Конечно, ваши представления будут создаваться в конструкторе вашего класса Dialog. Поскольку в диалоге нет кнопок «Положительный» и «Отрицательный», вам придется создать своих собственных и настроить анонимных слушателей, чтобы ваш диалог мог их прослушивать. Все остальное должно быть легко.

0 голосов
/ 10 января 2012

попробуйте

 protected Dialog onCreateDialog(int id) {
 switch (id) {
 case 0:
 return new AlertDialog.Builder(this)
         .setIcon(R.drawable.icon)
         .setTitle(“This is a dialog with some simple text...”)
         .setPositiveButton(“OK”, new
    DialogInterface.OnClickListener() {
  public void onClick(DialogInterface dialog,
    int whichButton)
 {
  Toast.makeText(getBaseContext(),
  “OK clicked!”, Toast.LENGTH_SHORT).show();
  }
 })
       .setNegativeButton(“Cancel”, new
        DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog,
       int whichButton)
     {
       Toast.makeText(getBaseContext(),
      “Cancel clicked!”, Toast.LENGTH_SHORT).show();
  }
  })
0 голосов
/ 10 января 2012

Ошибка само по себе объясняет, что представление, чей «вид / макет содержимого», который вы устанавливаете, уже имеет свой макет.
Не могли бы вы вытащить строку, в которой эта ошибка происходит, из журнала cat.
Тогдапопытайтесь определить, настраиваете ли вы какой-либо макет / представление для какого-либо представления в вашем коде в этой точке.
Если это так, то вызовите метод removeView () перед настройкой его представления / макета содержимого.

0 голосов
/ 10 января 2012
public CommentDialog(Context context) 
{
        this.context = context;
}


**Replace the constructor with Activity**

public CommentDialog(Activity activity) 
{
        this.activity= activity;
}
...