2015-08-19 19 views
5

Tôi gặp sự cố khủng khiếp và không thể sửa lỗi này trong ba giờ qua. Vì vậy, tôi cần giúp đỡ. Im tạo PlayerUI giống như trong Play Âm nhạc. Hoạt động có một ViewPager và chuẩn bị danh sách các mảnh dựa trên các bản nhạc trong PlayLists và cho phép người dùng chuyển từ bản nhạc này sang bản nhạc khác bằng cách vuốt hoặc các nút Tiếp theo và Trước đó trên Giao diện người dùng mảnh.SetCurrentItem trên ViewPager đang gây ra ngoại lệ

Chức năng vuốt đều hoạt động tốt. Và trong các nút trước và tiếp theo, tôi gọi setCurrentItem trên viewPager và tăng hoặc giảm số đếm dựa trên giá trị từ getCurrentItem từ viewPager. Vấn đề là các công trình tiếp theo tốt tuy nhiên ném một ngoại lệ khi tôi nhấn tiếp theo trên mục trước khi mục cuối cùng. Và tương tự với nút trước đó. Nó hoạt động tuyệt vời tuy nhiên nó ném một ngoại lệ khi tôi nhấp vào trước đó trên mảnh thứ hai.

Đây là log lỗi của tôi ::

java.lang.NullPointerException: Attempt to read from field 'int android.view.View.mViewFlags' on a null object reference 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3366) 
     at android.view.View.updateDisplayListIfDirty(View.java:14127) 
     at android.view.View.getDisplayList(View.java:14189) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368) 
     at android.view.View.updateDisplayListIfDirty(View.java:14127) 
     at android.view.View.getDisplayList(View.java:14189) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368) 
     at android.view.View.updateDisplayListIfDirty(View.java:14127) 
     at android.view.View.getDisplayList(View.java:14189) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368) 
     at android.view.View.updateDisplayListIfDirty(View.java:14127) 
     at android.view.View.getDisplayList(View.java:14189) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368) 
     at android.view.View.updateDisplayListIfDirty(View.java:14127) 
     at android.view.View.getDisplayList(View.java:14189) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368) 
     at android.view.View.updateDisplayListIfDirty(View.java:14127) 
     at android.view.View.getDisplayList(View.java:14189) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3389) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3368) 
     at android.view.View.updateDisplayListIfDirty(View.java:14127) 
     at android.view.View.getDisplayList(View.java:14189) 
     at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273) 
     at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279) 
     at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318) 
     at android.view.ViewRootImpl.draw(ViewRootImpl.java:2530) 
     at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2352) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1982) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
     at android.view.Choreographer.doFrame(Choreographer.java:550) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Đây là mã cho hoạt động của tôi, mảnh vỡ là danh sách các mảnh vỡ mà tôi đặt nó trên quan điểm pager

ViewPagerAdapter adapter = new  ViewPagerAdapter(getSupportFragmentManager(),fragments); 
adapter.setTrackList(trackList); 
viewPager.setAdapter(adapter); 
viewPager.setOffscreenPageLimit(0); 
viewPager.setCurrentItem(currentTrack.getPosition()); 

Khi người dùng nhấp chuột vào các nút Tiếp theo và Trước đó (nằm trong các đoạn) Tôi chỉ cần thực hiện một trong những điều sau đây

((PlayerActivity)getActivity()).viewPager.setCurrentItem(((PlayerActivity)getActivity()).viewPager.getCurrentItem()+1); 

((PlayerActivity)getActivity()).viewPager.setCurrentItem(((PlayerActivity)getActivity()).viewPager.getCurrentItem()-1); 

Điều gì có thể là vấn đề?

+0

Không sử dụng viewPager.getCurrentItem() tại đoạn. Nó chỉ hoạt động ở FragmentActivity, – eurosecom

+0

@eurosecom không chính xác, nó hoạt động ở phân mảnh. – EyadMhanna

+0

@ user983327 bạn có chắc chắn không nằm ngoài giới hạn số lượng phân đoạn trong chế độ xem không? – EyadMhanna

Trả lời

1
Runnable dirtyHack = new Runnable() { 
     @Override 
     public void run() { 
      pager.setCurrentItem(2, 0); 
     } 
    }; 
    Handler handler = new Handler(); 
    handler.postDelayed(dirtyHack, 100); 

...

Có lẽ bố trí chưa được thổi phồng, vì vậy tôi phải chờ đợi hoặc nhận NPE. Vui lòng tham khảo các liên kết sau đây

https://code.google.com/p/android/issues/detail?id=75309

Android ViewPager setCurrentItem not working after onResume

setCurrentItem after setting adapter on GridViewPager return NPE

+0

hoạt động như một sự quyến rũ! – Dantalian

0

bạn đang nhận được lỗi này vì bạn đang đi ngoài giới hạn của số mảnh vỡ trong ViewPager, khi bạn đang ở trong mục cuối cùng và bạn nhấn nút tiếp theo, bạn nên đặt currentItem (0)

+0

Điều này sẽ không hoạt động. Nói rằng tôi có 4 mảnh. Im ở cái thứ 3. Bây giờ tôi cần phải đi đến thứ tư. Tôi gọi setCurrentItem và đặt vị trí thứ tư. mà theo cách tôi sử dụng như thế này setCurrentItem (getCurrentItem() +1). Vì vậy, vị trí là chính xác. Lỗi xảy ra khi tôi đi từ thứ 3 đến thứ 4. Vì vậy, nó là điều đúng để làm như vậy tại sao lỗi là đến là câu hỏi. Vui lòng xem câu trả lời của tôi bên dưới về việc trì hoãn cuộc gọi tới setCurrentItem bằng 100 mili giây hoạt động cho tôi. – user983327

+0

là số mảnh trong ViewPager của bạn tĩnh hoặc động? – EyadMhanna

+0

thay đổi động .. dựa trên lựa chọn người dùng trong hoạt động trước đó. – user983327

Các vấn đề liên quan