Quando estou mostrando um fragmento (que é tela cheia com #77000000
plano de fundo) sobre outro fragmento (vamos chamá-lo de principal), meu fragmento principal ainda reage aos cliques (podemos clicar em um botão, mesmo que não o possamos ver).
Pergunta : como evitar cliques no primeiro fragmento (principal)?
EDITAR
Infelizmente, não posso apenas ocultar o fragmento principal, porque estou usando um fundo transparente no segundo fragmento (para que o usuário possa ver o que está localizado atrás).
android
android-fragments
Dmitry Zaytsev
fonte
fonte
Visibility
seumain
Fragment
paraGONE
quando não o estiver usando.onClick
método não retorna nada. Mas você dá uma ideia, obrigado (postarei resposta em breve).Respostas:
Defina a
clickable
propriedade na exibição do segundo fragmento como true. A visualização capturará o evento para que ele não seja passado para o fragmento principal. Portanto, se a visualização do segundo fragmento for um layout, este seria o código:fonte
RelativeLayout
dentro do fragmento e defino toda a exibição com aclickeable
propriedade A solução do @Dmitry resolve meu problema.A solução é bem simples. Em nosso segundo fragmento (que se sobrepõe ao nosso fragmento principal), apenas precisamos pegar o
onTouch
evento:fonte
Basta adicionar
clickable="true"
efocusable="true"
ao layout paiSe você estiver usando
AndroidX
, tente istofonte
focuseable
não é realmente necessário.focusable="true"
aqui é apenas para evitar um aviso no Android Studio.Você deve ocultar o primeiro fragmento quando estiver exibindo o segundo fragmento se dois fragmentos forem colocados na mesma exibição de contêiner.
fonte
Você precisa adicionar
android:focusable="true"
comandroid:clickable="true"
Clickable
significa que ele pode ser clicado por um dispositivo apontador ou toque em um dispositivo de toque.Focusable
significa que ele pode obter o foco de um dispositivo de entrada como um teclado. Dispositivos de entrada como teclados não podem decidir para qual exibição enviar seus eventos de entrada com base nas próprias entradas; portanto, eles os enviam para a exibição em foco.fonte
Há mais de uma solução que alguns de nós contribuíram para esse segmento, mas também gostaria de mencionar uma outra solução. Se você não gosta de colocar cliques e foco, é igual ao ViewGroup raiz de cada layout em XML como eu. Você também pode colocá-lo em sua base se tiver um como abaixo;
Espero que ajude aqueles que odeiam XMLs de layout.
fonte
A resposta aceitável "funcionará", mas também causará custo de desempenho (excesso, re-medição na mudança de orientação), pois o fragmento na parte inferior ainda está sendo desenhado. Talvez você deva simplesmente encontrar o fragmento por tag ou ID e definir a visibilidade como GONE ou VISIBLE quando precisar mostrar novamente.
Em Kotlin:
Essa solução é preferível à alternativa
hide()
e aosshow()
métodos deFragmentTransaction
quando você usa animações. Você acabou de chamá-lo deonTransitionStart()
eonTransitionEnd()
deTransition.TransitionListener
.fonte
Método 1:
Você pode adicionar a todo o layout de fragmentos
Método 2: (programaticamente)
Estenda todos os fragmentos de
FragmentBase
etc. Em seguida, adicione este código aFragmentBase
fonte
O que você pode fazer é clicar em branco no layout do fragmento anterior usando a propriedade onClick para o layout pai desse fragmento principal e na atividade você pode criar uma função
doNothing(View view)
e não escrever nada nele. Isso fará isso por você.fonte
Isso soa como um caso para DialogFragment. Caso contrário, com o Fragment Manager, comprometa um para ocultar e o outro para mostrar. Isso funcionou para mim.
fonte
A adição de
android:clickable="true"
não funcionou para mim. Esta solução não funciona no CoordinatorLayout quando é um layout pai. Por isso, criei RelativeLayout como layout pai, adicioneiandroid:clickable="true"
e coloquei CoordinatorLayout nesse RelativeLayout.fonte
Eu tinha vários fragmentos com o mesmo xml.
Depois de passar horas, eu removi
setPageTransformer
e ele começou a funcionarEu tinha uma lógica assustadora.
fonte