简体   繁体   English

如何在Pager Adaper中调用OnClickListener

[英]How to call OnClickListener in a Pager Adaper

I've been working on this for a week now and I just can't figure it out. 我已经为此工作了一个星期,但我无法弄清楚。 I have a Pager Adapter with 4 views. 我有4个视图的寻呼机适配器。 It lets me swipe between them. 它让我在它们之间滑动。 But when I call onClickListener the app crashes on boot because the Listener is null. 但是当我调用onClickListener时,应用程序在启动时崩溃,因为Listener为null。 I'm a new programmer and I don't understand how I can fix this problem. 我是一名新程序员,我不知道如何解决此问题。 Please help! 请帮忙! I've isolated the source of the problem, the view is not created or being destroyed after the Listener looks for the button ID and that's why it's null and crashing. 我已经隔离了问题的根源,在侦听器查找按钮ID之后,视图没有创建或被破坏,这就是为什么它为null并崩溃的原因。

The method destroyItem is what I think is causing it, because when I remove it the app doesn't crash until I start swiping threw views. 我认为是方法destroyItem引起的,因为当我删除它时,应用程序直到崩溃后才开始崩溃。

public class SplashPager extends PagerAdapter {

Button b;

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 4;
}

@Override
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.splash2;
        b = (Button) collection.findViewById(R.id.splashB);
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                                    //setContentView(r.layout.someLayout);
            }
        });
        break;
    case 1:
        resId = R.layout.splash3;
        break;
    case 2:
        resId = R.layout.splash4;
        break;
    case 3:
        resId = R.layout.splash5;
        break;

    }

    View view = inflater.inflate(resId, null);
    ((ViewPager) collection).addView(view, 0);
    return view;

}

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
    // TODO Auto-generated method stub
    ((ViewPager) arg0).removeView((View) arg2);

}

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

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
    // TODO Auto-generated method stub
    return arg0 == ((View) arg1);
}

}

Logs: 日志:

01-17 21:03:35.179: W/dalvikvm(16226): threadid=1: thread exiting with uncaught exception (group=0x401a2560)
01-17 21:03:35.179: E/AndroidRuntime(16226): FATAL EXCEPTION: main
01-17 21:03:35.179: E/AndroidRuntime(16226): java.lang.NullPointerException
01-17 21:03:35.179: E/AndroidRuntime(16226):    at   com.example.survtest2.SplashPager.instantiateItem(SplashPager.java:33)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:801)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.support.v4.view.ViewPager.populate(ViewPager.java:930)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.support.v4.view.ViewPager.populate(ViewPager.java:881)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1366)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.view.View.measure(View.java:8424)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at  android.view.View.measure(View.java:8424)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at  android.view.View.measure(View.java:8424)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.view.View.measure(View.java:8424)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.view.ViewRoot.performTraversals(ViewRoot.java:844)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1864)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.os.Looper.loop(Looper.java:130)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at android.app.ActivityThread.main(ActivityThread.java:3733)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at java.lang.reflect.Method.invokeNative(Native Method)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at java.lang.reflect.Method.invoke(Method.java:507)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:892)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:650)
01-17 21:03:35.179: E/AndroidRuntime(16226):    at dalvik.system.NativeStart.main(Native Method)
01-17 21:03:35.199: E/AndroidRuntime(16226): [Blue Error Handler] Make Debugging Report file for main
01-17 21:03:35.199: E/AndroidRuntime(16226): java.lang.NullPointerException
01-17 21:03:35.199: E/AndroidRuntime(16226):    at com.example.survtest2.SplashPager.instantiateItem(SplashPager.java:33)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:801)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.support.v4.view.ViewPager.populate(ViewPager.java:930)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.support.v4.view.ViewPager.populate(ViewPager.java:881)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1366)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.view.View.measure(View.java:8424)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at  android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at  android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.view.View.measure(View.java:8424)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.view.View.measure(View.java:8424)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.view.View.measure(View.java:8424)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.view.ViewRoot.performTraversals(ViewRoot.java:844)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1864)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.os.Looper.loop(Looper.java:130)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at android.app.ActivityThread.main(ActivityThread.java:3733)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at java.lang.reflect.Method.invokeNative(Native Method)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at    java.lang.reflect.Method.invoke(Method.java:507)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:892)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:650)
01-17 21:03:35.199: E/AndroidRuntime(16226):    at     dalvik.system.NativeStart.main(Native Method)

I'm pretty sure this is the cause of the problem but I don't know how this method works or how to fix it: 我很确定这是问题的原因,但我不知道此方法的工作原理或解决方法:

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
    // TODO Auto-generated method stub
    ((ViewPager) arg0).removeView((View) arg2);

}

Another question I have is how can I use that button to load a new view or activity? 我的另一个问题是如何使用该按钮加载新的视图或活动? It wont allow me to implement activity and that's the only way I learned how to call in bundles. 它不会允许我实现活动,而这是我学会了如何调用捆绑软件的唯一方法。 Thanks in advance! 提前致谢!

Try changing destroyItem to this: 尝试将destroyItem更改为此:

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

and isViewFromObject to: 和isViewFromObject可以:

@Override
public boolean isViewFromObject(View view, Object object){

    return view.equals(object); 
 }

If these changes dont work then I suggest u check what happens after u can "findViewById" on the collection View. 如果这些更改不起作用,那么我建议您检查可以在集合视图上“ findViewById”之后发生的情况。 It looks like the button u are looking is not within that object. 看起来您正在查看的按钮不在该对象内。 You have to search for it in the view you are inflating. 您必须在要放大的视图中搜索它。

Try this code for your instantiation code: 尝试使用以下代码作为实例化代码:

@Override
    public Object instantiateItem(View collection, int position) {
        LayoutInflater inflater = (LayoutInflater) collection.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        int resId = 0;
        View view = null;
        switch (position) {

        case 0:
            view = inflater.inflate(R.layout.splash2, null);
            b = (Button) view.findViewById(R.id.splashB);
            b.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                                        //setContentView(r.layout.someLayout);
                }
            });
            break;
        case 1:
            view = inflater.inflate(R.layout.splash3, null);
            break;
        case 2:
            view = inflater.inflate(R.layout.splash4, null);
            break;
        case 3:
            view = inflater.inflate(R.layout.splash5, null);
            break;

        }


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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM