eu tenho um BttomSheetDialogFragment personalizado e quero ter cantos arredondados na parte superior da vista inferior
esta é minha classe personalizada que inflando meu layout que eu quero que apareça de baixo
View mView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.charge_layout, container, false);
initChargeLayoutViews();
return mView;
}
e também tenho este arquivo de recurso xml como plano de fundo:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners android:topRightRadius="35dp"
android:topLeftRadius="35dp"
/>
<solid android:color="@color/white"/>
<padding android:top="10dp"
android:bottom="10dp"
android:right="16dp"
android:left="16dp"/>
mas o problema é que, quando eu defino este arquivo de recurso como plano de fundo do elemento raiz do meu Layout, os cantos ainda não são arredondados
e eu não posso usar o código abaixo:
this.getDialog().getWindow().setBackgroundDrawableResource(R.drawable.charge_layout_background);
porque seu plano de fundo padrão de substituição de BottomSheetDialog e não haverá qualquer cor cinza semitransparente acima de minha visualização inferior
android
material-design
bottom-sheet
material-components-android
material-components
Rasool Gana
fonte
fonte
Respostas:
Crie um drawable personalizado
rounded_dialog.xml
:Em seguida, substituir
bottomSheetDialogTheme
emstyles.xml
utilizando o drawable como pano de fundo:Isso mudará todos os BottomSheetDialogs do seu aplicativo.
fonte
rounded_dialog
&AppModalStyle
nomes com um plano de fundo onde apenas os cantos superiores são arredondados, como você esperaria usar esse plano de fundo com um estilo de folha inferior. Que talbottomsheet_rounded_background
&AppBottomSheetStyle
Theme.AppCompat.Light.NoActionBar
, faz com que todos os meus componentes da IU mudem de cor e não consigo substituí-losCom a nova biblioteca de componentes de materiais, você pode personalizar a forma de seu componente usando o
shapeAppearanceOverlay
atributo em seu estilo ( Nota: requer a versão 1.1.0 )Basta usar a
BottomSheetDialogFragment
substituição doonCreateView
método e definir seu estilo personalizado para Diálogos de Folha Inferior.Defina o
bottomSheetDialogTheme
atributo nostyles.xml
tema do seu aplicativo:Em seguida, basta definir sua forma favorita com
shapeAppearanceOverlay
Você pode obter o mesmo comportamento substituindo este método no seu
BottomSheetDialogFragment
(em vez de adicionar obottomSheetDialogTheme
no tema do seu aplicativo):Nesse caso, você está usando este themeOverlay apenas no único
BottomSheetDialogFragment
e não em todos os aplicativos.Nota importante sobre o ESTADO EXPANDIDO :
No estado expandido, BottomSheet tem cantos planos . Você pode verificar o comentário oficial no repo do github :
Este comportamento é fornecido pelo
BottomSheetBehavior
e é impossível substituí-lo.No entanto, há uma solução alternativa -> AVISO LEGAL: pode parar de funcionar nas próximas versões !!
Você pode adicionar um
BottomSheetCallback
noBottomSheetDialogFragment
:fonte
Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior
O
BottomSheetDialog
está configurando uma cor de fundo branca padrão, é por isso que os cantos não são visíveis. Para mostrá-los, você precisa tornar o fundo da caixa de diálogo transparente, substituindo o estilo doBottomSheetDialog
.Defina este estilo em seu
res/values/styles/styles.xml
E defina este estilo para o seu BottomSheetDialog
fonte
crie uma forma chamada rounded_corners_shape
definir um estilo
use este estilo em seu BottomSheetDialogFragment personalizado assim, vai funcionar!
fonte
Fragment
s.Se você usar a última versão do componente de material, você apenas tem que substituir
ShapeAppearance.MaterialComponents.LargeComponent
(já que a folha inferior usa esta forma) e definir o valor que deseja, como:E, em seguida, defina o estilo do seu aplicativo:
A solução de Gabriele Mariotti é semelhante e funciona também, mas esta é mais simples.
fonte
BottomSheetDialog
?Eu estava verificando a mesma coisa hoje e sim, você estava certo sobre seguir o código
isso se aplica ao fundo do fragmento, então, em vez disso, você deve obter a visualização da folha inferior na janela de diálogo e alterar o fundo aqui está o código
aqui, a folha de fundo é a visualização real que você deseja alterar.
fonte
BottomSheetDialogFragment
para que a lógica esteja noonCreateDialog
métodoA resposta de Koma Yip a partir de outra pergunta funcionou para mim, você deveria tentar.
coloque isso no nó raiz xml do layout:
e
onCreateView()
colocar isto:fonte
Esta resposta é apenas para a questão de definir a cor de fundo
Color.TRANSPARENT
após configurar um drawable com fundo arredondado para o layout.Nenhuma das respostas funcionou para mim definir a cor de fundo,
Color.TRANSPARENT
exceto asetupDialog()
solução de substituição :MAS o que
contentView
você definiu para o diálogo aqui não é o queview
você obtémonViewCreated()
ao inflaronCreateView()
. Isso quebra o fluxo padrão, então pode causar problemas como você não pode usarView Bindings
-Kotlin Android Extensions
emonViewCreated()
Então, eu ajusto um pouco para definir o plano de fundo em
onActivityCreated()
:Espero que essa ajuda tenha o mesmo problema
fonte
Crie um desenho de forma ... que usaremos como plano de fundo para a folha inferior. Forneça o valor apropriado para o raio do canto superior esquerdo e direito.
Agora crie um estilo para "Fragmento de diálogo de folha inferior"
Agora crie uma classe personalizada que estenderá BottomSheetDilogFragment, onde você fornece seu estilo.
Agora use esta classe onde você quiser ter uma folha inferior com canto arredondado. por exemplo
fonte
Adicione esses dois métodos em sua classe BottomsheetDialogFragment.
Agora chame o
setDialogBorder(dialog)
método nosetupDialog()
método de sua classe BottomsheetDialogFragment.Agora crie um arquivo de forma em sua pasta drawable.
Agora defina o plano de fundo para a visualização da caixa de diálogo do grupo de visualização pai no arquivo xml.
Feito!!
fonte
Eu sei que esta pergunta já tem uma resposta aceita. Gostaria de documentar os problemas pelos quais passei e como finalmente consegui fazer funcionar, para que seja útil para alguém no futuro.
Em primeiro lugar, eu estava usando
Theme.AppCompat.Light.DarkActionBar
como pai para o nossoAppTheme
. Isso significava que a solução @Gabriele Mariotti continuava travando com o erroCould not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehavior
. Consertei isso simplesmente mudando o pai paraTheme.MaterialComponents.Light.DarkActionBar
. Isso não afetou nosso tema de forma alguma, mas o RTE tinha acabado. Você também pode corrigir esse problema simplesmente incluindo os itens necessários ao seu estilo. Mas não me incomodei em descobrir quais estilos eram exigidos por BottomSheetBehavior.Em segundo lugar, tente como eu poderia, mas não consegui obter o layout real do Frame (que era o BottomSheetDialogFragment) usado para ter cantos arredondados. Percebi que definir isso para uma imagem Drawable funcionou, mas não com uma forma ou a
@null
. Acontece que era porque o queLinearLayout
eu estava usando tinha um fundo definido. Isso estava substituindo qualquer pano de fundo no estilo. Removendo isso finalmente resultou em cantos arredondados.Além disso, não exigi que nenhuma forma de fundo fosse definida para arredondar os cantos. A solução da @Gabriele Mariotti funcionou assim que fiz as alterações acima. No entanto, para definir a cor de fundo como eu queria, tive que substituir o item "backgroundTint".
PS: Eu sou novo no Android dev e estou mantendo um aplicativo antigo que foi feito para uso interno em nossa faculdade. Não estou muito familiarizado com o sistema de layout do Android ou com a biblioteca de materiais. Acho que é por isso que demorei 3 dias para descobrir isso. Espero que isso seja útil para alguém no futuro.
fonte
Funcionou para mim
crie uma forma chamada shape_rounded_dialog
adicione os estilos abaixo
Na classe DialogFragment, a substituição do método getTheme também retorna o estilo Yourself.
fonte
Outra maneira de corrigir esse problema é estender BottomSheetDialog e criar uma classe personalizada que atenda às suas necessidades. Você pode fazer o mesmo para o arquivo xml de layout e adicionar plano de fundo ou quaisquer outras personalizações necessárias. Isso também tem a vantagem de você não depender dos nomes de id usados pelo Android (android.support.design.R.id.design_bottom_sheet), enquanto altera o plano de fundo (embora a alteração do nome de id raramente aconteça AFAIK).
fonte
Crie um drawable personalizado com canto arredondado e defina-o como plano de fundo da raiz do layout de BottomSheetDialogFragment
Em seguida, basta adicionar o código abaixo à sua classe BottomSheetDialogFragment
Você pode até brincar com os parâmetros para definir a margem como abaixo
fonte
Você deve alterar o
bottom sheet theme
para obter o layout da rodada superiorCrie um drawable background_bottom_sheet_dialog_fragment.xml personalizado:
Em seguida, substitua bottomSheetDialogTheme em styles.xml usando o drawable como plano de fundo:
Isso mudará o layout de fundo de sua folha inferior
BottomSheetDialog
fonte
adicionar forma com canto arredondado, torná-lo plano de fundo para seu layout de raiz
tornar o fundo transparente em seu BottomSheetDialogFragment
seu trabalho para Contraintlayout, Framelyaout, Linearlayout, Relativelayout.
fonte