Android - PagerAdapter падает, когда я добавляю ClickListener - PullRequest
0 голосов
/ 20 февраля 2012

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

Моя проблема состоит в том, чтобы просмотреть кнопки и установить 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, а затем

public void Function (View v) {}

в моем классе

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

1 Ответ

1 голос
/ 20 февраля 2012

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

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

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

...