Não é possível tornar o DialogFragment personalizado transparente sobre o Fragment

98

Preciso criar um diálogo sobre um fragmento (que ocupa toda a tela). O diálogo precisa ser um diálogo flutuante que será posicionado sobre o fragmento com o fragmento escurecido fora do fragmento.

Para a caixa de diálogo personalizada, eu tenho um linearLayout que possui bordas curvas, não importa o que eu faça, a caixa de diálogo tem uma borda preta em todos os lados (muito pequena). Eu tentei de tudo para torná-lo transparente e desaparecer (para que todo o diálogo seja apenas o layout linear - caixa curva)

Para o DialogFragment, é isso que eu tenho para onCreateView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    LinearLayout layout =(LinearLayout)inflater.inflate(R.layout.custom_dialog, null);
    LinearLayout item = (LinearLayout)layout.findViewById(R.id.display_item);
    populateItemData(item, inflater);
    return layout;
}

custom_dialog é apenas um LinearLayout que tem android: backgroung definido como # 000000

Este é o meu estilo para o diálogo personalizado

<style name="CustomDialog" parent="android:style/Theme.Dialog">
    <item name="android:windowBackground">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:alwaysDrawnWithCache">false</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

Eu tentei todos os tipos de combinações neste estilo (pelo que vi online) e não consigo me livrar daquela borda preta irritante, posso pintá-la de branco ou de qualquer outra cor se definir o fundo LinearLayout para qualquer outra coisa que não # 000000 ...

Eu gastei literalmente 3-4 horas nisso, espero que alguém possa ajudar ...

Tolga E
fonte

Respostas:

302

Experimentar

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

em seus DialogFragment'sonCreateView

CD
fonte
5
você também pode remover o fundo preto semitransparente (escurecimento), verifique esta resposta: stackoverflow.com/a/33800422/2115904
Andriy Bas
4
Remove todas as margens também. A caixa de diálogo é expandida para a largura total.
Uday
1
E isso vai causar uma exceção: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference.
CoolMind de
1
Além disso, você pode ligar em getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);vez disso. Para não invocar uma exceção, você deve chamar um método DialogFragmentfrom Activity ou Fragment dialogFragment.show(...);, não FragmentTransaction's add.
CoolMind de
2
No caso de alguém está olhando para o Kotlin trecho, aqui está: dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)).
Francis Laclé
24

Tente isto ( como eu crio um DialogFragment 100% personalizado ) este trabalho para o diálogo

    Dialog dialog = new Dialog(getActivity());

    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

    dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);      

        // layout to display
    dialog.setContentView(R.layout.add_edit);

    // set color transpartent
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    dialog.show();
Sahar
fonte
15

Defina o seu tema assim funcionou para mim

<style name="MyDialog" parent="Base.Theme.AppCompat.Light.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

E em seu fragmento de diálogo definido assim

public class Progress extends DialogFragment {


int style = DialogFragment.STYLE_NO_TITLE;
int theme = R.style.MyDialog;

public Progress() {
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(style, theme);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.progress, container, false);
}
}
Ameen Maheen
fonte
11

No onActivityCreated

getDialog().getWindow().getAttributes().alpha = 0.9f; // An alpha value to apply to this entire window. An alpha of 1.0 means fully opaque and 0.0 means fully transparent

para DialogFragmenttransparente

Sanghyun Byun
fonte
8

Para uso completamente transparente: setStyle (DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

Para o plano de fundo personalizado -crie um arquivo de estilo em sua pasta de valores (values ​​/ style.xml) e use-o: setStyle (DialogFragment.STYLE_NO_FRAME, yourpackagename.R.style.YOURE_CUSTOM_STYLE);

em seu arquivo de estilo, substitua o atributo: android: windowBackground para ser @ color / DialogBackgroundBlackSemiTransparent

user3193413
fonte
7

Você pode conseguir, adicionando isso em Fragmento de diálogo ou BottomSheetDialogFragment

No onCreateDialogMétodo

@Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
       Dialog dialog = super.onCreateDialog(savedInstanceState);
       dialog.getWindow().setGravity(Gravity.BOTTOM);
       dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
       dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
       return dialog;
   }
Nanda Gopal
fonte
setBackgroundDrawableResourcee clearFlagsfunciona para mim (kotlin, android api v28)
Wesely,
6
<style name="BaseDialogTheme" parent="Base.Theme.AppCompat.Light.Dialog">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="colorControlNormal">@color/colorAccent</item>
    <item name="colorControlActivated">@color/colorAccent</item>

    <item name="android:windowFullscreen">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:colorBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>


    <item name="android:windowIsFloating">true</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:windowActionModeOverlay">false</item>
    <item name="android:windowCloseOnTouchOutside">true</item>
    <item name="android:backgroundDimAmount">.00</item>//this line is changed alpha from 1.0 to 0.0(full transparent) 

</style>



@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_FRAME, R.style.BaseDialogTheme);
    }
NickUnuchek
fonte
4

Aqueles que estão usando o construtor AlertDialog em onCreateDialogvez de onCreateViewpodem atribuir um tema como o código a seguir. Conjunto completo de temas pode ser encontrado em R.style . Não se esqueça de que alguns deles são suportados recentemente e não estão disponíveis em aparelhos antigos.

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_Translucent);
        View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_album, null);
        builder.setView(view);

        return builder.create();
    }
Hesam
fonte
Obrigado, isso é o que eu estava procurando.
Milad Faridnia
3

Experimente se você gosta de:

public TransparentDialog()
{
    super();
    setStyle(STYLE_NO_FRAME, R.style.AppTheme);
}
Kitesurfer
fonte
0

Por resposta aceita, em Kotlin

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    var v = super.onCreateView(inflater, container, savedInstanceState)
    dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    return v
}
the_prole
fonte