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ó enonCreate(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 onull
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.