2013-08-22 1 views
14

Я использую библиотеку PhotoView, однако при использовании ее с viewpager я получаю сообщение об ошибке при масштабировании.ArrayIndexOutOfBoundsException в PhotoView + ViewPager

08-22 17:14:50.096: E/AndroidRuntime(8740): FATAL EXCEPTION: main 
08-22 17:14:50.096: E/AndroidRuntime(8740): java.lang.IllegalArgumentException: pointerIndex out of range 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.MotionEvent.nativeGetAxisValue(Native Method) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.MotionEvent.getX(MotionEvent.java:2148) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:91) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:219) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:1834) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1909) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2182) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1512) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.app.Activity.dispatchTouchEvent(Activity.java:2466) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2130) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.View.dispatchPointerEvent(View.java:7641) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3682) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3613) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4804) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4783) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4875) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:174) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4854) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4894) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.Choreographer.doFrame(Choreographer.java:530) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.os.Handler.handleCallback(Handler.java:725) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.os.Looper.loop(Looper.java:137) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at android.app.ActivityThread.main(ActivityThread.java:5328) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
08-22 17:14:50.096: E/AndroidRuntime(8740):  at dalvik.system.NativeStart.main(Native Method) 
08-22 17:15:18.416: D/dalvikvm(8872): GC_FOR_ALLOC freed 94K, 14% free 17782K/20656K, paused 13ms, total 13ms 

Впрочем, зумирование работает отлично, но когда изображение становится далеко, то возникает ошибка и моя деятельность аварии .. Вот мои коды в viewapager:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     pv = new PhotoView(getActivity()); 
     pv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 
       LayoutParams.MATCH_PARENT)); 
     imageLoader.DisplayImage(mContent, pv); 
     LinearLayout layout = new LinearLayout(getActivity()); 
     layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 
       LayoutParams.MATCH_PARENT)); 
     layout.setGravity(Gravity.CENTER); 
     layout.addView(pv); 

     return layout; 
    } 

Я гугле вопрос, но не мог Не находите правильного решения! любое предложение?? Спасибо, ребята

целые Мои коды:

public class viewpager extends SherlockFragmentActivity { 

AllPhonesDatabase apd; 
Bundle gotBasket; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.simple_circles); 

    apd = new AllPhonesDatabase(this.getApplicationContext()).open(); 
    gotBasket = viewpager.this.getIntent().getExtras(); 
    final String imageurl1 = gotBasket.getString("Imageurl1"); 
    final String imageurl2 = gotBasket.getString("Imageurl2"); 
    final String imageurl3 = gotBasket.getString("Imageurl3"); 

    TestFragmentAdapter mAdapter = new TestFragmentAdapter(
      this.getSupportFragmentManager(), imageurl1, imageurl2, 
      imageurl3); 
    ViewPager mPager = (ViewPager) findViewById(R.id.pager); 
    mPager.setAdapter(mAdapter); 
    CirclePageIndicator mIndicator = (CirclePageIndicator) findViewById(R.id.indicator); 
    mIndicator.setViewPager(mPager); 

} 

} 

class TestFragmentAdapter extends FragmentPagerAdapter { 
    protected static String[] CONTENT; 

    private int mCount; 

    public TestFragmentAdapter(FragmentManager fm, String imageurl1, 
      String imageurl2, String imageurl3) { 
     super(fm); 
     CONTENT = new String[] { imageurl1, imageurl2, imageurl3 }; 
     mCount = CONTENT.length; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return TestFragment.newInstance(CONTENT[position % CONTENT.length]); 
    } 

    @Override 
    public int getCount() { 
     return mCount; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return TestFragmentAdapter.CONTENT[position % CONTENT.length]; 
    } 

    public void setCount(int count) { 
     if (count > 0 && count <= 10) { 
      mCount = count; 
      notifyDataSetChanged(); 
     } 
    } 


public final class TestFragment extends Fragment { 
    private static final String KEY_CONTENT = "TestFragment:Content"; 
    public ImageLoader2 imageLoader; 
    PhotoView pv; 

    public static TestFragment newInstance(String content) { 
     TestFragment fragment = new TestFragment(); 
     StringBuilder builder = new StringBuilder(); 
     for (int i = 0; i < 1; i++) { 
      builder.append(content).append(" "); 
     } 
     builder.deleteCharAt(builder.length() - 1); 
     fragment.mContent = builder.toString(); 
     return fragment; 
    } 

    private String mContent = "???"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     imageLoader = new com.androidarabia.lazylist.ImageLoader2(
       this.getActivity()); 
     if ((savedInstanceState != null) 
       && savedInstanceState.containsKey(KEY_CONTENT)) { 
      mContent = savedInstanceState.getString(KEY_CONTENT); 
     } 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     pv = new PhotoView(getActivity()); 
     pv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 
       LayoutParams.MATCH_PARENT)); 
     imageLoader.DisplayImage(mContent, pv); 
     LinearLayout layout = new LinearLayout(getActivity()); 
     layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 
       LayoutParams.MATCH_PARENT)); 
     layout.setGravity(Gravity.CENTER); 
     layout.addView(pv); 

     return layout; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString(KEY_CONTENT, mContent); 
    } 

ответ

16

Кажется, что ошибка какая-то, где вдоль линий. Я не уверен, что это на стороне PhotoViewer или на стороне андроидов. Я работал вокруг этого вопроса, используя этот код в моем пользовательском виде пейджере:

public class HackyViewPager extends ViewPager { 


public HackyViewPager(Context context) 
{ 
    super(context); 
} 

public HackyViewPager(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
} 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) 
{ 
    try 
    { 
      return super.onInterceptTouchEvent(ev); 
    } 
    catch (IllegalArgumentException e) 
    { 
    } 
    catch (ArrayIndexOutOfBoundsException e) 
    { 

    } 
    return false; 
} 
} 

У меня не было никаких проблем с использованием этого кода и сигналить внутри и сигналить вне, кажется, работает нормально. Создание этого класса в исходном коде, а затем вы можете ссылаться на него в ваших XML-файлах, как это:

<my.default.package.HackyViewPager 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    /> 
+0

Спасибо за ваш ответ! Где я могу добавить этот код в свое приложение? –

+0

Я обновил свои коды. Можете ли вы сказать мне, где я могу добавить его сейчас? –

+0

Везде, где вы объявляете свой ViewPager, вместо этого используйте HackyViewPager –

0

Очевидно, я согласен с Hacky вида пейджера вещи, но я предполагаю, что для безупречной реализации, необходимо использовать photoViewAttacher .update() после каждого изменения ресурса изображения, как и в случае успеха, используются прослушиватели ошибок соответствующей библиотеки загрузки изображений.