Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EditText focus issue #17

Closed
KitsuneFolk opened this issue May 24, 2023 · 14 comments
Closed

EditText focus issue #17

KitsuneFolk opened this issue May 24, 2023 · 14 comments
Assignees
Labels
bug Something that needs to be fixed

Comments

@KitsuneFolk
Copy link
Contributor

Library Version:
2.7

Affected Device(s):
Redmi 9C with API 29

Describe the bug
Edittext loses it's cursor when clicking on it the first time a swipeable fragment is launched

To Reproduce
Steps to reproduce the behavior:

  1. Open the Fragula app
  2. Add an edittext to a swipeable fragment
    I added a video file, so you can reproduce the bug
348821683_9255680534504036_8649609907602659019_n.mp4
@KitsuneFolk KitsuneFolk added the bug Something that needs to be fixed label May 24, 2023
@massivemadness massivemadness added the cannot reproduce Unable to reproduce this bug, assuming it's not an issue label May 24, 2023
@massivemadness
Copy link
Owner

massivemadness commented May 24, 2023

Проверил с обычным EditText на своем Xiaomi, баг не воспроизводится. Покажи верстку, там обычный EditText или еще какой-то вложенный layout?

@massivemadness massivemadness changed the title Edittext's invisible cursor EditText focus issue May 24, 2023
@KitsuneFolk
Copy link
Contributor Author

Вот fragment_tab, я сначала тестировал с обычным эдиттекстом, потом с TextInputEditText, вот второв вариант, баг сохраняется и так и так. Еще заметил что в начальном фрагменте, который по дефолту установлен в графе, бага нету, похоже только с фрагментами которые открываются из контроллера:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?android:colorBackground"
    android:layoutDirection="locale">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="24dp"
        android:layout_marginEnd="24dp"
        android:textColor="?colorOnBackground"
        android:gravity="center"
        android:textSize="48sp"
        android:id="@+id/label"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:text="Tab 1" />

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="24dp"
        android:layout_marginEnd="24dp"
        android:layout_marginBottom="24dp"
        android:singleLine="true"
        android:hint="Enter your value"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/label" />
</androidx.constraintlayout.widget.ConstraintLayout>

@massivemadness massivemadness removed the cannot reproduce Unable to reproduce this bug, assuming it's not an issue label May 24, 2023
@massivemadness
Copy link
Owner

Смог воспроизвести, правда визуально оно у меня по-другому выглядит. Посмотрю как появится время, точных сроков не могу назвать

@massivemadness
Copy link
Owner

Немного погуглив нашел похожий тред android/views-widgets-samples#107. Кажется это внутренняя проблема ViewPager2. Не думаю что стоит пытаться исправить самому, ждем фикс от гугла... 🥲

@KitsuneFolk KitsuneFolk closed this as not planned Won't fix, can't repro, duplicate, stale May 27, 2023
@KitsuneFolk
Copy link
Contributor Author

@massivemadness Я поставил offscreenPageLimit для viewPager2 на значение больше количества фрагментов(К примеру 10), баг исчез, думаешь это можно считать за фикс?

@massivemadness
Copy link
Owner

Нет, так фрагменты не будут удаляться. Надо чтобы только 2 в памяти лежали (текущий видимый + один под ним)

@KitsuneFolk
Copy link
Contributor Author

Тоже думаю что не наилучшее решение, попробую найти другой фикс.

@KitsuneFolk
Copy link
Contributor Author

KitsuneFolk commented Jun 18, 2023

@massivemadness как думаешь, стоит ли заменить viewpager2 на viewpager если это пофиксит баг? Мне самому не хочется использовать более старый вьюпэйджер, но похоже что проблема бага кроется в работе ViewPager2 и pageTransformer, не похоже что бы Гугл планировали это фиксить 😢

@massivemadness
Copy link
Owner

massivemadness commented Jun 18, 2023

VP2 надо оставить для поддержки вертикального скроллинга. Но, если с vp1 получится сделать горизонтальный скроллинг right-to-left без необходимости переопределять layout direction в каждом макете (как сейчас), то от вертикального я готов отказаться (одно улучшение в обмен на другое 😄)

@KitsuneFolk
Copy link
Contributor Author

14:00 Я передумал использовать vp1, думаю лучше будет скопировать библиотеку vp2 и модифицировать её(vp1 слишком обрезанный, к тому же я встретил немного больше багов чем ожидал, думаю это не стоит того).
14:52 Понял что баг кроется в этой линии кода: mPageTransformerAdapter.setPageTransformer(transformer); , сейчас буду искать фикс
14:55 Похоже проблема в PageTransformerAdapter.onPageScrolled.
14:58 Вот код метода

@Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        if (mPageTransformer == null) {
            return;
        }

        float transformOffset = -positionOffset;
        for (int i = 0; i < mLayoutManager.getChildCount(); i++) {
            View view = mLayoutManager.getChildAt(i);
            if (view == null) {
                throw new IllegalStateException(String.format(Locale.US,
                        "LayoutManager returned a null child at pos %d/%d while transforming pages",
                        i, mLayoutManager.getChildCount()));
            }
            int currPos = mLayoutManager.getPosition(view);
            float viewOffset = transformOffset + (currPos - position);
            mPageTransformer.transformPage(view, viewOffset);
        }
    }

И баг возникает из-за последней линии, mPageTransformer.transformPage(view, viewOffset);
15:02 Хмм, трансформер который используется это SwipeTransformer, может где то в нём проблема...
15:04 Да, только что закомментировал весь код трансформера, похоже что проблема в нём, нужно разобраться где именно.
15:09 Почему то при клике вызывается вот этот кусок кода:

position > -1 && position <= 0 -> {
               Log.d("TAG", "position > -1 && position <= 0")
               when (swipeDirection) {
                   SwipeDirection.LEFT_TO_RIGHT -> {
                       page.translationX = -page.width * position / parallaxFactor
                   }
                   SwipeDirection.RIGHT_TO_LEFT -> {
                       page.translationX = page.width * position / parallaxFactor
                   }
                   SwipeDirection.TOP_TO_BOTTOM -> {
                       page.translationY = -page.height * position / parallaxFactor
                   }
                   SwipeDirection.BOTTOM_TO_TOP -> {
                       page.translationY = page.height * position / parallaxFactor
                   }
               }
               page.visibility = View.VISIBLE
               page.alpha = 1.0f - abs(position * alphaFactor)
           }

15:13 Трансформер вызывает onPageChangeCallback.onPageScrolled и onPageChangeCallback.onPageSelected при нажатии на EditText, странно.
15:26 При комментировании этого кода изсчезает баг

SwipeDirection.LEFT_TO_RIGHT -> {
                       page.translationX = -page.width * position / parallaxFactor
                   } 

Похоже изменение page.translationX тригерит onPageScrolled, хмммм...

15:32 изменение page.translationX тригерит не сам onPageScrolled, а onScrollStateChanged(который тригерится RecyclerView'ом), который в свою очередь тригерит dispatchScrolled, а он mCallback.onPageScrolled
15:44 dispatchScrolled вызывается с такими аргументами: position: 3, offset: 0.0, offsetPx: 0, возможно это о чём то говорит.
15:47 Я нашёл очень-преочень-преочень костыльный фикс, путём отключения метода ScrollEventAdapter.dispatchSelected, этот метод нигде не используется, но вызывается в множестве других методов, но тогда почему баг пропал?
@massivemadness думаешь стоит продолжать дальнейшие поиски причины, или такой фикс сойдёт? Если в кратце, то я перенёс библиотеку ViewPager2 в Fragula, отключил(закомментировал) метод ScrollEventAdapter.dispatchSelected. Сейчас сделаю коммит и pull request, на сегодня я истощён, если захочешь, могу продолжить поиски завтра.

@massivemadness
Copy link
Owner

Спасибо за ресерч, я посмотрю как время появится 👍

@massivemadness
Copy link
Owner

massivemadness commented Jun 19, 2023

Я тут экспериментировал, добавил строчку viewPager.offscreenPageLimit = 1 в свайпфрагмент и баг пропал (при том что в памяти всё так же 2 фрагмента, ничего не изменилось). Проверишь у себя?

@KitsuneFolk
Copy link
Contributor Author

Да, я проверял это тоже, у меня баг сохранялся несмотря на добавлении этой строки, только что проверил ещё раз, баг не ушёл, добавил после viewPager.registerOnPageChangeCallback(onPageChangeCallback) viewPager.offscreenPageLimit = 1(перед тоже), после setPageTransformer тоже добавил, и после setBackgroundColor, наконец добавил под конец инициализации - ничего.

@ovcharenkoa
Copy link

@massivemadness как думаешь, стоит ли заменить viewpager2 на viewpager если это пофиксит баг? Мне самому не хочется использовать более старый вьюпэйджер, но похоже что проблема бага кроется в работе ViewPager2 и pageTransformer, не похоже что бы Гугл планировали это фиксить 😢

Я пофиксал эту проблему именно откатившись на view pager, и потратил пол часа на это.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something that needs to be fixed
Projects
None yet
Development

No branches or pull requests

3 participants