web-dev-qa-db-fra.com

Exception de pointeur NULL - findViewById ()

Quelqu'un peut-il m'aider à savoir quel est le problème avec ce programme… .. Dans la méthode onCreate(), la fonction findViewById() renvoie la valeur null pour tous les identifiants, ce qui entraîne ultérieurement une exception de pointeur null. Je ne peux pas comprendre pourquoi le findViewById() ne trouve pas la vue. Aucune suggestion?

C'est le code 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);
         }
    }
}

Et les fichiers XML associés:

activity_main layout: 

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

activity_first layout:

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

activity_second layout:

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

Et la mise en page 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>
44
user2629828

findViewById() renvoie une vue si elle existe dans la présentation que vous avez fournie dans setContentView(), sinon elle renvoie null et c'est ce qui vous arrive.

Exemple si vous setContentView(R.layout.activity_first); et que vous appelez ensuite findViewById(R.id.first_View);, vous obtiendrez une vue qui correspond à votre mise en page.

Mais si vous appelez findViewById(R.id.second_View);, il retournera null car il n'y a pas de vue dans votre structure activity_first.xml appelée @+id/second_View

76

Les vues que vous essayez d'obtenir ne sont pas définies dans votre mise en page activity_main. Vous devez gonfler par programme les vues que vous essayez d'ajouter au pageur.

@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;
}
2
ssantos

J'ai eu cette erreur aujourd'hui et c'était si simple à effacer, que j'ai "facepalmed".

Essayez simplement d’ajouter l’élément UI à votre fichier layout xml dans votre répertoire res/layout-port !!!

1
some_nick

ajoutez ces vues à l'adaptateur de pagineur avant d'y accéder. 

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

}

dans l'adaptateur de pager: 

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.

}

à partir de là, vous pouvez y accéder via findViewById. 

1
nebulae

Parfois vous avez besoin de nettoyer votre projet dans Eclipse (Project - Clean ..).

1
Vlad

Dans mon cas, c'était une erreur stupide de ma part. J'avais écrit du code dans la méthode OnCreate mais c'était dessus la ligne de code setContentView. Une fois que j'ai déplacé mon code sous cette ligne, l'application a bien fonctionné.

setContentView(R.layout.activity_main);
1
Will Buffington

Ce que @Warlock a dit ci-dessus est exact, vous devez initialiser LinearLayout layout1, layout2, layout3 de la bonne manière:

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

souhaite que mon conseil vous aide

0
ArronXY

Dans Android, findViewById(R.id.some_id) fonctionne lorsque vous trouvez une vue dans le jeu de dispositions.

Autrement dit, si vous avez défini une disposition, dites: 

setContentView(R.layout.my_layout);

Les vues ne peuvent être trouvées que dans cette présentation (my_layout).

Dans votre code layout1, layout2, layout3, il y a trois présentations différentes et l'activité n'est pas définie.

0
Charan

La méthode findViewById doit rechercher le contenu de la présentation (que vous avez appelée dans la setContentView)

0
Chinevu Amadi