Android ViewPager findViewById не работает - всегда возвращает ноль - PullRequest
9 голосов
/ 01 ноября 2011
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

    }

}

У меня там есть этот код ^^ ... В значительной степени взято непосредственно из http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/ ... Я все еще довольно нов в мире разработки для Android: /

Теперь я пытаюсь получить доступ к элементу управления счетчиком и некоторым кнопкам внутри «страниц».Но findViewById продолжает возвращать нуль!

Я помню, что что-то в макете не существует на самом деле внутри кода, и его нужно сначала накачать, что происходит в функции instantiateItem ().И совершенно очевидно, что это входит в переменную view.Но когда я вызываю view.findViewById (R.id.light1_off);

, который, кстати, является кнопкой, он всегда возвращает ZERO!Я даже убедился, что он вызывается только тогда, когда на самом деле загружается эта страница.Но что бы я ни делал, он всегда возвращает ноль, и я получаю неприятное исключение нуль-указателя.

Может ли кто-нибудь помочь мне здесь?У меня почти нет идей, и Google не помогает, уже побывал на странице 5 примерно по 10 различным условиям поиска.

Ответы [ 3 ]

22 голосов
/ 12 ноября 2011

После большого разочарования и перетягивания волос над этой проблемой, я решил ее!По крайней мере для меня.Предполагая, что вы использовали учебник tutsplus, как я, у вас есть отдельные файлы XML для ваших экранов.Теперь я предполагаю, что эти макеты XML содержат в себе макеты (т. Е. LinearLayout, RelativeLayout и т. Д.).Теперь эти макеты содержат вашу кнопку и другие виджеты.Чтобы найти findViewById, вам необходимо в фактической инструкции switch в методе instatiateItem инициализировать вашу кнопку следующим образом:

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

Итак ... сначала вы должны надуть представление,затем инициализируйте макет, содержащийся в представлении, приведя тип макета (RelativeLayout) и вызвав .findViewById (идентификатор ресурса).Затем вы инициализируете фактический искомый виджет, выполнив то же самое, но приведя тип виджета (Button) и вызвав .findViewById (идентификатор ресурса).

Это сработало для меня, поэтому я надеюсь, что это сохраниту вас проблемы!Мне понадобилось время, чтобы понять.

0 голосов
/ 13 марта 2013

Вы можете избежать всей этой грязной работы, просто добавив setContentView (R.layout.youlayout) перед findViewById

0 голосов
/ 01 ноября 2011

Просто угадайте, поскольку вы не показываете xml для завышенных. Используете ли вы + @ id. Если нет, попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...