【问题标题】:How to fix ViewPager to prevent app to getting error and crash?如何修复 ViewPager 以防止应用程序出错和崩溃?
【发布时间】:2019-02-03 20:41:38
【问题描述】:

我正在登录页面,基于 Androidhive 教程,问题是 Viewpager 在 2 个布局下工作正常,但对于 3 个布局应用程序会崩溃
在 androidhive 教程中使用了 2 布局,但我想使用 3,因为我收到短信然后 otp 然后注册,所以问题是第 3 布局,它不会出现和崩溃。

Androidhive 教程链接: Part 1Part 2

代码如下:

XML

    <LinearLayout
        android:id="@+id/layout_phone_registration"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:gravity="center_horizontal"
        android:orientation="vertical">

        <ImageView
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="25dp"
            android:layout_marginTop="100dp"
            android:src="@mipmap/ic_launcher" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="25dp"
            android:gravity="center_horizontal"
            android:inputType="textCapWords"
            android:paddingLeft="40dp"
            android:paddingRight="40dp"
            android:text="@string/msg_enter_mobile"
            android:textColor="@android:color/white"
            android:textSize="14dp" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">


            <EditText
                android:id="@+id/inputMobile"
                android:layout_width="240dp"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                android:fontFamily="sans-serif-light"
                android:hint="@string/lbl_mobile"
                android:inputType="phone"
                android:maxLength="12"
                android:padding="5dp"
                android:textColor="@color/colorPrimary"
                android:textCursorDrawable="@null"
                android:textSize="18dp" />

            <Button
                android:id="@+id/btn_request_sms"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="25dp"
                android:background="@color/colorPrimaryDark"
                android:text="@string/lbl_next"
                android:textColor="@android:color/white"
                android:textSize="14dp" />
        </LinearLayout>


    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout_otp"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@color/colorPrimary"
        android:gravity="center_horizontal"
        android:orientation="vertical">

        <ImageView
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="25dp"
            android:layout_marginTop="100dp"
            android:src="@mipmap/ic_launcher" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="15dp"
            android:gravity="center_horizontal"
            android:paddingLeft="40dp"
            android:paddingRight="40dp"
            android:text="@string/msg_sit_back"
            android:textColor="@android:color/white"
            android:textSize="16dp" />

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="25dp"
            android:gravity="center_horizontal"
            android:paddingLeft="40dp"
            android:paddingRight="40dp"
            android:text="@string/msg_manual_otp"
            android:textColor="@android:color/white"
            android:textSize="12dp" />

        <EditText
            android:id="@+id/inputOtp"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:background="@android:color/white"
            android:fontFamily="sans-serif-light"
            android:gravity="center_horizontal"
            android:hint="@string/lbl_enter_otp"
            android:inputType="number"
            android:maxLength="6"
            android:padding="10dp"
            android:textCursorDrawable="@null"
            android:textSize="18dp" />

        <Button
            android:id="@+id/btn_verify_otp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="25dp"
            android:background="@color/colorPrimaryDark"
            android:paddingLeft="20dp"
            android:paddingRight="20dp"
            android:text="@string/lbl_submit"
            android:textColor="@android:color/white"
            android:textSize="14dp" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout_complete_registration"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:gravity="center_horizontal"
        android:orientation="vertical">


            <EditText
                android:id="@+id/inputName"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="15dp"
                android:background="@android:color/white"
                android:fontFamily="sans-serif-light"
                android:hint="@string/lbl_name"
                android:padding="5dp"
                android:singleLine="true"
                android:textColor="@color/colorPrimary"
                android:textSize="18dp" />

            <EditText
                android:id="@+id/inputAddress"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="15dp"
                android:background="@android:color/white"
                android:fontFamily="sans-serif-light"
                android:hint="@string/lbl_email"
                android:padding="5dp"
                android:textColor="@color/colorPrimary"
                android:textSize="18dp" />


            <Button
                android:id="@+id/btn_register_user"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="25dp"
                android:background="@color/colorPrimaryDark"
                android:text="@string/lbl_next"
                android:textColor="@android:color/white"
                android:textSize="14dp" />


    </LinearLayout>

</ir.atlaspio.atlasdrinkingservice.AdvancedUI.MyViewPager>>


<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_gravity="center"
    android:layout_marginBottom="60dp"
    android:indeterminateTint="@color/colorAccent"
    android:indeterminateTintMode="src_atop"
    android:visibility="gone" />

