Не удается сделать настраиваемый DialogFragment прозрачным поверх фрагмента


99

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

Для настраиваемого диалогового окна у меня есть 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 часа, надеюсь, кто-то еще может помочь ...

Ответы:


304

Пытаться

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

в ваших DialogFragment«сonCreateView


5
вы также можете удалить полупрозрачный черный фон (затемнение), проверьте этот ответ: stackoverflow.com/a/33800422/2115904
Andriy Bas

4
Также удаляются все поля. Диалог расширен до полной ширины.
Удай

1
И это вызовет исключение: 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);вместо этого позвонить . Чтобы это не вызвало исключения, вы должны вызвать метод DialogFragmentfrom Activity или Fragment through dialogFragment.show(...);, а не FragmentTransaction add.
CoolMind

2
В случае , если кто - то ищет котлинского сниппета, вот это: dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)).
Фрэнсис Лакле

24

Попробуйте это ( как создать 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();

15

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

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

11

В 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прозрачных


8

Для полностью прозрачного использования: 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


7

Вы можете добиться этого, добавив это в Dialog Fragment или 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;
   }

setBackgroundDrawableResourceи clearFlagsу меня работает (kotlin, android api v28)
Wesely 02

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

Те, кто onCreateDialogвместо этого использует построитель AlertDialog, 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();
    }

Спасибо, это то, что я искал.
Милад Фаридния

3

Попробуйте это, если вам нравится:

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

0

За принятый ответ в Котлине

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
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.