10 Stimmen

Android ViewPager findViewById funktioniert nicht - gibt immer null zurück

public class HSPTabletTestActivity extends Activity {
private class MyPagerAdapter extends PagerAdapter {

    public int getCount() {
        return 2;
    }

    public Object instantiateItem(View collection, int position) {

        LayoutInflater inflater = (LayoutInflater) collection.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        int resId = 0;
        switch (position) {
        case 0:
            resId = R.layout.lighttab;
            break;
        case 1:
            resId = R.layout.securitytab;
            break;
        }

        View view = inflater.inflate(resId, null);

        ((ViewPager) collection).addView(view, 0);
        return view;
    }

    @Override
    public void destroyItem(View arg0, int arg1, Object arg2) {
        ((ViewPager) arg0).removeView((View) arg2);

    }

    @Override
    public void finishUpdate(View arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == ((View) arg1);

    }

    @Override
    public void restoreState(Parcelable arg0, ClassLoader arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public Parcelable saveState() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void startUpdate(View arg0) {
        // TODO Auto-generated method stub

    }

}

Ich habe den obigen Code ^^ ... Ziemlich direkt von http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/ übernommen ... Ich bin immer noch ziemlich neu in der Welt der Android-Entwicklung :/

Jetzt versuche ich, auf ein Dropdown-Menü-Steuerung und einige Schaltflächen innerhalb der "Seiten" zuzugreifen. Aber findViewById gibt immer null zurück!

Ich erinnere mich daran, dass das Layout im Code nicht wirklich existiert und zunächst aufgeblasen werden muss, was im instantiateItem() -Funktion passiert. Und es ist ziemlich offensichtlich, dass es in der "view" -Variablen ist. Aber wenn ich aufrufe view.findViewById(R.id.light1_off);

was übrigens eine Schaltfläche ist, gibt es immer NULL zurück! Ich habe sogar sichergestellt, dass es nur aufgerufen wurde, wenn tatsächlich diese Seite geladen wurde. Aber egal was ich getan habe, es gibt immer null zurück und ich erhalte eine böse Nullpointer-Ausnahme.

Kann mir jemand bitte helfen? Mir gehen langsam die Ideen aus, und Google ist keine Hilfe, ich bin bereits auf Seite 5 zu etwa 10 verschiedenen Suchbegriffen gegangen.

22voto

dennisdrew Punkte 4369

Nach viel Frustration und Haare raufen über dieses Problem habe ich es gelöst! Zumindest für mich. Wenn du wie ich das Tutsplus-Tutorial verwendet hast, hast du separate XML-Dateien für deine Bildschirme. Jetzt gehe ich davon aus, dass diese Layout-XMLs Layouts darin enthalten (z. B. LinearLayout, RelativeLayout, usw.). Diese Layouts enthalten dann deinen Button und andere Widgets. Was du tun musst, um findViewById zu verwenden, ist im tatsächlichen switch-Statement in der Methode instatiateItem deinen Button wie folgt zu initialisieren:

public Object instantiateItem(View collection, int position) {

    LayoutInflater inflater = (LayoutInflater) collection.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    int resId = 0;
    switch (position) {
    case 0:
        resId = R.layout.lighttab;
        View view = inflater.inflate(resId, null);
        RelativeLayout layout=(RelativeLayout)view.findViewById(R.id.relLayout);
        Button button=(Button)layout.findViewById(R.id.button);
        ((ViewPager) collection).addView(view, 0);
        return view;
    case 1:
        resId = R.layout.securitytab;
        ...
        ...
        return view;
    }
}

Also... zunächst musst du die Ansicht aufblasen, dann initialisierst du das Layout innerhalb der Ansicht, indem du den Layouttyp (RelativeLayout) umwandelst und .findViewById(Ressourcen-ID) aufrufst. Dann initialisierst du das eigentliche Widget, nach dem du suchst, indem du dasselbe machst, aber den Widgettyp (Button) umwandelst und .findViewById(Ressourcen-ID) aufrufst.

Dies hat bei mir funktioniert, also hoffe ich, dass dir das etwas Ärger erspart! Hat ewig gedauert, bis ich das herausgefunden habe.

0voto

Warpzit Punkte 27628

Nur raten, da Sie XML nicht für aufgeblasen anzeigen. Verwenden Sie +@id. Wenn nicht, versuchen Sie es.

0voto

Moesio Punkte 2970

Sie können all diese schmutzige Arbeit vermeiden, indem Sie einfach setContentView(R.layout.yourlayout) vor findViewById hinzufügen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X