1

我有一个 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

我的第一个猜测是所有孩子都必须在一个父母中,在我的例子中是线性布局。这似乎不起作用。

谢谢

4

1 回答 1

0

是的,根据源文件 {android}/frameworks/base/core/java/android/view/View.java ,任何 View 实例都应该只有 1 个父级

为了从容器中移除一个 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);
于 2011-12-31T02:05:53.937 回答