android 表情,软键盘冲突解决方案(仿微博等SNS应用)
? ? ? ? 之前總想搞一下這個模塊,可是由于忙碌總是推遲,現(xiàn)在就把這塊好好的彌補(bǔ)過來,下面是我實(shí)現(xiàn)的思路.本人才疏學(xué)淺,還望大家不要見笑。 ?
? ? ? ? 首先我們還是先看寫示例:
?? ?? ?? ??
? ? ? 上面應(yīng)用應(yīng)該不用我過多介紹,下面我簡單介紹下我如何實(shí)現(xiàn)的吧,想必這是大家最關(guān)心,前提說一點(diǎn),思路上如果有不足的地方,或者有好的建議什么的,麻煩您多多指出,大家一起進(jìn)步嘛.
? ? ? 首先我們從布局開始:
? ??
微博:紅色方框我們稱為底部導(dǎo)航欄,而藍(lán)色部分是我們的表情窗口(包含表情分頁點(diǎn)).
我的布局:或許大家看不到表情的布局,這是以因為我讓她gone了.他就在底部導(dǎo)航欄的下面.
下面是表情布局代碼:ViewPager添加表情GridView.(這里我用的是相對布局.或者FrameLayout,只是為了UE效果好一點(diǎn).)
?
<RelativeLayoutandroid:id="@+id/rlayout_emoji"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@color/note_toolbar_bg"android:orientation="vertical"android:visibility="gone" ><android.support.v4.view.ViewPagerandroid:id="@+id/vp_emoji"android:layout_width="fill_parent"android:layout_height="wrap_content" /><LinearLayoutandroid:id="@+id/layout_point"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:gravity="center"android:orientation="horizontal"android:padding="10dip" ></LinearLayout></RelativeLayout>Trouble 1: 有經(jīng)驗的朋友都知道, ViewPager這個布局中的wrap_content自適應(yīng)是不起作用的.
?
? ? ? ? 我google了好久,也沒有找到相關(guān)的解決方案,大部分都是寫死(這點(diǎn)肯定是不允許的),ViewPager的父親是ViewGroup,之前也試著基于ViewGoup實(shí)現(xiàn)過ViewPager的效果,想自己搞一個控件,可是有點(diǎn)不愿敲那么多代碼,最后一氣之下:決定代碼中動態(tài)算取表情框的高度,然后對表情框進(jìn)行設(shè)置.反正高度變化頻率不大.首先我們顯示三行表情圖標(biāo),加上之間的間距,可以算取ViewPager應(yīng)占有的高度.然后我們還要算取分頁點(diǎn)應(yīng)占有的高度,二者加起來就是我們表情框最終占有的高度.這樣我們就可以實(shí)現(xiàn)表情框的顯示了,有段開發(fā)經(jīng)驗的朋友實(shí)現(xiàn)這個應(yīng)該很簡單的.(代碼我就不貼了,方法比較笨拙.)
Trouble 2:軟鍵盤隱藏和顯示問題.
? ? ? ?首先我們先來看些軟鍵盤相關(guān)的解釋.
? ? ? ?針對軟鍵盤,如果想讓鍵盤覆蓋我們視圖控件.那么在AndroidManifest.xml中對該Activity加上android:windowSoftInputMode="adjustPan" ?如果想讓軟鍵盤不覆蓋我們的視圖,我們應(yīng)該加上android:windowSoftInputMode="stateVisible|adjustResize"?這樣屏幕會上移動.
? ? ? ? 相關(guān)的SoftInputMode值:
stateUnspecified:軟鍵盤的狀態(tài)(是否它是隱藏或可見)沒有被指定。系統(tǒng)將選擇一個合適的狀態(tài)或依賴于主題的設(shè)置。這個是為了軟件盤行為默認(rèn)的設(shè)置。
stateUnchanged:軟鍵盤被保持無論它上次是什么狀態(tài),是否可見或隱藏,當(dāng)主窗口出現(xiàn)在前面時。
stateHidden:當(dāng)用戶選擇該Activity時,軟鍵盤被隱藏——也就是,當(dāng)用戶確定導(dǎo)航到該Activity時,而不是返回到它由于離開另一個Activity。
stateAlwaysHidden:軟鍵盤總是被隱藏的,當(dāng)該Activity主窗口獲取焦點(diǎn)時。
stateVisible:軟鍵盤是可見的,當(dāng)那個是正常合適的時(當(dāng)用戶導(dǎo)航到Activity主窗口時)。
stateAlwaysVisible:當(dāng)用戶選擇這個Activity時,軟鍵盤是可見的——也就是,也就是,當(dāng)用戶確定導(dǎo)航到該Activity時,而不是返回到它由于離開另一個Activity。
adjustUnspecified:它不被指定是否該Activity主窗口調(diào)整大小以便留出軟鍵盤的空間,或是否窗口上的內(nèi)容得到屏幕上當(dāng)前的焦點(diǎn)是可見的。系統(tǒng)將自動選擇這些模式中一種主要依賴于是否窗口的內(nèi)容有任何布局視圖能夠滾動他們的內(nèi)容。如果有這樣的一個視圖,這個窗口將調(diào)整大小,這樣的假設(shè)可以使?jié)L動窗口的內(nèi)容在一個較小的區(qū)域中可見的。這個是主窗口默認(rèn)的行為設(shè)置。
adjustResize:該Activity主窗口總是被調(diào)整屏幕的大小以便留出軟鍵盤的空間.
adjustPan:該Activity主窗口并不調(diào)整屏幕的大小以便留出軟鍵盤的空間。相反,當(dāng)前窗口的內(nèi)容將自動移動以便當(dāng)前焦點(diǎn)從不被鍵盤覆蓋和用戶能總是看到輸入內(nèi)容的部分。這個通常是不期望比調(diào)整大小,因為用戶可能關(guān)閉軟鍵盤以便獲得與被覆蓋內(nèi)容的交互操作。
? ? ? ? 之前做項目用到軟鍵盤的時候總是googele,找到了就copy+paste,也不理解究竟是Why.這次算是花點(diǎn)時間整理了下,希望下次可以自己搞定。有點(diǎn)跑題了,言歸正傳,如果你在配置文件中設(shè)置這些SoftInputMode應(yīng)該都達(dá)不到理想的效果,這里我分析一下微博等應(yīng)用的操作。
首先我跳轉(zhuǎn)到了微博的發(fā)表頁面,這個時候軟鍵盤顯示,并且軟鍵盤沒有遮擋控件,所以模式應(yīng)該為stateVisible|adjustResize.而當(dāng)我們點(diǎn)擊表情頭像的時候,軟鍵盤隱藏,顯示表情框(仔細(xì)操作下應(yīng)該會發(fā)現(xiàn),軟鍵盤在隱藏的過程表情框直接都顯示好了,用戶體驗很好.).在軟件盤隱藏的時候模式應(yīng)該是adjustPan.既然模式是動態(tài)改變的,那么在配置文件中就解決不了問題了,我們只有在代碼中動態(tài)控件。
具體代碼如下:
InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (rlayout_emoji.getVisibility() == View.VISIBLE) {
iv_note_emoticon
.setImageResource(R.drawable.btn_emoticon_selector);
rlayout_emoji.setVisibility(View.GONE);
getWindow()
.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
// 打開軟鍵盤
mInputMethodManager.showSoftInput(et_note,
InputMethodManager.SHOW_FORCED);
} else {
iv_note_emoticon
.setImageResource(R.drawable.btn_keyboard_selector);
rlayout_emoji.setVisibility(View.VISIBLE);
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??// 隱藏軟鍵盤
mInputMethodManager.hideSoftInputFromWindow(getCurrentFocus()
.getApplicationWindowToken(), 0);
}
代碼我想就不用我解釋了,實(shí)現(xiàn)起來很簡單,只是我google了那么久都沒有找到方案,最終還是自己無意中想到了。這樣我們就做到和微博的效果一樣了。
? ? ? ?總之做應(yīng)用要注重的就是用戶體驗,操作一下比較fashion的應(yīng)用就可以看到,大公司與小公司的差別在哪里。
? ? ? ?在這里我發(fā)一下牢騷,我呆過三家公司,可沒有一家公司讓我滿意,別說流程了,連個像樣的UI都做不到,總覺得公司是在敷衍移動產(chǎn)品,認(rèn)為不就是一個UI嗎,不就是一些UE操作嗎,流程隨便一劃,設(shè)計隨便一搞,最后隨便找個web的前端工程師隨便劃幾個Psd文件就開工了.你說這樣開發(fā)出來的應(yīng)用有用嗎,用戶會埋單嗎。沒有用戶,老板你如何變現(xiàn)!!!所以想開發(fā)一款應(yīng)用,不管是大是小,一定要用心,不牢騷了,鄙人已經(jīng)辭去工作專心搞自己的項目,總之我的理念就是:UI+UE這是最近本的移動應(yīng)用要求.
最后看一下實(shí)現(xiàn)的效果吧.(Demo版)
? ? ?
就說到這里,如有疑問請留言.
?
總結(jié)
以上是生活随笔為你收集整理的android 表情,软键盘冲突解决方案(仿微博等SNS应用)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业站收藏
- 下一篇: 【1489】求二叉树的先序遍历 SD