<LinearLayout
    android:id="@+id/layout_edit_mobile"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="50dp"
    android:gravity="center"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/txt_edit_mobile"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:textSize="16dp" />

    <ImageButton
        android:id="@+id/btn_edit_mobile"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginLeft="10dp"
        android:background="@null"
        android:src="@drawable/ic_exit_to_app_black_24dp" />
</LinearLayout>

Java

private ViewPager viewPager;
private ViewPagerAdapter adapter;
OnCreate =>
viewPager.setCurrentItem(0);


    adapter = new ViewPagerAdapter();
    viewPager.setAdapter(adapter);
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
Public Class Activity =>
class ViewPagerAdapter extends PagerAdapter {

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

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((View) object);
    }

    public Object instantiateItem(View collection, int position) {

        int resId = 0;
        switch (position) {
            case 0:
                resId = R.id.layout_phone_registration;
                break;
            case 1:
                resId = R.id.layout_otp;
                break;
            case 2:
                resId = R.id.layout_complete_registration;
                break;
        }
        return findViewById(resId);
    }
}

Logcat

08-29 10:48:12.426 4499-4499/ir.atlaspio.atlasdrinkingservice
E/InputEventSender:异常调度完成信号。 08-29 10:48:12.426 4499-4499/ir.atlaspio.atlasdrinkingservice E/MessageQueue-JNI:MessageQueue 回调中的异常: 处理接收回调 08-29 10:48:12.436 4499-4499/ir.atlaspio.atlasdrinkingservice E/MessageQueue-JNI: java.lang.UnsupportedOperationException: 必需 方法 destroyItem 未被覆盖 在 android.support.v4.view.PagerAdapter.destroyItem(PagerAdapter.java:201) 在 android.support.v4.view.PagerAdapter.destroyItem(PagerAdapter.java:128) 在 android.support.v4.view.ViewPager.populate(ViewPager.java:1172) 在 android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:663) 在 android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:625) 在 android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:617) 在 android.support.v4.view.ViewPager.pageRight(ViewPager.java:2888) 在 android.support.v4.view.ViewPager.arrowScroll(ViewPager.java:2844) 在 android.support.v4.view.ViewPager.executeKeyEvent(ViewPager.java:2764) 在 android.support.v4.view.ViewPager.dispatchKeyEvent(ViewPager.java:2738) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2035) 在 com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1505) 在 android.app.Activity.dispatchKeyEvent(Activity.java:2418) 在 android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:534) 在 android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:58) 在 android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:316) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1962) 在 android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3876) 在 android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3850) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3423) 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3473) 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3442) 在 android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3549) 在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3450) 在 android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3606) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3423) 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3473) 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3442) 在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3450) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3423) 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3473) 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3442) 在 android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3582) 在 android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3742) 在 android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2010) 在 android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1704) 在 android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1695) 在 android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1987) 在 android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141) 在 android.os.MessageQueue.nativePollOnce(本机方法) 在 android.os.MessageQueue.next(MessageQueue.java:138) 在 android.os.Looper.loop(Looper.java:123) 在 android.app.ActivityThread.main(ActivityThread.java:5019) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.

【问题讨论】:

  • 请提供您尝试执行此操作的 AndroidHive URL。看起来这是问题必需的方法destroyItem没有被覆盖
  • 向我们展示您的第三个布局并与我们分享教程链接
  • @Dr.aNdRO 链接已添加。
  • @MohammadRbabah 第三个布局在上面的 xml 代码中。 id=complete_reg...
  • 试试下面 Rohit 发布的答案。这可能会解决

标签: java android android-viewpager


【解决方案1】:

根据你的错误

java.lang.UnsupportedOperationException:必需的方法 destroyItem 未被覆盖

您需要在您的寻呼机适配器中添加此方法

@Override
void destroyItem (ViewGroup container, int position, Object object){
    ((ViewPager) container).removeView((View) object);
    // more code if needed
}

【讨论】:

  • 好答案 - 但不要忘记 PUBLIC。 "@Override public void destroyItem(ViewGroup container, int position, Object object){..."
【解决方案2】:

在您的 ViewPagerAdapter 类中覆盖 destroyItem 方法并将 obj 删除为 container.removeView(obj as LinearLayout) 其中 LinearLayout 是您的根布局

@Override 
void destroyItem(ViewGroup container, int position, Object obj) {
            container.removeView(obj as LinearLayout)
        }

【讨论】:

  • 感谢朋友的回复。我已经尝试了两个答案并且都有效,但@Rohit 的答案被接受了,因为他回答得更快。
  • 很高兴知道。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多