В моем приложении для Android, работающем на Android 5.1.1, у меня есть макет, использующий Toolbar
с TabLayout
, а под ним ViewPager
. Все это собрано в CoordinatorLayout
.
На первой странице ViewPager
есть RecyclerView
CardView
товаров.
Моя проблема заключается в том, что размер моего ViewPager
постоянно изменяется таким образом, что элементы моего CardView
списка обрезаются.
Мой основной макет выглядит примерно так:
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.design.widget.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent" >
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.design.widget.CoordinatorLayout>
И первый фрагмент, который обслуживает мой ViewPager
, выглядит так:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.RecyclerView
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp"/>
</FrameLayout>
Это делает что-то похожее на это:
При нажатии кнопки в моем макете я использую startActivityForResult
для вызова другого действия, а при возвращении к моему действию иногда мой список внезапно обрезается, так что видна только половина первого элемента:
После горизонтального смахивания на другой пейджер в ViewPager
, а затем обратно, проблема исчезает, так что, похоже, повторное расположение не сработало должным образом. Однако нажатие ДОМОЙ, а затем возобновление моей деятельности НЕ решает проблему. Обратите внимание, что это происходит, даже если я никак не изменяю свой макет, я просто возвращаюсь из вызова startActivityForResult. И да, это происходит иногда... И у меня нет запущенных фоновых потоков, которые могли бы объяснить очевидное случайное поведение.
Сначала я подумал, что это RecyclerView
уменьшился, но с помощью HierarchyViewer я смог обнаружить, что на самом деле это был весь ViewPager
, который уменьшился примерно до половины своей первоначальной высоты.
Я пробовал различные хаки, чтобы обойти это, включая вызов invalidate()
и requestLayout()
для всей моей иерархии представлений, но ничего не помогло (хотя перелистывание на другую страницу и обратно исправляет это). Кроме того, это не те решения, к которым я хочу прибегнуть... Затем я попытался изменить высоту ViewPager на wrap_content
, что фактически решило эту конкретную проблему; после возвращения к моей деятельности первый элемент в моем RecyclerView
никогда не обрезается, и я могу прокрутить вниз до других элементов. Однако теперь вместо этого самый последний элемент моего списка всегда обрезается, как видно на этом снимке экрана, где список прокручен до конца:
Поскольку сейчас я нахожусь в такой ситуации, когда не совсем понимаю, что происходит, мне нужна помощь. Что мне действительно следует использовать в качестве layout_height для моего ViewPager и, прежде всего, почему? Для меня match_parent
имеет смысл, но как я должен думать здесь? Есть ли рациональная причина, по которой мои представления обрезались при использовании match_parent
, или я действительно столкнулся с ошибкой в ViewPager
, RecyclerView
и/или CoordinatorLayout
? Как мне убедиться, что мой ViewPager
постоянно заполняет всю область экрана под панелью приложений, и что мой RecyclerView
можно прокручивать по вертикали для правильного отображения всех элементов списка CardView
?
match_parent
будет работать, потому что поведение макета поместит дочерний макет нижеAppBarLayout
в то время, когда дочерние элементы находятся в макете. - person Nikola Despotoski   schedule 15.10.2015match_parent
, я сталкиваюсь со странным изменением размера окна просмотра после возврата из подактивности, что является основной проблемой. - person JHH   schedule 15.10.2015layout:height
изViewPager
как0dp
и добавитьlayout:weight
как1
- person JavaGhost   schedule 20.10.2015layout_weight
применим к LinearLayout, а не к CoordinatorLayout, который является расширенным FrameLayout. Это не поможет. - person JHH   schedule 21.10.2015