Указанный ребенка уже есть родитель. Сначала необходимо вызвать 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);
}
}
}
Я знаю, что этот вопрос был задан раньше, но в моем случае это не помогло.
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()следующий метод:он должен быть!--4-->layoutInflater = LayoutInflater.from(context); return new VH(layoutInflater.inflate(R.layout.single_row, parent));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; }
Comments