58

丸い角を持ち、画面の幅を埋めないレイアウトのカスタムフラグメントダイアログを作成しています(コンテンツをラップしただけの場合が望ましいです)。

これは私rounded_dialog.xmlの描画可能なフォルダでありThemeWithCorners、ダイアログの背景としてカスタムによって呼び出されます。また、コンテンツを作成する線形レイアウトの背景として設定しようとしましたが、何も機能しません。

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" 
>
<solid android:color="@android:color/white"/>
<corners android:radius="20dp"
/>
</shape>

これが私がダイアログを呼び出す方法です:

final String FTAG = "TAG_FRAGMENT_DIALOG_CALENDAR";
    dialog = (CalendarDialog) fm.findFragmentByTag(FTAG);
    ft = fm.beginTransaction();
    if (dialog != null)
    {
        ft.remove(dialog);
    }
    dialog = CalendarDialog.newInstance(this);      
    dialog.setCancelable(true);

    ft.add(dialog, FTAG);
    ft.show(dialog);
    ft.commit();

ダイアログのonCreateメソッドで、スタイルとテーマを設定します。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.ThemeWithCorners);      
}

これはonCreateViewメソッドです。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
getDialog().setCanceledOnTouchOutside(true);
v = (MyCalendar)inflater.inflate(R.layout.calendar_dialog, container, true)
    return v;
}

SOに関する他の回答が示唆したように、これをonCreateDialogメソッドに追加しようとしましたが、どちらも機能しませんでした。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
    Dialog d =  super.onCreateDialog(savedInstanceState);
    LayoutParams lp=d.getWindow().getAttributes();
    d.getWindow().setBackgroundDrawable(new ColorDrawable(0));
    lp.width=-2;lp.height=-2;lp.gravity=Gravity.CENTER;
    lp.dimAmount=0;            
    lp.flags=LayoutParams.FLAG_LAYOUT_NO_LIMITS | LayoutParams.FLAG_NOT_TOUCH_MODAL;

    return d;
}

要約すると、画面の幅を100%にするのではなく、角を丸くしたいのですが、コンテンツをラップするのが望ましいです。お願いします、お願いします、私はいくつかの助けが必要です、私はこれについて本当に必死です、私は何日もそれを試してみました!

4

8 に答える 8

124

ダイアログの背景: dialog_rounded_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@android:color/white" />
    <corners android:radius="12dp" />
</shape>

ダイアログレイアウト: dialog_rounded.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/dialog_rounded_bg"
    android:minWidth="260dp"
    android:orientation="vertical"
    android:padding="24dp">
    ...
</LinearLayout>

ダイアログフラグメント: RoundedDialog.java

public class RoundedDialog extends DialogFragment {
    ...
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_rounded, container, false);
        // Set transparent background and no title
        if (getDialog() != null && getDialog().getWindow() != null) {
            getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        }
        return view;
    }
    ...
}

丸みを帯びたダイアログ

更新:Window.FEATURE_NO_TITLEフラグを設定しない場合、Android≤4.4のデバイスではダイアログの上部に青い線が表示されます。

于 2017-07-04T18:23:09.487 に答える
54

まあ、私はちょうど解決策を見つけました、しかし私はそれで本当に満足していません。

次のようにダイアログの背景(rounded_dialog.xml)を設定します。

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/transparent"/>
<corners android:radius="10dp" />
<padding android:left="10dp" android:right="10dp"/>
</shape>

次に、これを以下の「onCreateView」メソッドのダイアログに設定します。このコードでは、背景が透明であるため、角を丸くする必要はありませんが、ダイアログは実際には画面と同じ幅であるため、パディングは重要ですが、パディングによってそうではないように見えます。

getDialog().getWindow().setBackgroundDrawableResource(R.drawable.rounded_dialog);

そして最後に、ダイアログのコンポーネントの背景を、コーナーを丸くする別のカスタムドローアブルに設定しました。上部にRelativeLayout、下部にTextViewを持つLinearLayoutがあるので、@ nullを親LinearLayoutに設定し、2つの異なるカスタムドローアブルを2つの部分に設定します。1つはbottomCornersを丸め、もう1つはtopCornersを丸めます。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" 
android:background="@drawable/title_round"  
>

<RelativeLayout
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"        
    android:orientation="horizontal" 
    android:background="@drawable/blue_title_round_top"
    android:paddingTop="4dp"
    android:paddingBottom="4dp"
    >
<TextView 
    android:id="@+id/calendarHint"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/rounded_bottom"
    android:layout_gravity="center"
    android:gravity="center"
        />
</LinearLayout>

これは視覚的には正しく、実際には機能的には正しくありませんが、この場合は十分に正しいため、これにはより適切な解決策があると思います。

于 2013-03-15T00:23:17.327 に答える
7

KotlinとViewBindingで2022年の回答を更新-

class InternetLostDialog : DialogFragment() {

    private lateinit var binding: DialogInternetLostBinding

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        binding = DialogInternetLostBinding.inflate(LayoutInflater.from(context))
        val builder = AlertDialog.Builder(requireActivity())
        isCancelable = false
        builder.setView(binding.root)
        binding.root.setOnClickListener {
            requireActivity().finish()
        }
        val dialog = builder.create()
        dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
        return dialog
    }

}
于 2020-08-23T08:32:04.713 に答える
3

別の方法:
メソッドで 使用setStyle()して、にスタイルを適用します。次に、ファイルのルートビューでいつもと同じように使用できます。onCreate()DialogFragment
android:backgroundyour_layout.xml


