Excepción del puntero nulo – findViewById ()

¿Alguien puede ayudarme a averiguar cuál puede ser el problema con este progtwig? 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:

     

diseño activity_first:

    

Diseño de actividad_segundo:

      

Y el diseño activity_third:

     

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 .

Las vistas que intentas obtener no están definidas en tu diseño de activity_main . Necesita inflar por progtwigció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; } 

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.

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 !!!

É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.

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

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

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.

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

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);