通过使用fakedrag锁定viewpager

Pin*_*bon 1 android android-viewpager

我正在尝试使Viewpager具有可编辑的文本,但是我不希望Viewpager在编辑文本框时滚动。我试图通过使用viewpager的beginFakeDrag和endFakeDrag函数禁用滚动,这会导致viewpager忽略所有触摸事件。出于某种原因,如果先调用beginFakeDrag之后再调用endFakeDrap,它将运行良好,但是当分离时,它将引发以下错误:

03-08 17:54:00.511: E/AndroidRuntime(31362): FATAL EXCEPTION: main
03-08 17:54:00.511: E/AndroidRuntime(31362): java.lang.NullPointerException
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.support.v4.view.ViewPager.endFakeDrag(ViewPager.java:1683)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at gtg.gis.RequestActivity$2.onFocusChange(RequestActivity.java:115)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.view.View.onFocusChanged(View.java:2742)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.widget.TextView.onFocusChanged(TextView.java:7080)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.view.View.clearFocus(View.java:2639)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.view.ViewGroup.clearFocus(ViewGroup.java:522)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.view.View.setFlags(View.java:4645)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.view.View.setVisibility(View.java:3116)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at gtg.gis.RequestActivity$1.onClick(RequestActivity.java:95)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.view.View.performClick(View.java:2485)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.view.View$PerformClick.run(View.java:9089)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.os.Handler.handleCallback(Handler.java:587)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.os.Looper.loop(Looper.java:130)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at android.app.ActivityThread.main(ActivityThread.java:3806)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at java.lang.reflect.Method.invokeNative(Native Method)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at java.lang.reflect.Method.invoke(Method.java:507)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-08 17:54:00.511: E/AndroidRuntime(31362):    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

这是我的代码。

        commentBox.setOnFocusChangeListener(new EditText.OnFocusChangeListener()
        {

            public void onFocusChange(View v, boolean hasFocus)
            {
                if (hasFocus)
                {
                    InputMethodManager mgr = (InputMethodManager) getContext().getSystemService(
                            Context.INPUT_METHOD_SERVICE);
                    mgr.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
                    _viewPager.beginFakeDrag();
                    return;
                }

                _viewPager.endFakeDrag();
                InputMethodManager mgr = (InputMethodManager) getContext().getSystemService(
                        Context.INPUT_METHOD_SERVICE);
                mgr.hideSoftInputFromWindow(v.getWindowToken(), 0);
            }
        });
Run Code Online (Sandbox Code Playgroud)

lou*_*uie 5

请查看我有关禁用ViewPager刷卡的另一个问题的答案:如何通过在ViewPager中用手指刷卡来禁用分页但仍然能够以编程方式刷卡?

我只是将其增强为一个布尔值:

private boolean mDisablePaging;
Run Code Online (Sandbox Code Playgroud)

然后,如果需要该布尔值,则添加一个getter / setter。

然后增强onInterceptTouchEvent:

@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
    // Don't allow swiping to switch between pages if we disabled it
    if (mDisablePaging) {
       return false;
    }

    // Otherwise, do the normal behavior 
    return super.onInterceptTouchEvent(arg0);
}
Run Code Online (Sandbox Code Playgroud)

然后,当您检测到用户正在编辑文本框时,只需将mDisablePaging设置为true即可。

  • 这种想法有很多错误。这不是一个“全新的类”,而是一个子类。它不是内置的,您只是在滥用一种机制,该机制无意于执行您想要的操作。这就是OO的美;您可以对尚未完成所需功能的代码段进行调整或添加功能。 (3认同)