2011-12-31 3 views
1

У меня есть ViewSwitcher и хочу добавить к нему взгляды:View.addView() бросает IllegalStateException (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

да любой View экземпляр должен иметь только один из родителей в соответствии с исходным файлом {андроида} /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); 
+0

Я в замешательстве. т.е. мой LevelPicker - это настраиваемый класс, расширяющий LinearLayout, где в конструкторе я вызываю this.addView (inflater.inflate (R.layout ...). Как бы я сделал это правильно? Также должно быть содержимое Xml при выполнении что вы описали выше? – user717572

+0

LayoutInflater подходит для файла макета xml. В случае с LevelPicker просто создайте экземпляр с помощью нового оператора java или, если хотите, вы также можете использовать XML-файл для описания пользовательского интерфейса на его основе так же, как вы используете обычный LinearLayout в xml. Единственное различие заключается в том, что вы должны использовать квалифицированное имя LevelPicker в качестве тега xml, то есть chyou

+0

любой действительный XML-файл макета, который вы использовали в вызове Activity.this.setContentView(), может быть «завышен» с помощью LayoutInflater. – chyou

Смежные вопросы