已解: El niño especificado ya tiene un padre. Primero debe llamar a removeView() en el padre del niño.


/com.kotlin_learn E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.limm.kotlin_learn, PID: 7055
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

El mensaje de error es:

java.lang.IllegalStateException: el hijo especificado ya tiene un padre. Primero debe llamar a removeView() en el padre del niño.

Literalmente significa que cuando se carga la vista secundaria recién agregada, ya existe un diseño principal, pero este diseño principal se desconoce, por lo que la vista principal de la vista actual debe eliminarse antes de poder agregarla.

Como lo indica el mensaje de error, significa que la Vista que desea operar ahora ya tiene una Vista principal, por lo que debe buscar ese lugar. Por ejemplo, al crear esta Vista, llamó al método addView, etc., para que tiene una clase padre desconocida del nombre (simplemente no lo sabes)

Este problema generalmente ocurre al agregar View dinámicamente. Por ejemplo, algunos proyectos utilizan un determinado control, como LinearLayout, como variable global para que se pueda llamar directamente a addView en otros lugares para una adición dinámica. Tenga en cuenta que si declara LinearLayout, intente agregar dinámicamente una vista inmediatamente después. No problema: ¡eso significa que las llamadas globales definitivamente funcionarán! Por lo tanto, el problema debe ser que cuando creaste tu propia Vista definida, llamaste a addView y otros métodos, para que tenga una clase principal, o ya tiene una clase principal, y no prestaste atención, por lo que, naturalmente, reportar un error.


Qué escribir antes de informar un error:

class MenuPagerAdapter(private val viewList: List<View>) : PagerAdapter() {
    
    

private val viewList: List<View>

override fun destroyItem(container: View, position: Int, `object`: Any) {
    
    
    //原本打算在destroyItem这个方法里面去移除掉当前view,然后新增一个,已打
        (container as MenuViewpager).removeView(viewList[position])
    }


    override fun instantiateItem(container: ViewGroup, position: Int): Any {
    
    
    
		//但是报错是在这一行
         (container as MenuViewpager).addView(viewList[position])
        return viewList[position]
    }
}

Si usa este control personalizado, definitivamente no puede agregarlo a otros diseños a través de addView, porque informará el error como se mencionó anteriormente, porque ya tiene una clase principal (addView(myView); en el código hace que tenga una clase principal , aunque nadie sabe quién es su clase principal~), por lo que debes comentar addView(myView); esta CustomView es una vista independiente.

解决办法:

Agregue juicio sobre el diseño principal en el método instantiateItem(), luego elimínelo y finalmente addView()


	private val viewList: List<View>

    override fun instantiateItem(container: ViewGroup, position: Int): Any {
    
    
        if (viewList.isNotEmpty()) {
    
    
            val view = viewList[position]
            val parent = view.parent as ViewGroup
            if (parent != null) {
    
    
                parent.removeView(viewList[position])
            }
            (container as MenuViewpager).addView(viewList[position])
            return viewList[position]
        }else{
    
    
            return super.instantiateItem(container, position)
        }
    }

​ ----------------------------
Esta es la forma de escribirlo en Kotlin. Es fácil de entender cuando se convierte a Java. Puedes convertirlo tú mismo ~

おすすめ

転載: blog.csdn.net/qq_41998504/article/details/123550466