studio programacion herramientas fundamentos con avanzado aplicaciones android nullpointerexception oncreate findviewbyid

android - programacion - Excepción del puntero nulo-findViewById()



manual de android en pdf (10)

A veces necesitas limpiar tu proyecto en Eclipse (Proyecto - Limpiar ...).

¿Alguien puede ayudarme a averiguar cuál puede ser el problema con este programa? En el método onCreate() el findViewById() devuelve null para todos los ID y esto causa una excepción de puntero nulo más tarde. No puedo entender por qué el findViewById() no puede encontrar la vista. ¿Alguna sugerencia?

Este es el código principal:

public class MainActivity extends Activity { ViewPager pager; MyPagerAdapter adapter; LinearLayout layout1, layout2, layout3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); layout1 = (LinearLayout) findViewById(R.id.first_View); layout2 = (LinearLayout) findViewById(R.id.second_View); layout3 = (LinearLayout) findViewById(R.id.third_View); adapter = new MyPagerAdapter(); pager = (ViewPager) findViewById(R.id.main_pager); pager.setAdapter(adapter); } private class MyPagerAdapter extends PagerAdapter { @Override public int getCount() { return 3; } @Override public Object instantiateItem(ViewGroup collection, int position) { LinearLayout l = null; if (position == 0 ) { l = layout1; } if (position == 1) { l = layout2; } if (position == 2) { l = layout3; } collection.addView(l, position); return l; } @Override public boolean isViewFromObject(View view, Object object) { return (view==object); } @Override public void destroyItem(ViewGroup collection, int position, Object view) { collection.removeView((View) view); } } }

Y los archivos XML relacionados:

diseño activity_main:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#a4c639"> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/main_pager"/> </LinearLayout>

diseño activity_first:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/first_View"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <Button android:id="@+id/button1" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout>

Diseño de actividad_segundo:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/second_View"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </LinearLayout>

Y el diseño activity_third:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/third_View"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </LinearLayout>


El método findViewById debe encontrar lo que está en el diseño (que llamó en el setContentView )


En Android, findViewById(R.id.some_id) funciona cuando se encuentra la vista en el conjunto de diseño.

Es decir, si ha configurado un diseño, diga:

setContentView(R.layout.my_layout);

Las vistas se pueden encontrar solo en este diseño (my_layout).

En el layout1 , layout1 , layout2 , todos son tres diseños diferentes y no están configurados para la actividad.


En mi caso, fue un error estúpido de mi parte. setContentView el código en el método OnCreate pero estaba por encima de la línea de código setContentView . Una vez que moví mi código debajo de esta línea, la aplicación comenzó a funcionar bien.

setContentView(R.layout.activity_main);


He recibido este error hoy y fue tan simple de borrar, que me "confundiré".

Solo intente agregar el elemento UI a su archivo xml de diseño en su directorio res / layout-port !!!


Las vistas que intentas obtener no están definidas en tu diseño de activity_main . Necesita inflar por programación las vistas que intenta agregar al buscapersonas.-

@Override public Object instantiateItem(ViewGroup collection, int position) { LinearLayout l = null; if (position == 0) { l = (LinearLayout) View.inflate(this, R.layout.activity_first, null); } if (position == 1) { l = (LinearLayout) View.inflate(this, R.layout.activity_second, null); } if (position == 2) { l = (LinearLayout) View.inflate(this, R.layout.activity_third, null); } collection.addView(l, position); return l; }


Lo que dijo @Warlock arriba es correcto, debes inicializar LinearLayout layout1, layout2, layout3 por el camino correcto:

LinearLayout layout1 = (LinearLayout) View.inflate(this, R.layout.first_View, null); LinearLayout layout2 = (LinearLayout) View.inflate(this, R.layout.second_View, null); LinearLayout layout3 = (LinearLayout) View.inflate(this, R.layout.third, null);

deseo que mi consejo te ayude


agregue esas vistas al adaptador del buscapersonas antes de acceder a ellas.

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); adapter = new MyPagerAdapter(); pager = (ViewPager) findViewById(R.id.main_pager); pager.setAdapter(adapter); layout1 = (LinearLayout) findViewById(R.id.first_View); layout2 = (LinearLayout) findViewById(R.id.second_View); layout3 = (LinearLayout) findViewById(R.id.third_View); }

en el adaptador de buscapersonas:

public Object instantiateItem(View collection, int position) { if(position == 0){ View layout = inflater.inflate(R.layout.activity_first, null); ((ViewPager) collection).addView(layout); return layout; } ... and so forth. }

desde aquí puede acceder a ellos a través de findViewById.


findViewById() devuelve una vista si existe en el diseño que proporcionó en setContentView() , de lo contrario, devuelve nulo y eso es lo que le sucede.

Ejemplo si setContentView(R.layout.activity_first); y luego llame a findViewById(R.id.first_View); devolverá una Vista que es su diseño.

Pero si llama a findViewById(R.id.second_View); devolverá null ya que no hay una vista en su diseño activity_first.xml llamada @+id/second_View .


Énfasis añadido

Para esos casos dentro de una clase de Actividad.

Activity.findViewById(int id)

Encuentra una vista que fue identificada por el atributo id del XML que se procesó en onCreate(Bundle) .

De lo contrario, como un Fragmento, un Adaptador, una View desde un LayoutInflater , etc.

View.findViewById(int id)

Busque una vista secundaria con la id proporcionada. Si esta vista tiene el id. Dado, devuelve esta vista.

Cualquier caso,

Devoluciones
La vista si se encuentra o null contrario .

Ahora, vuelve a verificar tus archivos XML. Asegúrate de poner el valor correcto en setContentView o inflater.inflate .

En el caso de una actividad, llame a findViewById después de setContentView .

Luego, asegúrate de que hay una Vista que estás buscando con android:id="@+id/..." en ese diseño. Asegúrate de que + está en @+id , lo que agregará el recurso a los valores R.id para asegurarte de que puedas encontrarlo desde Java.