2013-06-14 11 views
12

Używam tego źródła z Chrisbanes Github: https://github.com/chrisbanes/PhotoView i próbował podejmowania ViewPager z LinearLayout ale robi błąd podczas odlewania ViewPager do HackyViewPager Oto mój xml (bacaan.xml):Nie można rzutować niestandardowej klasy ViewPager

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:gravity="center_vertical" > 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="7" /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1" 
     android:orientation="horizontal" > 
     ... 
    </LinearLayout> 
</LinearLayout> 

na ViewPagerActivity.java, zmieniłem to:

mViewPager = new HackyViewPager(this); 
setContentView(mViewPager); 
mViewPager.setAdapter(new SamplePagerAdapter()); 

do tego:

setContentView(R.layout.bacaan); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
ViewPager mViewPager = (HackyViewPager) findViewById(R.id.pager); 
mViewPager.setAdapter(new AdapterGambarPager()); 

znalazłem że zwyczaj Zobacz musi być zadeklarowana z nazwą pakietu, jak ten problem jaki znalazłem: Creating custom button class in Android

więc zmieniłem ViewPager xml do mojej nazwy pakietu, ale nadal nie działa. Jakaś wskazówka?

edit: Oto dziennik

06-14 21:01:05.901: E/AndroidRuntime(28345): FATAL EXCEPTION: main 
06-14 21:01:05.901: E/AndroidRuntime(28345): java.lang.RuntimeException: Unable to start activity ComponentInfo{uk.co.senab.photoview.sample/uk.co.senab.photoview.sample.ViewPagerActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class uk.co.senab.photoview.sample.HackyViewPager 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.app.ActivityThread.access$600(ActivityThread.java:127) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.os.Looper.loop(Looper.java:137) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.app.ActivityThread.main(ActivityThread.java:4448) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at java.lang.reflect.Method.invokeNative(Native Method) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at java.lang.reflect.Method.invoke(Method.java:511) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at dalvik.system.NativeStart.main(Native Method) 
06-14 21:01:05.901: E/AndroidRuntime(28345): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class uk.co.senab.photoview.sample.HackyViewPager 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.view.LayoutInflater.createView(LayoutInflater.java:589) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:255) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.app.Activity.setContentView(Activity.java:1835) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at uk.co.senab.photoview.sample.ViewPagerActivity.onCreate(ViewPagerActivity.java:34) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.app.Activity.performCreate(Activity.java:4465) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931) 
06-14 21:01:05.901: E/AndroidRuntime(28345): ... 11 more 
06-14 21:01:05.901: E/AndroidRuntime(28345): Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet] 
06-14 21:01:05.901: E/AndroidRuntime(28345): at java.lang.Class.getConstructorOrMethod(Class.java:460) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at java.lang.Class.getConstructor(Class.java:431) 
06-14 21:01:05.901: E/AndroidRuntime(28345): at android.view.LayoutInflater.createView(LayoutInflater.java:561) 
06-14 21:01:05.901: E/AndroidRuntime(28345): ... 22 more 

Tutaj jest HackyViewPager.java:

package uk.co.senab.photoview.sample; 

import android.content.Context; 
import android.support.v4.view.ViewPager; 
import android.view.MotionEvent; 

/** 
* Hacky fix for Issue #4 and 
* http://code.google.com/p/android/issues/detail?id=18990 
* 
* ScaleGestureDetector seems to mess up the touch events, which means that 
* ViewGroups which make use of onInterceptTouchEvent throw a lot of 
* IllegalArgumentException: pointerIndex out of range. 
* 
* There's not much I can do in my code for now, but we can mask the result by 
* just catching the problem and ignoring it. 
* 
* @author Chris Banes 
*/ 
public class HackyViewPager extends ViewPager { 

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

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     try { 
      return super.onInterceptTouchEvent(ev); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 

} 

Odpowiedz

22
<android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="7" /> 

jeśli chcesz rzucić do cusmo ViewPager należy zmienić xml do

<com.yourpackage.HackyViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="7" /> 

Przegapiłeś zadeklarować następujący konstruktor

public HackyViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 
+0

Tak, próbowałem, ale nadal nie działa. Dziękujemy za odwiedzenie –

+0

, ale możesz uzyskać ten sam wyjątek. Co masz na wyjątek? – Blackbelt

+0

Dodałem LogCat błędu, proszę spojrzeć na –

4

Ponieważ używasz niestandardowego ViewPager a nie jeden w bibliotece wsparcia trzeba zmienić swoją xml

Zmienić

<android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="7" /> 

do

<com.package.HackyViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="7" /> 

oczywiście użyj ścieżki do odpowiedniej ViewPagera.

+0

tak, próbowałem tego.Błąd wskazuje na tę linię xml. –

+0

@victoriopui ma poprawny import? Myślę, że musisz zaimportować swój niestandardowy ViewPager w swojej działalności. –

+0

Myślę, że to prawda. Używam ctrl + shift + o na eclipse, a niestandardowy widok jest na tym samym pakiecie. Czy się mylę, próbuję dodać go ręcznie, ale nadal nie ma sensu. –

1

Musisz zadzwonić do super konstruktora w swojej klasie. Czy próbowałeś z obu konstruktorów w niestandardowej klasy ViewPager? jak,

public HackyViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

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

Może to zbyt późno, aby odpowiedzieć na to pytanie, mam przeszedł samego problemu .To błędu nie może przesyłać lub nie można nadmuchać było bo rozszerzenie viewpager jako wewnętrzna klasy działania, które pokazuje ten viewpager, więc to, co zrobiłem, było to, że stworzyłem oddzielną klasę dla tego customViewPager, a następnie problem został rozwiązany.

Powiązane problemy