Nie można ustawić przezroczystości niestandardowego DialogFragment na fragmencie


99

Muszę utworzyć okno dialogowe na fragmencie (który zajmuje cały ekran). Okno dialogowe musi być pływającym oknem dialogowym, które zostanie umieszczone nad fragmentem z przyciemnionym fragmentem poza fragmentem.

W przypadku niestandardowego okna dialogowego mam linearLayout, który ma zakrzywione krawędzie, bez względu na to, co robię, okno dialogowe ma czarne obramowanie ze wszystkich stron (bardzo małe). Próbowałem wszystkiego, aby było przezroczyste i zniknęło (tak, że całe okno dialogowe to tylko układ liniowy - zakrzywione pudełko)

W przypadku DialogFragment mam to dla 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 to po prostu LinearLayout, który ma android: backgroung ustawiony na # 000000

To jest mój styl dla niestandardowego okna dialogowego

<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>

Próbowałem różnych kombinacji w tym stylu (z tego, co widziałem online) i nie mogę pozbyć się tej denerwującej czarnej obwódki, mogę pomalować ją na biało lub na dowolny inny kolor, jeśli ustawię tło LinearLayout na cokolwiek innego niż # 000000 ...

Spędziłem nad tym dosłownie 3-4 godziny, mam nadzieję, że ktoś inny może pomóc ...

Odpowiedzi:


304

Próbować

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

w swoim DialogFragment„sonCreateView


5
możesz również chcieć usunąć półprzezroczyste czarne tło (ściemnianie), sprawdź tę odpowiedź: stackoverflow.com/a/33800422/2115904
Andriy Bas

4
Usuwa również wszystkie marginesy. Okno dialogowe zostaje rozszerzone do pełnej szerokości.
Uday

1
I spowoduje to wyjątek: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference.
CoolMind

1
getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);Zamiast tego możesz też zadzwonić . Aby nie wywoływało to wyjątku, należy wywołać metodę DialogFragmentfrom Activity lub Fragment za pomocą dialogFragment.show(...);metody, a nie FragmentTransaction add.
CoolMind

2
W przypadku, gdy ktoś patrzy na Kotlin fragmencie, to jest tutaj: dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)).
Francis Laclé,

24

Spróbuj tego ( jak utworzyć w 100% niestandardowy DialogFragment ) to działa dla okna dialogowego

    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();

15

Ustaw swój motyw tak, aby działał dla mnie

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

A w twoim fragmencie okna dialogowego ustaw w ten sposób

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);
}
}

11

W 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

dla DialogFragmentprzezroczystych


8

Do całkowicie przezroczystego użycia: setStyle (DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

Dla niestandardowego tła - utwórz plik stylu w folderze wartości (values ​​/ style.xml) i użyj go: setStyle (DialogFragment.STYLE_NO_FRAME, nazwa_pakietu.R.style.YOURE_CUSTOM_STYLE);

w pliku stylu zastąp atrybut: android: windowBackground na @ color / DialogBackgroundBlackSemiTransparent


7

Możesz to osiągnąć, dodając to w Dialog Fragment lub BottomSheetDialogFragment

W onCreateDialogmetodzie

@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;
   }

setBackgroundDrawableResourcei clearFlagsdziała dla mnie (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);
    }

4

Ci, którzy używają konstruktora AlertDialog onCreateDialogzamiast, onCreateViewmogą przypisać motyw, taki jak następujący kod. Kompletny zestaw motywów można znaleźć w R.style . Nie zapominaj, że niektóre z nich były ostatnio obsługiwane i nie są dostępne na starych telefonach.

@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();
    }

Dzięki, właśnie tego szukałem.
Milad Faridnia

3

Spróbuj tego, jeśli chcesz:

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

0

Za zaakceptowaną odpowiedź w Kotlinie

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
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.