Eu tenho uma folha inferior que deve ir entre 2 estados STATE_COLLAPSED
e , STATE_EXPANDED
quando está fechada, a altura deve estar 200dp
e, quando expandida, será exibida em tela cheia.
Então, eu estou definindo o BottomSheetBehavior
com
isFitToContents = false
peekHeight = 200dp
e sou forçado a definir um valor halfExpandedRatio
caso contrário, quando na STATE_HALF_EXPANDED
folha inferior ocupar metade da tela.
Estou trabalhando com com.google.android.material:material:1.1.0-rc01
Existe uma maneira de desativar o STATE_HALF_EXPANDED
estado?
Ou, na verdade skipCollapsed=true
, devo definir , descobrir em termos de proporção o que 200dp significa e trabalhar com STATE_HALF_EXPANDED
e em STATE_EXPANDED
vez de STATE_COLLAPSED
eSTATE_EXPANDED
android
material-components-android
Noa Drach
fonte
fonte
halfExpandedRatio=0.25f
e, empeekHeight = 200dp
seguida, tratarSTATE_COLLAPSED
eSTATE_HALF_EXPANDED
como se eles fossem o mesmo estado resolve o problema. Manter a questão em aberto, caso haja outras idéias.Respostas:
O valor da taxa de metade expandida deve ser definido como um valor entre 0 e 1 exclusivo ; portanto, defina esse valor para um número muito baixo, que certamente será menor que a sua altura de pico, diga "0,0001f". Com esse valor, você nem deve ver o
STATE_HALF_EXPANDED
estado. Os estados variam entreSTATE_EXPANDED
eSTATE_COLLAPSED
.Solução alternativa
A solução acima funciona e desativa efetivamente o
STATE_HALF_EXPANDED
estado, mas é imprecisa (IMO) e pode ser interrompida no futuro. Por exemplo, e se for aplicado um valor razoável para a taxa de meia expansão, que esteja entre a altura da espiada e a altura total? Isso seria problema.Os requisitos declarados pelo OP são que a folha inferior deve fazer a transição entre a altura da espiada e a altura total. Não há nenhum problema com a altura da espiada, mas o OP especifica
isFitToContents = false
para atingir a altura total. (Presumo que a folha de baixo dele possa ser menor que o espaço disponível.)Infelizmente, quando
isFitToContents == false
é introduzido um comportamento adicional de "meia altura" que o OP deseja evitar e, portanto, a questão.Além do comportamento de "meia altura", outro comportamento é introduzido, que é o "deslocamento expandido". O deslocamento expandido especifica a que distância da tela inteira a folha inferior será interrompida. Um valor de
100f
, por exemplo, deixará uma100px
borda na parte superior da folha inferior quando totalmente expandida. O padrão para o deslocamento expandido é zero.Não conheço nenhum comportamento que seja
isFitToContents == false
introduzido além dos mencionados acima.Portanto, considerando esses requisitos, podemos criar uma folha de fundo que se mova entre a altura da espiada e a altura total, especificando
isFitToContents == true
assim evitando o problema da "meia altura"? Não há requisitos para um deslocamento expandido diferente de zero; portanto, não precisamos nos preocupar com isso.Aqui está um pequeno aplicativo de demonstração demonstrando que podemos atender a esses requisitos com a estrutura da folha inferior direita:
MainActivity5.kt
BaseActivity.kt
activity_main5.xml
Se tivermos uma folha inferior longa, a seguinte estrutura funcionará para rolá-la:
activity_main6.xml
fonte
isFitToContents = false
, mas os testes agora comisFitToContents = true
ok funcionamsheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
quando o estado de meia expansão for alcançado, mas isso está ficando um pouco complicado. A solução alternativa é melhor.se você quiser tentar acima como na imagem, você pode seguir o código abaixo, pode ajudá-lo !!!
fonte
tente definir um
addBottomSheetCallback
no seuBottomSheetBehavior
e, quando detectar umSTATE_HALF_EXPANDED
estado, liguesetState(STATE_HIDDEN)
para que, sempre que a folha de baixo tentar atingir o estado intermediário, ela será fechada.fonte
STATE_COLLAPSED
e nãoSTATE_HIDDEN
. Mas tentei implementá-lo e a transição deSTATE_HALF_EXPANDED
paraSTATE_COLLAPSED
parece desajeitada. A transição entre estados é animada, então você vê a folha de baixo pararSTATE_HALF_EXPANDED
e depois se move paraSTATE_COLLAPSED
halfExpandedState=0.25f
, b / c, então a transição entre estados não será tão óbvia. Mas não tenho certeza se haverá uma grande mudança em relação ao que eu já tenhoEu tinha um caso de uso semelhante, em que o layout precisava ter um terço da altura. Eu tentei o seguinte e funcionou muito bem.
Eu tive que alterá-las dinamicamente para definir o seguinte na folha inferior, mas você também pode fazer isso em xml:
Para descartar, adicionei animação ao meu fragmento usando a seguinte função:
Espero que isto ajude
fonte
Tente configurar
BottomSheetBehavior
.setHalfExpandedRatio(0f)
. Não há muito mais que possa afetarSTATE_HALF_EXPANDED
, a menos que defina explicitamente o estado com .setState () . Também deve ser possível criar um costumeBehavior
, que se estendeCoordinatorLayout.Behavior<View>
e não possuiSTATE_HALF_EXPANDED
. por exemplo. Interceptando tudo com os comportamentos do CoordinatorLayout .fonte
Tentei de maneiras diferentes, mas nenhuma técnica funcionou perfeitamente. Tentei interceptar eventos
BottomSheetBehavior.BottomSheetCallback {}
e liguei comdismiss()
base na lógica personalizada, mas isso causou um empurrão.Então, finalmente, no meu
BottomSheetDialogFragment
eu adicioneibottomSheetBehavior.isDraggable = false
e isso causou o arrastamento da folha de baixo pelo toque. de qualquer maneira, na caixa de diálogo de área vazia, é dispensado.Observe que, a folha inferior ainda se expande com animação. Isso é realmente ótimo!
substituir diversão onCreateDialog (savedInstanceState: Bundle?): Caixa de diálogo {val dialog = super.onCreateDialog (savedInstanceState)
fonte