2015-01-21 1 views
66

В моем приложении мне нужно часто переключаться между двумя макетами. Ошибка происходит в макете, размещенной ниже.У указанного ребенка уже есть родитель. Вы должны сначала вызвать removeView() для родителя ребенка (Android)

Когда мой макет называется в первый раз, ошибки не возникает, и все в порядке. Когда я затем вызвать другую раскладку (пробел один), а затем назвать мой макет во второй раз, он дает мне следующую ошибку:

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

Мой макет-код выглядит следующим образом:

tv = new TextView(getApplicationContext()); // are initialized somewhere else 
    et = new EditText(getApplicationContext()); // in the code 


private void ConsoleWindow(){ 
     runOnUiThread(new Runnable(){ 

    @Override 
    public void run(){ 

     // MY LAYOUT: 
     setContentView(R.layout.activity_console); 
     // LINEAR LAYOUT 
     LinearLayout layout=new LinearLayout(getApplicationContext()); 
     layout.setOrientation(LinearLayout.VERTICAL); 
     setContentView(layout); 

     // TEXTVIEW 
     layout.addView(tv); // <========== ERROR IN THIS LINE DURING 2ND RUN 
     // EDITTEXT 
     et.setHint("Enter Command"); 
     layout.addView(et); 
     } 
    } 
} 

Я знаю, что этот вопрос задавали раньше, но это не помогло в моем случае.

ответ

197

В сообщении об ошибке говорится, что вы должны делать.

// TEXTVIEW 
if(tv.getParent()!=null) 
    ((ViewGroup)tv.getParent()).removeView(tv); // <- fix 
layout.addView(tv); // <========== ERROR IN THIS LINE DURING 2ND RUN 
// EDITTEXT 
23

Я пришел сюда при поиске ошибки с помощью моего recyclerview, но решение не сработало (очевидно). Я написал причину и решение для нее в случае recyclerview. Надеюсь, это поможет кому-то.

ошибка вызывается, если в onCreateViewHolder() следующий метод следует:

layoutInflater = LayoutInflater.from(context); 
return new VH(layoutInflater.inflate(R.layout.single_row, parent)); 

Вместо этого он должен быть

return new VH(layoutInflater.inflate(R.layout.single_row, null)); 
+3

Иногда случайные ответы, которые не являются именно ответы на задаваемые вопросы, помогут кому-то еще. Это сработало для меня. Благодаря! –

+0

Ницца !, и поэтому люди в большинстве случаев пропускают «нуль» как 2d-параметры на надувных устройствах. Благодарю. – superUser

+1

Передача Null параметру, ответственному за родителя, не плохая идея, но вы должны знать, что в этом случае дочерний вид (тот, который вы надуваете) не сможет правильно измерить его в некоторых случаях, потому что он ничего не знаю о родителях. В некоторых случаях это будет работать, но в некоторых нет. – Sniper

0

Я нашел другое исправление:

if (mView.getParent() == null) { 
        myDialog = new Dialog(MainActivity.this); 
        myDialog.setContentView(mView); 
        createAlgorithmDialog(); 
       } else { 
        createAlgorithmDialog(); 
       } 

Здесь я просто иметь оператор if, если у представления есть родительский элемент, и если он не создал новый диало g, установите contentView и покажите диалог в моем методе createAlgorithmDialog().

Это также устанавливает положительные и отрицательные кнопки (кнопки ok и отмены) с помощью onClickListeners.

1

В моем случае проблема была вызвана тем, что я раздувал родительский вид с макетом <merge>. В этом случае addView() вызвал сбой.

View to_add = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, true); 
// parent_layout.addView(to_add); // THIS CAUSED THE CRASH 

Удаление addView() помогли решить эту проблему.

7

просто передать attachtoroot аргумент ложный

View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false); 
Смежные вопросы

 Смежные вопросы