View.addView() выбрасывает IllegalStateException (ViewSwitcher)`
У меня есть ViewSwitcher и я хочу добавить к нему представления:
// initialize views
final ViewSwitcher switcher = new ViewSwitcher(this);
layMenu = (LinearLayout)findViewById(R.id.menu_main_view);
final LevelPicker levelPicker = new LevelPicker(getApplicationContext());
(//)switcher.addView(layMenu);
(//)switcher.addView(findViewById(R.layout.menu_switcher));
Один - это пользовательский вид, другой - из XML. Я прокомментировал один из них, но они оба, кажется, бросаютIllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Я попытался сделать несколько вещей, таких как сначала поместить представления в "контейнер" (другой макет), или попытался удалить ViewView((View)getParent), как я полагаю, что logcat пытается сказать…
Вот мой XML-файл (в двух словах):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu_main_view">
<TextView>
</TextView>
<LinearLayout>
<Button></Button> //couple of buttons
</LinearLayout>
</LinearLayout> //this is the parent i guess
Моим первым предположением было то, что все дети должны быть в 1 родителе, что в моем случае является LinearLayout. Это не похоже на работу.
Спасибо
1 ответ
Да, любой экземпляр View должен иметь только одного родителя в соответствии с исходным файлом {android} /frameworks/base/core/java/android/view/View.java
чтобы удалить экземпляр View из его контейнера, вам нужно сделать следующее:
// View view = ...
ViewParent parent = view.getParent();
if (parent instanceof ViewGroup) {
ViewGroup group = (ViewGroup) parent;
group.removeView(view);
}
else {
throw new UnsupportedOperationException();
}
Я предполагаю, что вы вызвали Activity.this.setContentView(R.layout....) в файле макета XML. в этом случае родителем представления LinearLayout был другой экземпляр LinearLayout, предоставленный "окном декорации".
часто не рекомендуется убирать единственного потомка из "окна декорации". вам лучше явно создать дочерние элементы ViewSwitcher:
// Activity.this.setContentView(viewSwitcher);
// final Context context = Activity.this;
final android.view.LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View layMenu = inflater.inflate(R.layout...., null /* container */);
final View menuSwitcher = inflater.inflate(R.layout...., null /* container */);
viewSwitcher.addView(layMenu);
viewSwitcher.addView(menuSwitcher);