[Android]AlertDialogチックなカスタムDialogFlagment作った

スポンサーリンク

目的

タイトル/メッセージ/ネガポジボタンを有したダイアログを作りたい。

AlertDialogでいいじゃん!って感じだけど、デザインと異なるっていう理由でカスタム汎用的なカスタムDialogFragmentを作る羽目に。

ダイアログクラスのベースはこの記事で書いたやつ。

実装

レイアウト

styleとか使ってるけど、適宜修正してもらえればとw

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/background"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/dialogBackground"
    tools:ignore="SpUsage">

    <LinearLayout
        android:id="@+id/dialogTopLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="@dimen/margin_dialog"
        android:background="@drawable/bg_white_round"
        android:orientation="vertical"
        android:padding="@dimen/padding_dialog">

        <TextView
            android:id="@+id/titleTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/margin_dialog_contents_vertical"
            android:textColor="@color/baseBlack"
            android:textSize="@dimen/font_size_17dp"
            android:textStyle="bold"
            tools:text="タイトル" />


        <TextView
            android:id="@+id/messageTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/margin_dialog_contents_vertical"
            android:textColor="@color/black600"
            android:textSize="@dimen/font_size_14dp"
            android:textStyle="bold"
            tools:text="メッセージ" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="end"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/negativeButton"
                style="@style/button_small_primary"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="@dimen/padding_dialog"
                android:visibility="gone"
                tools:text="@string/close"
                tools:visibility="visible" />

            <TextView
                android:id="@+id/positiveButton"
                style="@style/button_small_primary"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/close" />

        </LinearLayout>
    </LinearLayout>
</FrameLayout>

ダイアログクラス

//
class SimpleDialogFragment : FullScreenDialogBaseFragment() {

    companion object {
        const val tag = "SimpleDialogFragment"
        /**
         * requestCodeをクリック時に返します。
         * positiveLabelがnullの場合は「閉じる」ボタンを表示し、他のものがnullの場合は非表示にします。
         */
        @JvmStatic
        fun newInstance(
            requestCode: Int,
            title: String? = null, msg: String? = null,
            positiveLabel: String? = null, negativeLabel: String? = null
        ) = SimpleDialogFragment().apply {
            arguments = Bundle().apply {
                putInt(SimpleDialogFragment::requestCode.name, requestCode)
                putString(SimpleDialogFragment::title.name, title)
                putString(SimpleDialogFragment::msg.name, msg)
                putString(SimpleDialogFragment::positiveLabel.name, positiveLabel)
                putString(SimpleDialogFragment::negativeLabel.name, negativeLabel)
            }
        }
    }

    interface OnSimpleDialogClickListener {
        fun onSimpleDialogPositiveClick(requestCode: Int)
        fun onSimpleDialogNegativeClick(requestCode: Int)
    }

    var listener: OnSimpleDialogClickListener? = null
    private var requestCode: Int by Arguments()
    private var title: String? by Arguments()
    private var msg: String? by Arguments()
    private var positiveLabel: String? by Arguments()
    private var negativeLabel: String? by Arguments()

    override fun onAttach(context: Context) {
        super.onAttach(context)

        // Fragment優先
        val fragment = targetFragment
        if (fragment is OnSimpleDialogClickListener) {
            listener = fragment
        } else if (context is OnSimpleDialogClickListener) {
            listener = context
        }
    }

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


        return inflater.inflate(R.layout.dialog_simple, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        dialogTopLayout.setOnTouchListener { _, _ -> true }

        // タイトル
        titleTextView.text = title
        // メッセージ
        messageTextView.text = msg
        // ポジティブボタン
        if (!positiveLabel.isNullOrEmpty()) {
            positiveButton.text = positiveLabel
        }
        // ネガティブボタン
        if (!negativeLabel.isNullOrEmpty()) {
            negativeButton.text = negativeLabel
            negativeButton.visibility = View.VISIBLE
            negativeButton.setOnClickListener {
                listener?.onSimpleDialogNegativeClick(requestCode)
                dismiss()
            }
        }
        positiveButton.setOnClickListener {
            listener?.onSimpleDialogPositiveClick(requestCode)
            dismiss()
        }
    }

}

by Arguments()とかあまり見慣れないだろうもの出てくるけど、こちらの記事で書いてます。

使い方の一例

SimpleDialogFragment.newInstance(
    requestCode = 100,
    title = "タイトルですよ",
    msg = "メッセージですよ",
    positiveLabel = "ポジラベル",
    negativeLabel = "ネガラベル"
).show(supportFragmentManager, SimpleDialogFragment.tag)

見た目

タイトルとURLをコピーしました