国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

使用AlertDialog自定義布局,解決自定義控件的監(jiān)聽事件無效的辦法

2019-11-07 23:02:10
字體:
供稿:網(wǎng)友

使用AlertDialog自定義布局,解決自定義控件的監(jiān)聽事件無效的辦法

在很多情況下,Android自帶對(duì)話框的樣式滿足不了我們項(xiàng)目的需求,這時(shí)候我們可以采用為對(duì)話框設(shè)置自定義布局。如果直接用Dialog可能不會(huì)有什么問題,就是這樣 mDialog = new Dialog(this, R.style.custom_dialog);,然后按部就班(這里的第二個(gè)參數(shù),是我為dialog設(shè)置的一個(gè)主題樣式,主要就是一個(gè)進(jìn)出動(dòng)畫,大家可以無視)。不過如果用AlertDialog就麻煩不斷了,特別是很多人會(huì)遇到自定義布局里的控件明明設(shè)置了監(jiān)聽事件卻沒有效果的問題,這里我根據(jù)自己的總結(jié),來為大家提供一個(gè)解決辦法,如果大家還有其他的解決方案,歡迎交流。


自定義布局的代碼:(稍微有點(diǎn)長,無視就行)<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="80dp" android:background="@color/main_background" android:gravity="center_horizontal" android:paddingTop="30dp"> <ImageView android:focusable="true" android:clickable="true" android:id="@+id/xiangqing_dialog_weixin_pengyouquan" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:adjustViewBounds="true" android:scaleType="fitCenter" android:src="@drawable/xiangqing_weixin_pengyouquan"/> <ImageView android:focusable="true" android:clickable="true" android:id="@+id/xiangqing_dialog_weixin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:adjustViewBounds="true" android:scaleType="fitCenter" android:src="@drawable/xiangqing_weixin"/> <ImageView android:focusable="true" android:clickable="true" android:id="@+id/xiangqing_dialog_QQ" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:adjustViewBounds="true" android:scaleType="fitCenter" android:src="@drawable/xiangqing_qq"/> <ImageView android:focusable="true" android:clickable="true" android:id="@+id/xiangqing_dialog_qqkongjian" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:adjustViewBounds="true" android:scaleType="fitCenter" android:src="@drawable/xiangqing_qqkongjain"/> <ImageView android:focusable="true" android:clickable="true" android:id="@+id/xiangqing_dialog_weibo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.00" android:adjustViewBounds="true" android:scaleType="fitCenter" android:src="@drawable/xiangqing_weibo"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/main_background" android:paddingBottom="20dp" android:paddingTop="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.7" android:gravity="center" android:text="@string/pengyouquan" android:textSize="16dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.8" android:gravity="center" android:text="@string/weixin" android:textSize="16dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.8" android:gravity="center" android:text="@string/qq" android:textSize="16dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="@string/qqkongjian" android:textSize="16dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="@string/weibo" android:textSize="16dp"/> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/color自定義對(duì)話框效果是這樣的: 這里寫圖片描述


接下來就是Activity加載的主布局,很簡單,就一個(gè)Button,用來點(diǎn)擊產(chǎn)生對(duì)話框,就是調(diào)用下面的showDialog()方法,布局文件在這里就不給了。還要說一下的是,我們就只給上面的取消按鈕設(shè)置一個(gè)點(diǎn)擊取消對(duì)話框的監(jiān)聽事件。
重點(diǎn)在這里,showDialog()方法的代碼:private void showDialog() { if (alertDialog == null) { View view = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null); AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.custom_dialog); alertDialog =builder.setView(view).setCancelable(true).create(); Window window = alertDialog.getWindow(); WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; window.setAttributes(layoutParams); window.setGravity(Gravity.BOTTOM); alertDialog.setContentView(view); view.findViewById(R.id.quxiao).setOnClickListener(this); } alertDialog.show(); }builder一定要調(diào)用builder.setView(view),不然對(duì)話框直接顯示不了,即使你后面調(diào)用了alertDialog.setContentView(view) 或者是alertDialog.setContentView(R.layout.custom_dialog)。后面的 alertDialog.setContentView(view)這一行代碼在某些情況是不需要加的,因?yàn)槟愕腷uilder已經(jīng)加載了布局了,這里寫了讓大家看一下,后面有講。

接下來就是如何找自定義布局里的控件對(duì)象了,首先明確一點(diǎn)就是用this.findViewById是不行的,因?yàn)樵贏ctivity里是找不到你對(duì)話框的控件的,會(huì)報(bào)空指針錯(cuò)誤。接下來我們有很多辦法可以找到控件對(duì)象,比alertDialog.findViewByIdwindow.findViewByIdview.findViewById,這里比較關(guān)鍵,首先view.findViewById是可以正確找到控件對(duì)象并且成功設(shè)置監(jiān)聽 。如果你代碼里寫了剛才我說的alertDialog.setContentView(view),那么這樣alertDialog.findViewByIdwindow.findViewById也可以正確找到控件對(duì)象并且成功設(shè)置監(jiān)聽 。

其實(shí)很好理解,只為builder設(shè)置布局的話,相當(dāng)于alertDiglog沒有為其設(shè)置布局文件,所以alertDialog和window怎么可能正確的為控件設(shè)置監(jiān)聽呢。保險(xiǎn)起見,咱們就寫上alertDialog.setContentView(view),那上面三種方式就都可以正確的設(shè)置監(jiān)聽了。


這里就是取消按鈕的監(jiān)聽事件代碼: private void dismissDialog() { if (alertDialog != null && alertDialog.isShowing()) { alertDialog.dismiss(); } }

點(diǎn)擊取消對(duì)話框。


到這里就結(jié)束了,這些問題不難,但有可能會(huì)卡住人,說清楚了大家就懂了,源碼什么的也就不需要了,希望能幫到大家。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 和平县| 榆中县| 娱乐| 肥东县| 资中县| 临湘市| 潜江市| 济源市| 南平市| 东光县| 泗洪县| 清流县| 英德市| 玉环县| 义马市| 兴国县| 青岛市| 错那县| 潮州市| 方山县| 安图县| 牟定县| 措美县| 嘉祥县| 台中县| 镇平县| 思茅市| 新密市| 黔西县| 垣曲县| 合川市| 琼结县| 蓝田县| 保山市| 长顺县| 阿克苏市| 册亨县| 楚雄市| 丹棱县| 沁水县| 乐安县|