Заблокируйте viewpager с помощью fakedrag

Я пытаюсь создать пейджер с редактируемым текстом, но я не хочу, чтобы пейджер прокручивался при редактировании текстового поля. Я пытаюсь отключить прокрутку, используя функции beginFakeDrag и endFakeDrag программы просмотра, которые заставляют программу просмотра игнорировать все события касания. По какой-то причине, если вы вызываете 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)

Вот мой код.

        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);
            }
        });

person Pinglebon    schedule 08.03.2012    source источник
comment
Предыдущая запись StackOverflow об отключении ViewPager: stackoverflow.com/questions/7814017/disable-viewpager.   -  person Brad    schedule 09.03.2012


Ответы (2)


Пожалуйста, ознакомьтесь с моим ответом на другой вопрос об отключении просмотра ViewPager: Как отключить листание по страницам, проводя пальцем в ViewPager, но при этом иметь возможность проводить пальцем программно?

Я бы просто улучшил его, чтобы иметь логическое значение:

private boolean mDisablePaging;

Затем добавьте геттер/сеттер, если вам это нужно для этого логического значения.

Затем улучшите 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);
}

Затем просто установите для mDisablePaging значение true, если вы обнаружите, что пользователь редактирует текстовое поле.

person louielouie    schedule 10.03.2012
comment
Я видел это и использовал его, чтобы заставить мой код работать, но кажется пустой тратой времени создавать совершенно новый класс для чего-то, что выглядит так, как будто он уже встроен. - person Pinglebon; 13.03.2012
comment
В этом менталитете так много неправильного. Это не новый класс, это подкласс. Это не встроено, вы просто злоупотребляете механизмом, который не предназначен для того, чтобы делать то, что вы хотите. В этом красота ОО; вы можете настроить или добавить функциональность к частям кода, которые еще не делают то, что вы хотите. - person tad; 26.06.2012

Я искал решение, которое не включало расширение ViewPager, но это решение создает ту же проблему, что и установка OnTouchListener и возврат true, когда это необходимо для блокировки пролистывания: "Прикосновение все еще происходит, так что вы можете перемещать страницы, делая множество маленьких движений."

См. https://stackoverflow.com/a/13473683/1377145 ИЛИ https://stackoverflow.com/a/13392198/1377145

person Hugo Gresse    schedule 12.01.2015
comment
+1 за поиск решения, которое не включало расширение ViewPager! хотя это невозможно... - person Mia; 18.03.2019