2017-02-02 2 views
-1

В моей OnCreate(), у меня есть такой код:LinearLayout.addView - У указанного дочернего элемента уже есть родитель. Вы должны вызвать removeView() на родителе ребенка первого

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.activity_main2); 

    newMethod(); 

    getSupportActionBar().hide(); 


} 

эта функция newMethod() будет вызывать эту функцию:

private void setupScreen() { 


    leftlayout = (LinearLayout) findViewById(R.id.leftlayout); 
    if (leftlayout == null) { 
     leftlayout = new LinearLayout(this); 
     leftlayout.setOrientation(LinearLayout.VERTICAL); 
     leftlayout.setGravity(Gravity.FILL_VERTICAL); 
    } 

    rightlayout = (LinearLayout) findViewById(R.id.rightlayout); 
    if (rightlayout == null) { 
     rightlayout = new LinearLayout(this); 
     rightlayout.setOrientation(LinearLayout.VERTICAL); 
     rightlayout.setGravity(Gravity.FILL_VERTICAL); 
    } 

    mainlayout = (LinearLayout) findViewById(R.id.mainlayout); 
    if (mainlayout == null) { 
     mainlayout = new LinearLayout(this); 
     mainlayout.setOrientation(LinearLayout.HORIZONTAL); 
     mainlayout.setGravity(Gravity.FILL_VERTICAL); 
    } 

    loadButtons(defaultChords); 

    mainlayout.addView(leftlayout); 

    mainlayout.addView(rightlayout); 

    //this.setContentView(R.layout.activity_main2); 
    this.setContentView(mainlayout); 
} 

ошибка основана на этой строке: mainlayout.addView(leftlayout);.

Указанный ребенок уже имеет родителя. Вы должны вызвать removeView() на родителя ребенка первого

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/mainlayout" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/guitarbody" 
    android:weightSum="1"> 

    <LinearLayout 
     android:id="@+id/leftlayout" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_gravity="center" 
     android:layout_weight="0.7" 
     android:gravity="center" 
     android:orientation="vertical"> 

     <Button 
      android:id="@+id/k0" android:text="chord" android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.29"/> 

    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/rightlayout" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_weight="0.3" 
     android:layout_gravity="center" 
     android:gravity="center" 
     android:orientation="vertical" 
     > 

    </LinearLayout> 

</LinearLayout> 
+0

разместить XML-файл – arjun

+0

макета обновленный вопрос с файлом XML. – JackPowell

ответ

0
leftlayout = (LinearLayout) findViewById(R.id.leftlayout); 
    if (leftlayout == null) { 
     leftlayout = new LinearLayout(this); 
     leftlayout.setOrientation(LinearLayout.VERTICAL); 
     leftlayout.setGravity(Gravity.FILL_VERTICAL); 
    } 

Ошибка означает, что вы добавляете view как ребенок, который уже имеет родителя к другому родителю layout. Итак, в приведенном выше коде, когда выполняется условие if, что означает, что всякий раз, когда во время выполнения создается новый Layout, он будет работать нормально, поскольку он не имеет родителя. Но когда макет создается с использованием метода findViewById(), у созданного макета уже есть родительский элемент, поэтому ошибка будет сброшена.

Даже корневой элемент вашего макета xml-файла будет дочерним по отношению к системному сгенерированному родительскому объекту, к которому он будет прикреплен

Таким образом, решение будет всегда создавать view во время выполнения и добавить его в родительском макет

Удалить leftlayout и rightlayout макетов из XML-файла, а затем создать и добавить эту раскладку по мере необходимости

или попробовать это

mainlayout = (LinearLayout) findViewById(R.id.mainlayout); 
if (mainlayout == null) { 
    mainlayout = new LinearLayout(this); 
    mainlayout.setOrientation(LinearLayout.HORIZONTAL); 
    mainlayout.setGravity(Gravity.FILL_VERTICAL); 
} 

leftlayout = (LinearLayout) findViewById(R.id.leftlayout); 
if (leftlayout == null) { 
    leftlayout = new LinearLayout(this); 
    leftlayout.setOrientation(LinearLayout.VERTICAL); 
    leftlayout.setGravity(Gravity.FILL_VERTICAL); 
    mainlayout.addView(leftlayout) 
} 

rightlayout = (LinearLayout) findViewById(R.id.rightlayout); 
if (rightlayout == null) { 
    rightlayout = new LinearLayout(this); 
    rightlayout.setOrientation(LinearLayout.VERTICAL); 
    rightlayout.setGravity(Gravity.FILL_VERTICAL); 
    mainlayout.addView(rightlayout) 
} 
this.setContentView(mainlayout); 
+0

Спасибо за ответ, как мне изменить свой код, если я намерен сохранить его таким образом? – JackPowell

+0

как я уже упоминал donot создать вид из макета. удалите те строки, где вы создаете макеты с помощью метода 'findViewById()' – arjun

0

попробуйте этот код в onCreate() вашей деятельности:

setContentView(R.layout.activity_main2); 
LinearLayout Main_layout=(LinearLayout)findViewById(R.id.mainlayout); 
//remove parent view first 
((ViewGroup)Main_layout.getParent()).removeView(Main_layout); 
newMethod(); 
+0

, это может работать, но не рекомендуется, потому что это будет похоже на то, что вы добавляете представление в xml-файл, а затем удаляете его в onCreate, а затем снова создаете тот же вид и настройку layout – arjun

+0

Привет, я уже пробовал код, ошибок не было (я не знаю), но! студия android выполняет приложение на устройстве, приложение никогда не появляется на экране устройства – JackPowell

+0

, рекомендуется, чтобы u вызывал 'setcontView' один раз в активности ... – rafsanahmad007

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

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