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

Tolga E.
źródło

Odpowiedzi:

304

Próbować

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

w swoim DialogFragment„sonCreateView

Płyta CD
źródło
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();
sahar
źródło
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);
}
}
Ameen Maheen
źródło
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

Sanghyun Byun
źródło
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

user3193413
źródło
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;
   }
Nanda Gopal
źródło
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);
    }
NickUnuchek
źródło
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();
    }
Hesam
źródło
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);
}
Kitesurfer
źródło
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
}
the_prole
źródło