手順:

  1. style.xmlファイル(resフォルダー内):
<style name="DialogTheme_transparent" parent="Theme.AppCompat.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <!--You can set other style items also, such as animations and etc-->
</style>
  1. レイアウトフォルダyour_layout.xmlにファイルを作成します:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="8dp"
    android:background="@drawable/bg_corner_dialog">
    ...
</LinearLayout>
  1. ドローアブルフォルダbg_corner_dialog.xmlにファイルを作成します。
<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:dither="true">
    <solid android:color="#ffffff"/>
    <corners android:radius="16dp"/>
</shape>
  1. 最後に適用stylelayout、あなたにDialogFragment
public class CustomDialogFragment extends DialogFragment {
    ...

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_TITLE, R.style.DialogTheme_transparent);
        ...
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.your_layout, container, false);
        ButterKnife.bind(this, v);
        //init UI Elements...
        return v;
    }

}

これがお役に立てば幸いです。
幸運をお祈りしています

于 2019-10-10T19:47:06.787 に答える
1

Kotlinを使用して機能する更新されたソリューション。

次のようにダイアログの背景(rounded_dialog.xml)を設定します。

    <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="28dp" />
    <solid android:color="@color/white"/>
</shape>

次に、プログラムで画面幅を計算し、このコードスニペットを使用して、画面幅からマージン値を減算します。

val displayMetrics = DisplayMetrics()
        requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics)
        val width = displayMetrics.widthPixels

次に、onStartコールバック内で、その幅からマージンを引いたものを適用しました。これが完全なコードです。

@AndroidEntryPoint
class CancelDialogFragment : DialogFragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        if (dialog != null && dialog?.window != null) {
            dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT));
            dialog?.window?.requestFeature(Window.FEATURE_NO_TITLE);
        }
        return inflater.inflate(R.layout.fragment_cancel_dialog, container, false)
    }

    override fun onStart() {
        super.onStart()
        val displayMetrics = DisplayMetrics()
        requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics)

        val width = displayMetrics.widthPixels
        val height = displayMetrics.heightPixels

        dialog?.window?.setLayout(width-64, ViewGroup.LayoutParams.WRAP_CONTENT)
    }


}

XMLレイアウトfragment_cancel_dialog

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingVertical="32dp"
    android:padding="8dp"
    android:layout_marginHorizontal="8dp"
    android:background="@drawable/rounded_dialog"
    tools:context=".ui.orders.CancelDialogFragment">


    <TextView
        android:id="@+id/textView9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Reason of cancellation"
        android:textSize="16sp"
        app:layout_constraintStart_toStartOf="@+id/firstNameTIL"
        app:layout_constraintTop_toTopOf="parent" />


    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/firstNameTIL"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginHorizontal="24dp"
        android:layout_marginTop="16dp"
        app:hintAnimationEnabled="false"
        app:hintEnabled="false"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView9">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/firstNameET"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/edit_text_bg"
            android:drawablePadding="12dp"
            android:inputType="textPersonName"
            android:paddingHorizontal="16dp"
            android:paddingVertical="16dp"
            android:textAlignment="viewStart"
            android:textColor="@color/textColor"
            android:textColorHint="@color/black" />
    </com.google.android.material.textfield.TextInputLayout>


    <Button
        android:id="@+id/signUpButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="32dp"
        android:background="@drawable/button_bg"
        android:paddingHorizontal="56dp"
        android:text="@string/confirmStr"
        android:textAllCaps="false"
        android:inputType="text"
        android:textColor="@color/black"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/firstNameTIL" />


</androidx.constraintlayout.widget.ConstraintLayout>

ここに画像の説明を入力してください

于 2021-05-14T21:13:03.880 に答える
0

カードビューをレイアウトのルートとして作成し、onCreateView()に以下のコードを追加すると、角が丸くなると思います。alertDialog.getWindow()。setBackgroundDrawableResource(android.R.color.transpare‌ nt)

于 2020-06-17T09:07:16.653 に答える
0

AlertDialogBu​​ilderを使用して背景を透明にし、XMLファイルでDrawableを設定したい方。

<style name="DialogStyle" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">

<item name="android:background">@drawable/dialog_background</item>
<item name="android:windowBackground">@android:color/transparent</item>

このテーマを以下のようにビルダーに設定します

private val builder: AlertDialog.Builder = AlertDialog.Builder(context,R.style.DialogStyle)
    .setView(dialogView)

R.drawable.dialog_backgroundはどこにありますか

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
    <shape android:shape="rectangle" android:padding="10dp">
        <solid
            android:color="@color/dialog_bg_color"/>
        <corners
            android:radius="30dp" />
    </shape>
</item>
于 2021-12-29T10:44:19.787 に答える
0

DialogFragmentのクイックフィックスがあります。たとえば、メソッドonCreateDialog()で、AlertDialog.Builder(context、style)にスタイルを追加します。

@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    View view = LayoutInflater.from(getActivity()).inflate(R.layout.custom_dialog_lauout, null);
    return new AlertDialog.Builder(getActivity(), R.style.custom_alert_dialog)
            .setView(view)
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int i) {
                    // do something
                }
            })
            .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            })
            .create();
}

スタイルフォルダ内 custom_alert_dialog

<style name="custom_alert_dialog" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:windowBackground">@drawable/corner_background</item>
</style>

ドローアブルフォルダ内corner_background.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<corners android:radius="8dp" />

ここに画像の説明を入力してください

API>=21でテスト済み

于 2022-02-07T18:04:54.617 に答える