DialogFragment的簡單使用

1.來源

DialogFragment類最初是通過Android3.0(API級別11)添加的,官方推薦您應(yīng)該將?DialogFragment?用作對話框的容器。DialogFragment?類提供您創(chuàng)建對話框和管理其外觀所需的所有控件,而不是調(diào)用?Dialog?對象上的方法。

2.好處

使用?DialogFragment?管理對話框可確保它能正確處理生命周期事件,如用戶按“返回”按鈕或旋轉(zhuǎn)屏幕時。 此外,DialogFragment?類還允許您將對話框的 UI 作為嵌入式組件在較大 UI 中重復(fù)使用,就像傳統(tǒng)?Fragment?一樣(例如,當(dāng)您想讓對話框 UI 在大屏幕和小屏幕上具有不同外觀時)。

3.注意事項(xiàng)

注:由于?DialogFragment?類最初是通過 Android 3.0(API 級別 11)添加的,因此本文描述的是如何使用支持庫附帶的?DialogFragment?類。 通過將該庫添加到您的應(yīng)用,您可以在運(yùn)行 Android 1.6 或更高版本的設(shè)備上使用?DialogFragment?以及各種其他 API。如果您的應(yīng)用支持的最低版本是 API 級別 11 或更高版本,則可使用?DialogFragment?的框架版本,但請注意,本文中的鏈接適用于支持庫 API。 使用支持庫時,請確保您導(dǎo)入的是?android.support.v4.app.DialogFragment?類,而不是?android.app.DialogFragment。

4.使用

1.如何顯示一個dialog出來

onCreateDialog中可以通過AlertDialogAPl創(chuàng)建多種列表(傳統(tǒng)單選列表,永久性單選列表(單選按鈕),永久性多選列表(復(fù)選框)),也可以自定義布局....? 至于具體用法讀者可以自行百度

class FireMissilesDialogFragment : DialogFragment() {

? ? override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

? ? ? ? val builder = AlertDialog.Builder(activity)? //import android.app.Dialog

? ? ? ? val inflater = activity!!.layoutInflater

? ? ? ? builder.setView(inflater.inflate(R.layout.dialog_signin, null))

? ? ? ? ? ? ? ? .setPositiveButton("確定", DialogInterface.OnClickListener() { dialog, id ->


? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? .setNegativeButton("取消", DialogInterface.OnClickListener() { dialog, id ->


? ? ? ? ? ? ? ? })

? ? ? ? return builder.create()

? ? }

}

在Activity中使用

val dialogFragment = FireMissilesDialogFragment()

dialogFragment.show(supportFragmentManager, "1")

//or val sfb = supportFragmentManager.beginTransaction()

sfb.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE? ? )

dialogFragment.show(sfb,"1")

2.將事件傳遞回對話框的宿主

當(dāng)用戶觸摸對話框的某個操作按鈕或從列表中選擇某一項(xiàng)時,您的?DialogFragment?可能會自行執(zhí)行必要的操作,但通常您想將事件傳遞給打開該對話框的 Activity 或片段。 為此,請定義一個界面,為每種點(diǎn)擊事件定義一種方法。然后在從該對話框接收操作事件的宿主組件中實(shí)現(xiàn)該界面。

class FireMissilesDialogFragment : DialogFragment() {

? ? override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

? ? ? ? val builder = AlertDialog.Builder(activity)? //import android.app.Dialog

? ? ? ? val inflater = activity!!.layoutInflater

? ? ? ? builder.setView(inflater.inflate(R.layout.dialog_signin, null))

? ? ? ? ? ? ? ? .setPositiveButton("確定", DialogInterface.OnClickListener() { dialog, id ->

? ? ? ? ? ? ? mListener!!.onDialogPositiveClick(this)

? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? .setNegativeButton("取消", DialogInterface.OnClickListener() { dialog, id ->

? ? ? ? ? ? mListener!!.onDialogNegativeClick(this)

? ? ? ? ? ? ? ? })

? ? ? ? return builder.create()

? ? }

}

interface NoticeDialogListener {

? ? fun onDialogPositiveClick(dialog: DialogFragment)

? ? fun onDialogNegativeClick(dialog: DialogFragment)

}

var mListener: NoticeDialogListener? = null

override fun onAttach(context: Context?) {

? ? super.onAttach(context)

? ? try {

? ? ? ? // Instantiate the NoticeDialogListener so we can send events to the host

? ? ? ? mListener = activity as NoticeDialogListener

? ? } catch (e: ClassCastException) {

? ? ? ? // The activity doesn't implement the interface, throw exception

? ? ? ? throw ClassCastException(activity.toString() + " must implement NoticeDialogListener")

? ? }

}

由于宿主 Activity 會實(shí)現(xiàn)?NoticeDialogListener—由以上顯示的?onAttach()?回調(diào)方法強(qiáng)制執(zhí)行 — 因此對話框片段可以使用界面回調(diào)方法向 Activity 傳遞點(diǎn)擊事件

3.某些特殊情況下

您可能采用以下 UI 設(shè)計:您想讓一部分 UI 在某些情況下顯示為對話框,但在其他情況下全屏顯示或顯示為嵌入式片段(也許取決于設(shè)備使用大屏幕還是小屏幕)。DialogFragment?類便具有這種靈活性,因?yàn)樗匀豢梢猿洚?dāng)嵌入式?Fragment。

但在這種情況下,您不能使用?AlertDialog.Builder?或其他?Dialog?對象來構(gòu)建對話框。如果您想讓?DialogFragment?具有嵌入能力,則必須在布局中定義對話框的 UI,然后在?onCreateView()?回調(diào)中加載布局

1.使用

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

? ? ? ? val dialog = super.onCreateDialog(savedInstanceState)

? ? ? ? dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)

? ? ? ? return dialog

? ? }

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

? ? ? ? return inflater.inflate(R.layout.dialog_signin, container, false)

? ? }

? ? ? ? ? ? if (mIsLargeLayout) {

? ? ? ? ? ? ? ? dialogFragment.show(supportFragmentManager, "1")

? ? ? ? ? } else {

? ? ? ? ? ? ? val sfb = supportFragmentManager.beginTransaction()

? ? ? ? ? ? ? ? sfb.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)

? ? ? ? ? ? ? ? sfb.add(android.R.id.content, dialogFragment)

? ? ? ? ? ? ? ? ? ? ? ? .addToBackStack(null).commit()

? ? ? ? ? }

2.判斷大屏幕

在本示例中,mIsLargeLayout?布爾值指定當(dāng)前設(shè)備是否應(yīng)該使用應(yīng)用的大布局設(shè)計(進(jìn)而將此片段顯示為對話框,而不是全屏顯示)。 設(shè)置這種布爾值的最佳方法是聲明一個布爾資源值,其中包含適用于不同屏幕尺寸的備用資源值。 例如,以下兩個版本的布爾資源適用于不同的屏幕尺寸:

res/values/bools.xml

? ? false

res/values-large/bools.xml

?? true

然后,您可以在 Activity 的?onCreate()?方法執(zhí)行期間初始化?mIsLargeLayout?值:
var mIsLargeLayout = resources.getBoolean(R.bool.large_layout)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容