【问题标题】:Cannot cast to custom ViewPager class无法转换为自定义 ViewPager 类
【发布时间】:2018-02-22 15:52:17
【问题描述】:

我正在使用来自 Chrisbanes Github 的源代码:https://github.com/chrisbanes/PhotoView 并尝试使用 LinearLayout 制作 ViewPager,但在将 ViewPager 转换为 HackyViewPager 时出现错误 这是我的 xml (bacaan.xml):

<?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>

在 ViewPagerActivity.java 上,我改变了这个:

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

到这里:

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

我确实发现必须使用包名称声明自定义视图,就像我发现的这个问题一样:Creating custom button class in Android

所以我将 xml ViewPager 更改为我的包名称,但仍然无法正常工作。有什么线索吗?

编辑: 这是日志

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

这里是 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;
        }
    }

}

【问题讨论】:

    标签: android android-viewpager custom-view


    【解决方案1】:
     <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="7" />
    

    如果您想投射到您的 cusmo ViewPager,您应该将 xml 更改为

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

    你错过了声明下面的构造函数

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

    【讨论】:

    • 是的,我试过了,但还是不行。感谢您的光临
    • 但是你可以得到同样的例外。你得到了什么异常?
    • 你能发布 HackyViewPager 吗?你声明了 public HackyViewPager(Context context, AttrSet att) 构造函数了吗?
    • 你错过了 XML inflater 系统所需的构造函数
    • 谢谢黑带,你帮了大忙。它为我省去了麻烦。 :D
    【解决方案2】:

    由于您使用的是自定义 ViewPager 而不是支持库中的那个,因此您需要更改您的 xml

    改变

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

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

    当然要使用正确的 ViewPager 的路径。

    【讨论】:

    • 是的,我试过了。错误指向那一行 xml。
    • @victoriopui 您的导入是否正确?我认为您需要在活动中导入自定义 ViewPager
    • 我认为,这是正确的。我在 Eclipse 上使用 ctrl+shift+o 并且自定义视图在同一个包上。不管我错了,我尝试手动添加它,但仍然没有用。
    【解决方案3】:

    你必须在你的类中调用超级构造函数。您是否尝试过在自定义 ViewPager 类中使用这两个构造函数?喜欢,

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

    【讨论】:

      【解决方案4】:

      也许,现在回答这个问题为时已晚,我也遇到了同样的问题。Can't cast 或 can't inflate 的错误是因为我将 viewpager 扩展为显示这个的活动的内部类viewpager,所以我所做的是,我为那个 customViewPager 创建了一个单独的类,然后问题就解决了。

      【讨论】:

        猜你喜欢
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多