Не удается сделать пользовательский DialogFragment прозрачным над фрагментом - PullRequest
87 голосов
/ 08 ноября 2011

Мне нужно создать диалог над фрагментом (который занимает весь экран).Диалог должен быть плавающим диалогом, который будет располагаться поверх фрагмента с фрагментом, затемненным за пределами фрагмента.

Для пользовательского диалога у меня есть linearLayout с изогнутыми краями, независимо от того, что ясделать, диалоговое окно имеет черное окаймление со всех сторон (очень маленькое).Я перепробовал все, чтобы сделать его прозрачным и уйти (так что весь диалог - это просто линейный макет - изогнутая коробка)

Для DialogFragment это то, что я имею для 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 - это просто LinearLayout, в котором для android: backgroung установлено значение # 000000

Это мой стиль для пользовательского диалога

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

Я пробовал все виды комбинаций в этом стиле(из того, что я видел в Интернете), и я не могу избавиться от этой надоедливой черной окантовки, я могу покрасить ее в белый или любой другой цвет, если для фона LinearLayout установить значение, отличное от # 000000 ...

Я потратил буквально 3-4 часа на это, я надеюсь, что кто-то еще может помочь ...

Ответы [ 9 ]

268 голосов
/ 16 февраля 2012

Попробуйте

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

в ваших DialogFragment onCreateView

21 голосов
/ 12 февраля 2013

Попробуйте это ( Как создать 100% пользовательский DialogFragment ) эта работа для диалога

    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();
9 голосов
/ 01 марта 2016

Установите вашу тему так, как это работает для меня

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

И в вашем диалоговом фрагменте установите так

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);
}
}
9 голосов
/ 27 ноября 2014

В 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

для DialogFragment прозрачный

6 голосов
/ 15 июня 2015

Для полностью прозрачного использования: setStyle (DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

Для пользовательского фона - создайте файл стиля в папке значений (values ​​/ style.xml) и используйте его: setStyle (DialogFragment.STYLE_NO_FRAME, yourpackagename.R.style.YOURE_CUSTOM_STYLE);

в вашем файле стиля переопределяет атрибут: android: windowBackground должно быть @ color / DialogBackgroundBlackSemiTransparent

3 голосов
/ 16 октября 2013

Те, кто использует AlertDialog Builder в onCreateDialog вместо onCreateView, могут назначить тему следующим образом Полный набор тем можно найти по R.style . Не забывайте, что некоторые из них поддерживаются в последнее время и недоступны на старых телефонах устройств.

@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();
    }
2 голосов
/ 11 апреля 2018

Вы можете достичь, добавив это в Фрагмент диалога или BottomSheetDialogFragment

В onCreateDialog Метод

@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;
   }
2 голосов
/ 14 января 2018
<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);
    }
1 голос
/ 29 декабря 2012

Попробуйте, если хотите:

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