Search code examples
javaandroidandroid-layoutandroid-viewpagerandroid-custom-view

Android: Custom ViewPager in xml


I'm trying to simply override one method of ViewPager and then use my custom class in XML, but my app is crashing every time I run it.

My Custom Class:

public class MainMenuViewPager extends ViewPager {
    private final String[] TITLES = {"One", "Two","Three", "Four", "Five"};

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

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

    @Override
    public void setCurrentItem(int item) {
        super.setCurrentItem(item);
        actionBar.setTitle(TITLES[item]);
    }
}

In XML:

 <com.example.android.example.TestActivity.MainMenuViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/tabs" />

I'm getting a ClassNotFoundException at runtime.

The only thing worth noting is this Custom ViewPager is nested in another class. Is this a problem?

EDIT: Still working on getting the runtime logcat exception, but when I go to graphical layout in Eclipse and look at error log I see this:

java.lang.NoSuchMethodException: com.whatspoppin.android.whatspoppin.TestActivity$MainMenuViewPager.<init>(android.content.Context, android.util.AttributeSet)
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getConstructor(Unknown Source)
at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.instantiateClass(ProjectCallback.java:347)
at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.loadView(ProjectCallback.java:179)
at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:207)
at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:135)
at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:755)
at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:64)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:727)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:373)

and at runtime:

08-07 16:43:30.028: E/AndroidRuntime(1723): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.android.example.TestActivity.MainMenuViewPager" on path: /data/app/com.example.android.example-2.apk
08-07 16:43:30.028: E/AndroidRuntime(1723): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.android.example.TestActivity.MainMenuViewPager" on path: /data/app/com.example.android.example-2.apk
08-07 16:43:30.028: E/AndroidRuntime(1723): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.android.example.TestActivity.MainMenuViewPager" on path: /data/app/com.example.android.example-2.apk
08-07 16:43:30.028: E/AndroidRuntime(1723):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65)
08-07 16:43:30.028: E/AndroidRuntime(1723):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
08-07 16:43:30.028: E/AndroidRuntime(1723):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
08-07 16:43:30.028: E/AndroidRuntime(1723):     at android.view.LayoutInflater.createView(LayoutInflater.java:552)
08-07 16:43:30.028: E/AndroidRuntime(1723):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)

Solution

  • I just reread your question and the answer just hit me. I somehow missed that your custom ViewPager is an inner class of TestActivity. If you want to reference nested classes in XML you have to do it like this:

    <com.example.android.example.TestActivity$MainMenuViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tabs" />