Android使用Activity實(shí)現(xiàn)簡(jiǎn)單的可輸入對(duì)話框
1、需求分析
眾所周知,在應(yīng)用中這樣那樣的評(píng)論總是少不了的,有的應(yīng)用是在底部直接加一個(gè)EditText和一個(gè)Button,讓用戶輸入文字或者表情之后點(diǎn)擊按鈕提交;而有的雖然也放置了EditText,但僅僅是一個(gè)“擺設(shè)”,并不具備輸入功能,用戶點(diǎn)擊它后會(huì)彈出一個(gè)跳轉(zhuǎn)到一個(gè)可以真正編輯的頁(yè)面或者彈出一個(gè)可以輸入內(nèi)容的對(duì)話框。
比如下面這種效果:
這里的效果可以細(xì)分為四點(diǎn):
- 點(diǎn)擊底部的按鈕之后會(huì)彈出對(duì)話框,對(duì)話框在布局的底部;
- 對(duì)話框中有輸入框EditText,可以輸入內(nèi)容;
- 對(duì)話框彈出后EditText會(huì)自動(dòng)獲取焦點(diǎn),彈出軟鍵盤;
- 軟鍵盤會(huì)把對(duì)話框頂上去,便于用戶編輯。
一開(kāi)始我想到的是PopupWindow,但是由于里面有EditText,與軟鍵盤交互起來(lái)很是頭疼,于是改用了Activity。這樣一來(lái)我們就可以像用Activity一樣使用這個(gè)對(duì)話框,方便多了。不過(guò)畢竟跟我們平時(shí)使用的Activity還是有所不同的,特別是要設(shè)置好它的樣式,否則也是一堆的坑啊。
2、對(duì)話框Activity的布局與樣式
下面就來(lái)著手實(shí)現(xiàn)我們想要的對(duì)話框了。新建一個(gè)工程,MainActivity只是一個(gè)配角,底部放一個(gè)按鈕就搞定。我們的主角是DialogActivity,它的布局很簡(jiǎn)單,就跟平時(shí)的Activity一樣:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_gravity="bottom" android:background="@android:color/white" android:orientation="vertical" android:paddingLeft="10dp" android:paddingRight="10dp"> <EditText android:id="@+id/et_comment" android:layout_width="match_parent" android:layout_height="150dp" android:layout_marginTop="15dp" android:background="#f0f0f0" android:focusable="true" android:focusableInTouchMode="true" android:gravity="left|top" android:hint="我來(lái)說(shuō)一說(shuō)~" android:paddingBottom="5dp" android:paddingLeft="8dp" android:paddingRight="8dp" android:paddingTop="5dp" android:textSize="14dp" /> <Button android:textColor="@android:color/white" android:background="@android:color/holo_blue_light" android:id="@+id/btn_submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:layout_marginBottom="10dp" android:layout_marginTop="10dp" android:padding="5dp" android:text="發(fā)表評(píng)論" android:textSize="16sp" /> </LinearLayout> </LinearLayout>
重點(diǎn)是它的樣式,看下面的代碼:
<!--可輸入對(duì)話框的樣式 --> <style name="EditDialogStyle" parent="Theme.AppCompat.Light.NoActionBar"> //設(shè)置背景 <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowSoftInputMode">adjustResize|stateHidden</item> //Dialog的windowFrame框?yàn)闊o(wú) <item name="android:windowFrame">@null</item> //是否顯示標(biāo)題,true則去掉默認(rèn)的標(biāo)題欄 <item name="android:windowNoTitle">true</item> //是否浮現(xiàn)在activity之上,false的話會(huì)被軟鍵盤覆蓋 <item name="android:windowIsFloating">true</item> //是否半透明,為false時(shí)背景為黑色不透明 <item name="android:windowIsTranslucent">true</item> //是否有覆蓋 <item name="android:windowContentOverlay">@null</item> //Activity的動(dòng)畫效果 <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> //背景是否模糊顯示,為false時(shí)效果為全透明 <item name="android:backgroundDimEnabled">true</item> //點(diǎn)擊空白處時(shí)是否銷毀Activity <item name="android:windowCloseOnTouchOutside">true</item> </style>
要設(shè)置的屬性很多,我都做了注釋了,大家明白每個(gè)屬性的作用就行,這里就細(xì)說(shuō)了。別忘了,到清單文件中給DialogActivity用上這個(gè)主題:
<activity android:name=".DialogActivity" android:configChanges="orientation|screenSize" android:screenOrientation="portrait" android:theme="@style/EditDialogStyle"/>
運(yùn)行一下,相信大家可以看到效果了。
3、自動(dòng)彈出軟鍵盤效果
對(duì)話框的界面我們已經(jīng)做好了,但是為了用戶體驗(yàn)更好,我們要在對(duì)話框出現(xiàn)的時(shí)候自動(dòng)彈出軟鍵盤。下面介紹兩種方法:
3.1、使用InputMethodManager類顯示軟鍵盤
我們平時(shí)要讓某個(gè)EditText獲得焦點(diǎn)自動(dòng)彈出軟鍵盤可以這樣寫:
InputMethodManager inputManager =(InputMethodManager)etComment.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.showSoftInput(etComment, 0);
但是這里面有一點(diǎn)要注意:我們想要讓EditText獲得焦點(diǎn),那必須等界面繪制完畢才行。所以這樣設(shè)置了延遲300ms執(zhí)行彈出軟鍵盤的代碼,給界面留出繪制的時(shí)間:
new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { InputMethodManager inputManager = (InputMethodManager) etComment.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.showSoftInput(etComment, 0); return false; } }).sendEmptyMessageDelayed(0, 300);
加上上面的代碼,你就可以軟鍵盤自己彈出來(lái)了。
3.1、設(shè)置windowSoftInputMode屬性
你如果細(xì)心的話一定發(fā)現(xiàn)前面給DialogActivity設(shè)置樣式的代碼中有一個(gè)windowSoftInputMode屬性沒(méi)有添加注釋,請(qǐng)?jiān)徫屹u了個(gè)關(guān)子。這個(gè)屬性是設(shè)置窗口和軟鍵盤的交互模式的。它的屬性有很多,可以參考我后面給出的參考文章。這里我們用到了adjustResize,它的作用就是調(diào)整界面布局給軟鍵盤留出足夠的空間。那么stateHidden呢?其實(shí)軟鍵盤沒(méi)有自動(dòng)彈出就是它搞的鬼,它表示一般情況下軟鍵盤都是隱藏的。我們改成另外一個(gè)屬性:stateVisible,它表示軟鍵盤通常是可見(jiàn)的。
再來(lái)運(yùn)行一下,軟鍵盤就如期而至了。
4、后記
我們?cè)谛枨蠓治鲋刑岬降男Ч呀?jīng)實(shí)現(xiàn)完畢。后來(lái)我還想過(guò)給對(duì)話框增加自定義的動(dòng)畫效果,但是退出時(shí)的動(dòng)畫始終沒(méi)有設(shè)置成功,所以如果有讀者實(shí)現(xiàn)了,歡迎交流學(xué)習(xí)。
源碼我保存到了碼云,需要的話可以參考:可輸入對(duì)話框源碼
大家也可以通過(guò)本地下載:點(diǎn)擊這里
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
5、參考文章
android:windowSoftInputMode屬性詳解
徹底搞定Android開(kāi)發(fā)中軟鍵盤的常見(jiàn)問(wèn)題
- Android開(kāi)發(fā)之5.0activity跳轉(zhuǎn)時(shí)共享元素的使用方法
- android開(kāi)發(fā)之關(guān)閉所有的activity的方法
- Android開(kāi)發(fā)使用Activity嵌套多個(gè)Fragment實(shí)現(xiàn)橫豎屏切換功能的方法
- Android5.0之Activity的轉(zhuǎn)場(chǎng)動(dòng)畫的示例
- Android 關(guān)閉多個(gè)Activity的實(shí)現(xiàn)方法
- Android 中 ActivityLifecycleCallbacks的實(shí)例詳解
- Android中Activity和Fragment傳遞數(shù)據(jù)的兩種方式
- Android判斷當(dāng)前棧頂Activity的包名代碼示例
相關(guān)文章
Android AsyncTask 后監(jiān)聽(tīng)異步加載完畢的動(dòng)作詳解
這篇文章主要介紹了Android 使用AsyncTask 后監(jiān)聽(tīng)異步加載完畢的動(dòng)作的相關(guān)資料,需要的朋友可以參考下2016-11-11Android開(kāi)發(fā)實(shí)現(xiàn)Fragment監(jiān)聽(tīng)返回鍵事件功能的方法
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)Fragment監(jiān)聽(tīng)返回鍵事件功能的方法,結(jié)合實(shí)例形式分析了Android使用Fragment監(jiān)聽(tīng)并屏蔽返回鍵按鈕的實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Android自定義ViewGroup實(shí)現(xiàn)朋友圈九宮格控件
在我們的實(shí)際應(yīng)用中,經(jīng)常需要用到自定義控件,比如自定義圓形頭像,自定義計(jì)步器等等,這篇文章主要給大家介紹了關(guān)于Android自定義ViewGroup實(shí)現(xiàn)朋友圈九宮格控件的相關(guān)資料,需要的朋友可以參考下2021-07-07Android開(kāi)發(fā)之ListView實(shí)現(xiàn)Item局部刷新
對(duì)于ListView數(shù)據(jù)的刷新大家都知道,改變Adapter的數(shù)據(jù)源,然后調(diào)用Adapter的notifyDateSetChanged()方法即可。通過(guò)本篇文章給大家詳細(xì)介紹Android開(kāi)發(fā)之ListView實(shí)現(xiàn)Item局部刷新,感興趣的朋友一起學(xué)習(xí)吧2015-10-10Android WebView 內(nèi)處理302重定向不跳轉(zhuǎn)的解決
這篇文章主要介紹了Android WebView 內(nèi)處理302重定向不跳轉(zhuǎn)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03android 仿微信demo——微信消息界面實(shí)現(xiàn)(服務(wù)端)
本系列文章主要介紹了微信小程序-閱讀小程序?qū)嵗╠emo),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望能給你們提供幫助2021-06-06android 多點(diǎn)觸摸圖片縮放的具體實(shí)現(xiàn)方法
2013-06-06