我有一个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.
我尝试过做一些事情,比如先将视图放在'容器'中(另一个布局),或尝试removeView((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。这似乎不起作用。
由于
答案 0 :(得分:0)
是的,根据源文件,任何View实例应该只有1个父级 {机器人} /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();
}
我猜你在xml布局文件中调用了 Activity.this.setContentView(R.layout ....)。在这种情况下, 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);