FindViewById en una vista personalizada para encontrar la vista secundaria
He definido una vista, se extiende RelativeLayout
, Quiero extraer a sus hijos cuyo ID se especifican en el archivo xml de diseño.
En HeaderView.java
:
- Android: un método findViewById () que devuelve valores que no necesitamos emitir
- FindViewById donde ID es cadena dinámica
- View.findViewById () devuelve null
- NullPointerException al llamar a findViewById () para obtener la vista de un fragmento
- FindViewById devuelve el elemento erróneo?
1 package com.example.test; 2 3 public class HeaderView extends RelativeLayout { 4 5 public HeaderView(Context context, AttributeSet attrs) { 6 this(context, attrs, 0); 7 8 TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.HeaderView, 0, 0); 9 10 int headerId = 0; 11 int containerId = 0; 12 13 // find attributes 14 if (arr != null) { 15 if (arr.hasValue(R.styleable.HeaderView_headerview_header)) { 16 headerId = arr.getResourceId(R.styleable.HeaderView_headerview_header, 0); 17 } 18 if (arr.hasValue(R.styleable.HeaderView_headerview_container)) { 19 containerId = arr.getResourceId(R.styleable.HeaderView_headerview_container, 0); 20 } 21 arr.recycle(); 22 } 23 24 Log.d("test", String.format("headerId: %s, containerId %s", headerId, containerId)); 25 // headerId: 2131296260, containerId 2131296259 26 27 // here: mHeaderContainer is null 28 mHeaderContainer = (RelativeLayout) findViewById(headerId); 29 mContentViewContainer = (RelativeLayout) findViewById(containerId); 30 } 31 }
He definido su atributo en headview_attrs.xml
:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="HeaderView"> <attr name="headerview_header" format="reference" /> <attr name="headerview_container" format="reference" /> </declare-styleable> </resources>
Utilizo esta vista en un archivo xml de diseño, en activity_headerview.xml
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:test="http://schemas.android.com/apk/res/com.example.test" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.test.HeaderView android:layout_width="match_parent" android:layout_height="match_parent" test:headerview_container="@+id/headerview_content" test:headerview_header="@+id/headerview_header" > <RelativeLayout android:id="@+id/headerview_header" android:layout_width="match_parent" android:layout_height="30dp" > </RelativeLayout> <RelativeLayout android:id="@+id/headerview_content" android:layout_width="match_parent" android:layout_height="match_parent" > </RelativeLayout> </com.example.test.HeaderView> </RelativeLayout>
Aquí el problema viene: en HeaderView.java, line 28, 29, mHeaderContainer
y mContentViewContainer
son nulos.
Parece que en activity_headerview.xml
, RelativeLayout
cuyo id es headerview_header
y RelativeLayout
cuyo id es headerview_content
no son los hijos de HeaderView
.
¿Hice algo mal? ¡Cualquier ayuda será grande!
- FindViewById devuelve null - Android - setContentView
- La diferencia entre LayoutInflater.inflate y findViewById
- No es necesario emitir el resultado de findViewById?
- ¿Cómo puedo "findViewById" con fragmentos?
- ¿Cómo puedo encontrar el ID de un fragmento? Alternativamente, ¿cómo doy al fragmento una identificación?
- No se puede resolver el método 'findViewById (int)'
- No se puede resolver el método 'findViewById (int)' en Fragment
- Cómo encontrar id de diseño en un botón de mapa de bits java fuente que he hecho
Cuando se creó su vista personalizada, la vista secundaria no se ha adjuntado a su vista. Intenta mover el código al método onFinishInflate () . Este método será invocado por LayoutInflater después de que todo el diseño haya sido inflado.
- ANR en actividad para difusión de Intenciones
- Establecer ADB en modo TCP / IP: ¿dispositivo no encontrado?