Android - PagerAdapter аварийно завершает работу, когда я добавляю ClickListener

Я реализую приложение, которое использует горизонтальное разбиение по страницам (влево или вправо - горизонтальное представление пейджинга). Я загрузил «android.support.v4.view.ViewPager» и нашел способ реализации части смахивания в основном благодаря этому руководству здесь: http://mobile.tutsplus.com/tutorials/android/android-пользовательскийинтерфейс-дизайн-горизонтальный-просмотр-пейджинга/

Моя проблема заключается в том, чтобы просматривать кнопки и устанавливать OnClickListenr в моих просмотрах. Что странно, так это то, что, хотя я могу сделать это в рамках своей основной деятельности, происходит сбой, когда я пытаюсь сделать это из другой активности, которая запущена и выведена на передний план.

Пока код:

public void Settings(){
    setContentView(R.layout.settings);
    SettingsAdapter adapter = new SettingsAdapter();
    ViewPager myPager = (ViewPager) findViewById(R.id.settingspager);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(0);      
    View BackButton = findViewById(R.id.back);
    BackButton.setOnClickListener(this);  
}

В моем основном действии работает нормально, точно такие же строки вылетают в BackButton.setOnClickListener при использовании в другом действии.

Из журнала я получаю:

02-20 09:59:50.756: E/AndroidRuntime(489):  at lil.kayak.tabs.Settings$SettingsAdapter.instantiateItem(Settings.java:88)
02-20 09:59:50.756: E/AndroidRuntime(489):  at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
02-20 09:59:50.756: E/AndroidRuntime(489):  at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:649)
02-20 09:59:50.756: E/AndroidRuntime(489):  at android.support.v4.view.ViewPager.populate(ViewPager.java:783) 
02-20 09:59:50.756: E/AndroidRuntime(489):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)

Мой пейджер-адаптер в обоих случаях:

private class SettingsAdapter 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.settings1;
             break;
        case 1:
            resId = R.layout.settings2;   
            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 boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == ((View) arg1);

    }

    @Override
    public Parcelable saveState() {
        return null;
    }

}

settings.xml это

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<android.support.v4.view.ViewPager
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/settingspager"/>
</LinearLayout>

Так в чем проблема? И что я должен сделать, чтобы заставить его работать? Заранее спасибо!

Изменить: в настоящее время я работал над этим, используя android:onClick="Function" в моем xml, а затем

общественная недействительная функция (представление v) {}

в моем классе

Теперь это работает, но я не думаю, что это оптимально, поэтому любые предложения приветствуются!


person george    schedule 20.02.2012    source источник


Ответы (1)


возможно, коллекция не является допустимым представлением или просто «нулевая». Лучше используйте "getApplicationContext()" или реализуйте конструктор адаптера, который может получить контекст из вашего приложения.

И, чтобы убедиться, что у вас есть все необходимые вещи: проверьте «inflater» на «null», если у вас нет объекта LayoutInflater, все может рухнуть.

Другой причиной может быть ваш код вне этого адаптера, здесь мы этого не видим;)

person Andreas    schedule 20.02.2012
comment
Спасибо за ответ! Я работал над этим, используя android:onClick=Function в моем xml, и это работает. Но я проверю написанное и сообщу! - person george; 20.02.2012
comment
Ну, у меня есть объект инфлятора, и я попробовал теперь inflater.getContext(), который, как говорят, возвращает контекст, в котором мы работаем, для доступа к ресурсам, загрузчику классов и т. д., но он все еще не работает :( - person george; 23.02.2012