Comments (14)
Вот 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.
Смог воспроизвести, правда визуально оно у меня по-другому выглядит. Посмотрю как появится время, точных сроков не могу назвать
from fragula.
Немного погуглив нашел похожий тред android/views-widgets-samples#107. Кажется это внутренняя проблема ViewPager2. Не думаю что стоит пытаться исправить самому, ждем фикс от гугла... 🥲
from fragula.
Тоже думаю что не наилучшее решение, попробую найти другой фикс.
from fragula.
@massivemadness как думаешь, стоит ли заменить viewpager2 на viewpager если это пофиксит баг? Мне самому не хочется использовать более старый вьюпэйджер, но похоже что проблема бага кроется в работе ViewPager2 и pageTransformer, не похоже что бы Гугл планировали это фиксить 😢
from fragula.
VP2 надо оставить для поддержки вертикального скроллинга. Но, если с vp1 получится сделать горизонтальный скроллинг right-to-left без необходимости переопределять layout direction в каждом макете (как сейчас), то от вертикального я готов отказаться (одно улучшение в обмен на другое 😄)
from fragula.
Спасибо за ресерч, я посмотрю как время появится 👍
from fragula.
Проверил с обычным EditText
на своем Xiaomi, баг не воспроизводится. Покажи верстку, там обычный EditText или еще какой-то вложенный layout?
from fragula.
@massivemadness Я поставил offscreenPageLimit для viewPager2 на значение больше количества фрагментов(К примеру 10), баг исчез, думаешь это можно считать за фикс?
from fragula.
Нет, так фрагменты не будут удаляться. Надо чтобы только 2 в памяти лежали (текущий видимый + один под ним)
from fragula.
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.
Я тут экспериментировал, добавил строчку viewPager.offscreenPageLimit = 1
в свайпфрагмент и баг пропал (при том что в памяти всё так же 2 фрагмента, ничего не изменилось). Проверишь у себя?
from fragula.
Да, я проверял это тоже, у меня баг сохранялся несмотря на добавлении этой строки, только что проверил ещё раз, баг не ушёл, добавил после viewPager.registerOnPageChangeCallback(onPageChangeCallback)
viewPager.offscreenPageLimit = 1
(перед тоже), после setPageTransformer
тоже добавил, и после setBackgroundColor
, наконец добавил под конец инициализации - ничего.
from fragula.
@massivemadness как думаешь, стоит ли заменить viewpager2 на viewpager если это пофиксит баг? Мне самому не хочется использовать более старый вьюпэйджер, но похоже что проблема бага кроется в работе ViewPager2 и pageTransformer, не похоже что бы Гугл планировали это фиксить 😢
Я пофиксал эту проблему именно откатившись на view pager, и потратил пол часа на это.
from fragula.
Related Issues (16)
- BackStack issue with `<fragment>` destinations
- App Crashing When Opening Swipeable Navigation Fragment HOT 2
- Exception when clicking on the back arrow button while swiping a swipeable fragment HOT 7
- How to get a reference of the current fragment HOT 3
- minSdk Question HOT 3
- Jetpack Compose improvements
- Fragment Swipe Silent Exception
- Navigation dependencie update issue HOT 3
- Hi Fragula Bug With viewpager2 HOT 12
- Your submission to JetpackCompose.app is live! HOT 1
- Restrict swiping area HOT 3
- Unable navigate from a <fragment> tag fragment to <swipeable> tag fragment or pop to <swipable>
- Apply animation to `navigateUp()` HOT 2
- can i use without android navigation component HOT 1
- how to stop one fragment in navHost not to implement swipe Please let me know is this possible? I have map fragment when change fragment to swipeable my map scrolling stops HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fragula.