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>
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
.
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;
}
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 !!!
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.
Parfois vous avez besoin de nettoyer votre projet dans Eclipse (Project - Clean ..).
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);
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
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.
La méthode findViewById
doit rechercher le contenu de la présentation (que vous avez appelée dans la setContentView
)