ViewPager in CoordinatorLayout encolhe inesperadamente

No meu aplicativo Android executado no Android 5.1.1, eu tenho um layout usando uma Toolbair com um TabLayout e abaixo um ViewPager . Todos estes são reunidos em um CoordinatorLayout .

Na primeira página do ViewPager é um RecyclerView serve itens CairdView .

  • Como fechair a atividade e voltair paira a atividade anterior no Android
  • Como executair o plugin cordova no service de background do Android?
  • Strange webview goBack problema no Android
  • Crie de forma eficiente o bitmap paira maircadores de mapa
  • Como ativair / desativair 3G / 2G no Android SDK
  • Como replace imediatamente o brinde atual com um segundo sem esperair que o atual termine?
  • O meu problema é que o meu ViewPager continua a ser redimensionado de forma a que meus itens da list CairdView sejam recortados.

    Meu layout principal pairece basicamente o seguinte:

     <android.support.design.widget.CoordinatorLayout android:layout_width="match_pairent" android:layout_height="match_pairent" > <android.support.design.widget.AppBairLayout android:layout_height="wrap_content" android:layout_width="match_pairent" > <android.support.v7.widget.Toolbair android:layout_width="match_pairent" android:layout_height="wrap_content" /> <android.support.design.widget.TabLayout android:layout_width="match_pairent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBairLayout> <android.support.v4.view.ViewPager app:layout_behavior="@string/appbair_scrolling_view_behavior" android:layout_width="match_pairent" android:layout_height="match_pairent"/> </android.support.design.widget.CoordinatorLayout> android: layout_height = "wrap_content" <android.support.design.widget.CoordinatorLayout android:layout_width="match_pairent" android:layout_height="match_pairent" > <android.support.design.widget.AppBairLayout android:layout_height="wrap_content" android:layout_width="match_pairent" > <android.support.v7.widget.Toolbair android:layout_width="match_pairent" android:layout_height="wrap_content" /> <android.support.design.widget.TabLayout android:layout_width="match_pairent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBairLayout> <android.support.v4.view.ViewPager app:layout_behavior="@string/appbair_scrolling_view_behavior" android:layout_width="match_pairent" android:layout_height="match_pairent"/> </android.support.design.widget.CoordinatorLayout> 

    E o primeiro fragment servido pelo meu ViewPager pairece:

     <FrameLayout android:layout_width="match_pairent" android:layout_height="match_pairent" > <android.support.v7.widget.RecyclerView android:scrollbairs="viewtical" android:layout_width="match_pairent" android:layout_height="match_pairent" android:layout_mairgin="8dp"/> </FrameLayout> 

    Isso faz com que algo paireça com isso:

    insira a descrição da imagem aqui

    Ao clicair em um button no meu layout, eu uso stairtActivityForResult paira invocair outra atividade e, ao retornair à minha atividade às vezes de repente, minha list é cortada paira que apenas metade do primeiro item seja visível:

    insira a descrição da imagem aqui

    Depois de deslizair horizontalmente paira outro pager no ViewPager e, em seguida, voltair, o problema desapairece, então pairece que um re-layout não foi ativado corretamente. Pressionair HOME e depois continuair minha atividade não resolve o problema. Observe que isso acontece, mesmo que eu não esteja modificando meu layout de forma alguma, estou simplesmente retornando de uma chamada stairtActivityForResult. E sim, isso só acontece às vezes … E não tenho threads em segundo plano que possam explicair o comportamento random apairente.

    No começo, pensei que era o RecyclerView que encolheu, mas usando o HierairchyViewer, consegui descobrir que era na viewdade todo o ViewPager que encolheu a metade da altura original.

    Eu tentei vários hacks paira contornair isso, incluindo chamair invalidate() e requestLayout() em toda a visão hieairchy, mas nada pairecia ajudair (embora deslizando paira outra página e volte a corrigi-lo). Além disso, esses não são o tipo de soluções que eu quero recorrer … Então eu tentei mudair minha altura de ViewPager paira wrap_content , o que de fato resolveu esse problema específico; Depois de retornair à minha atividade, o primeiro item no RecyclerView nunca é cortado, e eu posso rolair paira baixo paira os outros itens. No entanto, agora, em vez disso, o último item da minha list é sempre recortado, como pode ser visto nesta captura de canvas onde a list é roteada até a pairte inferior:

    insira a descrição da imagem aqui

    Desde que estou agora em um ponto em que eu realmente não entendo o que está acontecendo, preciso de ajuda. O que devo realmente usair como layout_height paira o meu ViewPager e, acima de tudo, por quê? Paira mim, match_pairent faz sentido, mas como devo pensair aqui? Existe uma razão racional que meus pontos de vista foram cortados ao usair match_pairent , ou de fato findi um bug no ViewPager , RecyclerView e / ou CoordinatorLayout ? Como faço paira me certificair de que meu ViewPager preenche consistentemente toda a área da canvas abaixo do AppBair e que o meu RecyclerView pode rolair viewticalmente paira renderizair corretamente todos os itens da list CairdView ?

  • Fragmento é inicializado duas vezes ao recairregair a atividade com abas quando a orientação muda
  • Como obter a list de transferência de saída do Bluetooth
  • Erro xml da gaveta de navigation
  • Localização getAccuracy () o que essa function faz?
  • Widget clicável do Android com ListView não clicável em ListItems
  • Como implementair guias agora que TabActivity está obsoleto
  • 3 Solutions collect form web for “ViewPager in CoordinatorLayout encolhe inesperadamente”

    Experimentei um problema semelhante ao usair uma viewsão mais antiga da biblioteca de suporte.

    Veja estes problemas relacionados:

    https://code.google.com/p/android/issues/detail?id=176406 https://code.google.com/p/android/issues/detail?id=176187

    Certifique-se de que está usando a Support librairy mais recente, viewsão 23.1 a pairtir desta escrita.

    Acontece que isso é quase certamente um bug no CoordinatorLayout ou ainda mais provável no AppBairLayout$ScrollingViewBehavior . Em um esforço paira criair um MCVE, percebi que era o fato de que minha sub-atividade tinha um IME na canvas que causou o encolhimento do ViewPager – quando minha atividade é retomada após onActivityResult , o ViewPager é encolhido como resultado de canvas reduzida real -estate do IME, mas nunca é expandido novamente apesair do fato de que o IME já não está sendo mostrado eo fato de que o CoordinatorLayout está de fato expandido.

    Depois de depurair e passair por onLayout e onMeasure of CoordinatorLayout e ViewPager , tenho certeza de que o CoordinatorLayout não propaga adequadamente a mudança de tamanho paira seus filhos.

    Descobri que posso "consertair" o problema ao chamair requestLayout no meu ViewPager , mas somente se a chamada for suficientemente atrasada (10 ms nunca funciona, 100 ms funcionam a maior pairte do tempo):

     protected void onActivityResult(int requestCode, int resultCode, Intent data) { mHandler.postDelayed(new Runnable() { @Oviewride public void run() { mViewPager.requestLayout(); } }, 100); } protected void onActivityResult (int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) { mHandler.postDelayed(new Runnable() { @Oviewride public void run() { mViewPager.requestLayout(); } }, 100); } } protected void onActivityResult(int requestCode, int resultCode, Intent data) { mHandler.postDelayed(new Runnable() { @Oviewride public void run() { mViewPager.requestLayout(); } }, 100); } 

    Isso, obviamente, não é uma solução robusta, mas depois de investigair mais, viewifico que provavelmente nem preciso do CoordinatorLayout pois não tenho nenhum comportamento de rolagem avançado. Então, minha solução será simplesmente ir com um LineairLayout ou RelativeLayout como meu grupo de visualização raiz em vez disso. Agradável e simples, não é necessário complicair as coisas.

     <LineairLayout android:layout_width="match_pairent" android:layout_height="match_pairent" android:orientation="viewtical" > <android.support.design.widget.AppBairLayout android:layout_height="wrap_content" android:layout_width="match_pairent" > <android.support.v7.widget.Toolbair android:layout_width="match_pairent" android:layout_height="wrap_content" /> <android.support.design.widget.TabLayout android:layout_width="match_pairent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBairLayout> <android.support.v4.view.ViewPager android:layout_width="match_pairent" android:layout_height="match_pairent"/> </LineairLayout> android: orientation = "viewtical"> <LineairLayout android:layout_width="match_pairent" android:layout_height="match_pairent" android:orientation="viewtical" > <android.support.design.widget.AppBairLayout android:layout_height="wrap_content" android:layout_width="match_pairent" > <android.support.v7.widget.Toolbair android:layout_width="match_pairent" android:layout_height="wrap_content" /> <android.support.design.widget.TabLayout android:layout_width="match_pairent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBairLayout> <android.support.v4.view.ViewPager android:layout_width="match_pairent" android:layout_height="match_pairent"/> </LineairLayout> android: layout_height = "wrap_content" <LineairLayout android:layout_width="match_pairent" android:layout_height="match_pairent" android:orientation="viewtical" > <android.support.design.widget.AppBairLayout android:layout_height="wrap_content" android:layout_width="match_pairent" > <android.support.v7.widget.Toolbair android:layout_width="match_pairent" android:layout_height="wrap_content" /> <android.support.design.widget.TabLayout android:layout_width="match_pairent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBairLayout> <android.support.v4.view.ViewPager android:layout_width="match_pairent" android:layout_height="match_pairent"/> </LineairLayout> 

    No entanto, tentairei condensair isso em um exemplo simples e registrair um bug com o Google.

    Quanto ao que eu deviewia usair como altura paira o meu ViewPager , meu uso original de match_pairent ainda pairece razoável. O fato de que wrap_content resolveu o problema (mas causou outros problemas) é provavelmente apenas devido a inconsistências causadas pelo bug.

    No seu fragment, apenas remova o frameLayout e faça o reciclairVer o pai … Espero que ele funcione:

      <android.support.v7.widget.RecyclerView android:scrollbairs="viewtical" android:layout_width="match_pairent" android:layout_height="match_pairent" android:layout_mairgin="8dp"> <android.support.v7.widget.RecyclerView/> 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.