Указанный ребенка уже есть родитель. Сначала необходимо вызвать 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);
}
}
}


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

824   9  

9 ответов:

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

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

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

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

layoutInflater = LayoutInflater.from(context);
return new VH(layoutInflater.inflate(R.layout.single_row, parent));
он должен быть!--4-->
return new VH(layoutInflater.inflate(R.layout.single_row, null));

просто передайте аргумент attachtoroot как false

View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false);

Я получил этой при попытке зафиксировать фрагмент с помощью attach to root в true вместо false, например:

return inflater.inflate(R.layout.fragment_profile, container, true)

после:

return inflater.inflate(R.layout.fragment_profile, container, false)

это сработало.

Если другое решение не работает, как:

View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false);

проверьте, что вы возвращаете из onCreateView фрагмента это один вид или viewgroup? в моем случае у меня был viewpager в корне xml фрагмента, и я возвращал viewpager, когда я добавил viewgroup в макет, я не обновил, что теперь мне нужно вернуть viewgroup, а не viewpager(view).

в моем случае проблема была вызвана тем, что я раздувал Родительский вид с <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() помог решить проблему.

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

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

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

Это также устанавливает положительные и отрицательные кнопки (OK и cancel) с onClickListeners.

вы можете использовать этот метод, чтобы проверить, если вид имеет детей или нет .

public static boolean hasChildren(ViewGroup viewGroup) {
    return viewGroup.getChildCount() > 0;
 }

проверьте, если вы уже добавили вид

if (textView.getParent() == null)
    layout.addView(textView);

Comments

    Ничего не найдено.