Eu preciso criar uma interface como o Google Newsstand, que é uma espécie de ViewPager (rolagem horizontal) sobre um cabeçalho recolhível (rolagem vertical). Um dos meus requisitos é usar a nova Biblioteca de Suporte a Design apresentada no Google IO 2015. ( http://android-developers.blogspot.ca/2015/05/android-design-support-library.html )
Com base no exemplo criado por Chris Banes ( https://github.com/chrisbanes/cheesesquare ), cheguei ao ponto em que sou capaz de fazer o comportamento de recolhimento, mas com um LinearLayout básico (sem rolagem horizontal).
Tentei substituir o LinearLayout por um ViewPager e obtive uma tela em branco. Joguei com: largura, peso e todos os tipos de grupos de visão, mas .... ainda uma tela em branco. Parece que ViewPager e NestedScrollView não gostam um do outro.
Tentei uma solução alternativa usando um HorizontalScrollView: funciona, mas perco o benefício do recurso PagerTitleStrip e o foco em um único painel (posso interromper horizontalmente entre 2 painéis).
Agora não tenho mais ideias, se alguém pode me levar a uma solução ...
obrigado
Aqui está meu arquivo de layout mais recente:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="@dimen/header_height"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<include
layout="@layout/part_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_collapseMode="parallax"/>
<android.support.v7.widget.Toolbar
android:id="@+id/activity_main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/activity_main_nestedscrollview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v4.view.ViewPager
android:id="@+id/activity_main_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFA0"/>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
ViewPager
dentro de umLinearLayout
? Apenas curioso se isso renderizariaViewPager
corretamente.ViewPager
dentro de umNestedScrollView
como os únicos layouts - parecia funcionar bem. Eu também fui capaz de entrar em um comDrawerLayout
sucesso. Talvez haja outro aspecto do seu código impedindo a funcionalidade desejada. Quer compartilhar mais de sua fonte?ViewPager
. Consigo rolar as visualizações para cima e para baixo, bem como rolar para aViewPager
esquerda / direita.Respostas:
Eu encontro este problema, eu resolvo por
setFillViewport (true)
em atividade
fonte
android:fillViewport="true"
aoNestedScrollView
objeto. A documentação descreve esse atributo comoDefines whether the scrollview should stretch its content to fill the viewport.
.android:fillViewport="true"
emNestedScrollView
e dentro dofragment
Tenho um lugarlistView
onde me senteiandroid:nestedScrollingEnabled="true"
.. Corrigido o problema de rolagemOk, fiz uma pequena demonstração com o
ViewPager
eNestedScrollView
. O problema que enfrentei foi com a alturaViewPager
e oListView
. Então eu fiz uma pequena modificação noListView
eViewPager's
medição de altura.Se alguém quiser examinar o código, aqui está o link: https://github.com/TheLittleNaruto/SupportDesignExample/
Resultado:
fonte
NestedScrollView
e usando umLinearLayout
. Quais seriam os benefícios de ter umNestedScrollView
over aLinearLayout
se todo o propósito fosse rolar o conteúdo dentro do ViewPager? Por favor me corrija se eu estiver errado. : x ObrigadoAdicione o
android:fillViewport="true"
seuNestedScrollView
. período.fonte
Em vez de colocar ViewPager dentro de NestedScrollView, faça o contrário.
Coloque o NestedScrollView nas visualizações filho dentro do ViewPager que, em essência, é o layout do Fragment. Também é muito provável que você nem precise usar NestedScrollView se o layout de lista do seu Fragment for muito simples.
Layouts de exemplo
Layout da atividade:
Se você não precisa do TabLayout, pode abandonar o LinearLayout e tornar o ViewPager autônomo. Mas certifique-se de usar os
app:layout_behavior="@string/appbar_scrolling_view_behavior"
atributos do ViewPager.Layout do fragmento simples:
Layout do fragmento complexo:
Exemplo de aplicativo: CollapsingToolbarPoc
fonte
Teve os mesmos problemas.
Ao colocar NestedScrollView em torno do ViewPager, isso não funcionaria.
O que DID funcionou, entretanto, é colocar o NestedScrollView dentro do layout do fragmento que estou carregando dentro do ViewPager.
fonte
você pode tentar assim, o viewpager funciona bem, mas a altura do viewpager é fixa.
Ainda estou encontrando a melhor solução ... então, por favor, deixe-me saber se qualquer ponto pode fazer melhor, obrigado
fonte
Eu tive o mesmo problema e resolvi com algumas alterações.
ViewPager
não funciona dentro doNestedScrollView
. Basta colocar o seuViewPager
como um filho direto seuCoordinatorLayout
. Em seguida, o conteúdo de cada fragmento do ViewPager deve ser incluído emNestedScrollView
. É isso aí.fonte
Você não precisa usar o NestedScrollView para ter os efeitos de paralaxe. tente algo assim:
fonte
ViewPager
fragmentos sejam éterRecyclerView
ouNestedScrollView
. Se eles não são (por exemploListView
), em seguida, uma solução alternativa para Lollipop e acima é chamarlistView.setNestedScrollingEnabled(true)
Eu tinha um layout com uma barra de ferramentas de aplicativo com NestedScrollView abaixo dela, então dentro da barra de ferramentas aninhada estava um LinearLayout, abaixo do LinearLayout estava um pager de visualização. A ideia era que o LinearLayout dentro do NestedScrollView foi corrigido - você poderia deslizar para a esquerda / direita entre as visualizações do pager de visualização, mas este conteúdo não se moveria, pelo menos horizontalmente . Você ainda deve conseguir rolar todo o conteúdo verticalmente por causa da exibição de rolagem aninhada. Essa foi a ideia. Portanto, defino a altura de NestedScrollView aninhada como match_parent, preenche a janela de visualização e, a seguir, todos os layouts filhos / ViewPager como wrap_content.
Na minha cabeça isso estava certo. Mas não funcionou - o ViewPager me permitiu ir para a esquerda / direita, mas sem rolagem vertical, quer o conteúdo da página do viewpager fosse empurrado para baixo da tela atual ou não. Acontece que era basicamente porque o ViewPager não respeita wrap_content em suas várias páginas.
Resolvi isso criando uma subclasse do ViewPager para fazê-lo mudar de altura dependendo do item selecionado atualmente, forçando-o a se comportar como layout_height = "wrap_content":
A solução foi inspirada em esta resposta . Funcionou para mim!
fonte
basta colocar esta linha em NestedScrollView
fonte
Eu removi NestedScrollView do layout principal e inseri como Pai em todos os meus Fragmentos layouts de que deveriam carregar no ViewPager. Corrigi esse problema para mim.
fonte
Use a classe personalizada abaixo para resolver seu problema. Não se esqueça de chamar o método onRefresh () em pagechangelistener.
fonte
Eu estava tendo um problema semelhante (mas sem
CollapsingToolbarLayout
, apenas umToolbar
+ simplesTabLayout
dentro doAppBarLayout
). Eu queria que a barra de ferramentas desaparecesse de vista ao rolar para baixo o conteúdo de umViewPager
dentro doNestedScrollView
.Meu layout era mais ou menos assim:
Este layout não estava funcionando como planejado, mas resolvi simplesmente me livrando do
NestedScrollView
e usando umLinearLayout
. Funcionou para mim imediatamente na Android Support Library v23.1.0. Veja como o layout acabou:PS: Na verdade, foram dois arquivos de layout no meu projeto. Eu os copiei e colei aqui e tentei estruturá-los como se pareceriam em um único arquivo. Lamento se errei enquanto copiava e colava, mas me diga se foi esse o caso para que o possa corrigir.
fonte
O seguinte deve garantir a altura adequada do pager de visualização. O fragmento é o primeiro fragmento fornecido pelo pager de visualização.
fonte
Eu tenho o mesmo desejo, aninhe um
ViewPager
dentro de umNestedScrollView
. Mas também não funciona para mim. No meu caso, oViewPager
está dentro de umFragment
para que eu possa alternar o conteúdo dependendo das interações com a gaveta. Claro, AppBar, colapso, etc e todos os novos recursos da biblioteca de suporte devem funcionar.Se um usuário rolar verticalmente uma página no pager, quero que outras páginas sejam roladas da mesma forma, para dar ao usuário a impressão geral de que o próprio pager rolou.
O que eu fiz, o que funciona, é que eu não embuti mais o
ViewPager
interior de aNestedScrollView
, em vez disso, embuti o conteúdo dos fragmentos contidos dentro de aNestedScrollView
.Então, no caso de um pergaminho em um fragmento, informo o container da nova posição de rolagem, que o armazena.
Finalmente, ao deslizar para a esquerda ou direita detectado no pager (usando a
addOnPageChangeListener
procura de estados de arrasto), informo o fragmento esquerdo ou direito de destino onde ele deve rolar (com base no conhecimento do contêiner) para ser alinhado com o fragmento de onde venho.fonte
Eu conheço uma solução de trabalho: você usa Activity, com CoordinatorLayout e usa FrameLayout, container. Então. use o gerenciador de fragmentos para colocar o fragmento no contêiner. Por exemplo, meu código:
E Fragmento:
Em seguida, use FragmentManager
fonte
LinearLayout
dentro do layout do Fragment é desnecessário aqui. Veja minha resposta, usei a emLinearLayout
vez deFrameLayout
no layout da minha Activity e a raiz do meu fragmento é um ViewPager (sem layout de quebra automática).Depois de passar horas tentando todas as sugestões acima, finalmente consegui fazer funcionar. A chave é colocar
NestedScrollView
dentroPageViewer
, e definirlayout_behavior
para'@string/appbar_scrolling_view_behavior'
para ambos os pontos de vista. O layout final é comofonte
você acabou de remover o NestedScrollView do seu xml e adicionar este código à sua classe
yourGridView.setNestedScrollingEnabled(true);
fonte
Na verdade, o NestedScrollView não precisa ser irmão direto de CollapsingToolbarLayout no CoordinatorLayout. Eu consegui algo realmente bizarro. O appbar_scrolling_view_behavior funciona em 2 fragmentos aninhados.
Layout de minha atividade:
No frameLayout "container", aumentei este fragmento:
E os fragmentos dentro desse ViewPager têm a seguinte aparência:
O fato de NestedScrollView poder estar tão profundo na hierarquia dos filhos do CoordinatorLayout e nos comportamentos de rolagem ainda me surpreendeu.
fonte