Code Monkey home page Code Monkey logo

Comments (14)

KitsuneFolk avatar KitsuneFolk commented on May 20, 2024 1

Вот 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>

from fragula.

massivemadness avatar massivemadness commented on May 20, 2024 1

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

from fragula.

massivemadness avatar massivemadness commented on May 20, 2024 1

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

from fragula.

KitsuneFolk avatar KitsuneFolk commented on May 20, 2024 1

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

from fragula.

KitsuneFolk avatar KitsuneFolk commented on May 20, 2024 1

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

from fragula.

massivemadness avatar massivemadness commented on May 20, 2024 1

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

from fragula.

massivemadness avatar massivemadness commented on May 20, 2024 1

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

from fragula.

massivemadness avatar massivemadness commented on May 20, 2024

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

from fragula.

KitsuneFolk avatar KitsuneFolk commented on May 20, 2024

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

from fragula.

massivemadness avatar massivemadness commented on May 20, 2024

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

from fragula.

KitsuneFolk avatar KitsuneFolk commented on May 20, 2024

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, на сегодня я истощён, если захочешь, могу продолжить поиски завтра.

from fragula.

massivemadness avatar massivemadness commented on May 20, 2024

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

from fragula.

KitsuneFolk avatar KitsuneFolk commented on May 20, 2024

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

from fragula.

ovcharenkoa avatar ovcharenkoa commented on May 20, 2024

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

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

from fragula.

Related Issues (16)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.