カスタムDialogFragmentをFragment上で透明にすることはできません


97

(画面全体を占める)フラグメント上にダイアログを作成する必要があります。ダイアログは、フラグメントがフラグメントの外側で暗くなった状態でフラ​​グメントの上に配置されるフローティングダイアログである必要があります。

カスタムダイアログの場合、カーブしたエッジを持つ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は、android:backgroungが#000000に設定された単なるLinearLayoutです

これはカスタムダイアログの私のスタイルです

<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時間費やしました。他の誰かが手伝ってくれることを願っています...

回答:


301

試す

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

あなたDialogFragmentonCreateView


5
:あなたはまた、半透明の黒色の背景(調光)を削除し、この答えをチェックしたい場合がありますstackoverflow.com/a/33800422/2115904
アンドリー・バ

4
すべてのマージンも削除します。ダイアログは全幅に拡大されます。
2016年

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);代わりに呼び出すことができます。これが例外を呼び出さないようにするにDialogFragmentdialogFragment.show(...);、FragmentTransactionのではなく、メソッドを介してfromアクティビティまたはフラグメントを呼び出す必要がありますadd
CoolMind

2
誰かがKotlinスニペットを探している場合は、次のようになりdialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))ます。
FrancisLaclé19年

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フォルダー(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

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 Builderを使用している人は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();
    }

ありがとう、これは私が探していたものです。
Milad Faridnia

3

あなたがしたいならこれを試してください:

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

0

承認された回答ごと、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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.