Esta es una pregunta canónica para un problema que se publica con frecuencia en StackOverflow.
Estoy siguiendo un tutorial. He creado una nueva actividad con un asistente. Obtengo NullPointerException
cuando intento llamar a un método en View
s obtenido con findViewById()
en mi actividad onCreate()
.
Actividad onCreate()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View something = findViewById(R.id.something);
something.setOnClickListener(new View.OnClickListener() { ... }); // NPE HERE
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
Diseño XML ( fragment_main.xml
):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="packagename.MainActivity$PlaceholderFragment" >
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/something" />
</RelativeLayout>
findViewById()
enrootView
y no en la actividad.Prueba el
OnStart()
método y solo usao declarar cualquier vista usando el
getView().findViewById
método enonStart()
Declarar oyente de clics en la vista por
anyView.setOnClickListener(this);
fuente
Intente cambiar sus vistas de acceso al método de fragmento onViewCreated porque a veces, cuando intenta acceder a las vistas en el método onCreate, no se procesan en el momento, lo que resulta en una excepción de puntero nulo.
fuente
De acuerdo, este es un error típico porque las personas a menudo no comprenden realmente cómo funcionan los Fragmentos cuando comienzan a trabajar en el desarrollo de Android. Para aliviar la confusión, creé un código de ejemplo simple que publiqué originalmente en La aplicación está detenida en el emulador de Android , pero también lo publiqué aquí.
Un ejemplo es el siguiente:
activity_container.xml:
ExampleFragment:
fragment_example.xml:
Y ese debería ser un ejemplo válido, muestra cómo puede usar una Actividad para mostrar un Fragmento y manejar eventos en ese Fragmento. Y también cómo comunicarse con la actividad que lo contiene.
fuente
Otto
para la comunicación en lugar de devoluciones de llamada, y usarloButterknife
para inyectar vistas.La vista "algo" está en fragmento y no en actividad, por lo que en lugar de acceder a ella en actividad, debe acceder a ella en la clase de fragmento como
En PlaceholderFragment.class
fuente
Está intentando acceder a los elementos de la interfaz de usuario en el
onCreate()
, pero es demasiado pronto para acceder a ellos, ya que las vistas en fragmentos se pueden crear en elonCreateView()
método. Y elonActivityCreated()
método es confiable para manejar cualquier acción sobre ellos, ya que la actividad está completamente cargada en este estado.fuente
Agregue lo siguiente en su activity_main.xml
fuente
Dado que ha declarado su Vista en el
fragment_main.xml
, mueva ese fragmento de código donde obtiene el NPE en elonCreateView()
método del fragmento. Esto debería resolver el problema.fuente
en el código publicado arriba en la pregunta hay un problema: está utilizando R.layout.activity_main en el método oncreate, pero el nombre del archivo xml es "fragment_main.xml", significa que está tratando de obtener la vista del archivo fragment_main.xml que no se muestra, por lo que da una excepción de puntero nulo. cambiar el código como:
fuente
Debes recordar que lo importante es: NullPointerException ocurre cuando has declarado tu variable e intentas recuperar su valor antes de asignarle un valor.
fuente
Utilice el método onViewCreated () siempre que utilice o llame a vistas desde fragmentos.
fuente
Tengo lo mismo
NullPointerException
inicializando un oyente después de llamarfindViewById()
onCreate()
yonCreateView()
métodos.Pero cuando lo he usado
onActivityCreated(Bundle savedInstanceState) {...}
funciona. Entonces, pude acceder alGroupView
y configurar mi oyente.Espero te sea de ayuda.
fuente
La biblioteca más popular para buscar vistas que utilizan casi todos los desarrolladores.
Cuchillo de mantequilla
Como puedo, hay suficientes respuestas para explicar la búsqueda de puntos de vista con la metodología adecuada. Pero si es un desarrollador de Android y codifica con frecuencia a diario, puede usar un cuchillo de mantequilla, lo que le ahorra mucho tiempo en la búsqueda de vistas y no tiene código de escritura para ello. Con 2-3 pasos puede encontrar vistas en milisegundos. .
Agregue dependencia en el nivel de aplicación gradle:
Agregar complemento para cuchillo de mantequilla:
Luego busque Android ButterKnife Zelezny e instale el complemento y reinicie su estudio y terminado.
Ahora simplemente vaya al método Oncreate de su actividad y haga clic derecho en su layout_name y toque el botón generar y seleccione la opción de inyección de cuchillo de mantequilla y sus referencias de vistas se crearán automáticamente como se menciona a continuación:
fuente