之前总想搞一下这个模块,可是由于忙碌总是推迟,现在就把这块好好的弥补过来,下面是我实现的思路.本人才疏学浅,还望大家不要见笑。

首先我们还是先看写示例:

          

上面应用应该不用我过多介绍,下面我简单介绍下我如何实现的吧,想必这是大家最关心,前提说一点,思路上如果有不足的地方,或者有好的建议什么的,麻烦您多多指出,大家一起进步嘛.

首先我们从布局开始:

    

微博:红色方框我们称为底部导航栏,而蓝色部分是我们的表情窗口(包含表情分页点).

我的布局:或许大家看不到表情的布局,这是以因为我让她gone了.他就在底部导航栏的下面.

下面是表情布局代码:ViewPager添加表情GridView.(这里我用的是相对布局.或者FrameLayout,只是为了UE效果好一点.)

  <RelativeLayout
android: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.ViewPager
android:id="@+id/vp_emoji"
android:layout_width="fill_parent"
android:layout_height="wrap_content" /> <LinearLayout
android: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: 有经验的朋友都知道, ViewPager这个布局中的wrap_content自适应是不起作用的.

我google了好久,也没有找到相关的解决方案,大部分都是写死(这点肯定是不允许的),ViewPager的父亲是ViewGroup,之前也试着基于ViewGoup实现过ViewPager的效果,想自己搞一个控件,可是有点不愿敲那么多代码,最后一气之下:决定代码中动态算取表情框的高度,然后对表情框进行设置.反正高度变化频率不大.首先我们显示三行表情图标,加上之间的间距,可以算取ViewPager应占有的高度.然后我们还要算取分页点应占有的高度,二者加起来就是我们表情框最终占有的高度.这样我们就可以实现表情框的显示了,有段开发经验的朋友实现这个应该很简单的.(代码我就不贴了,方法比较笨拙.)

Trouble 2:软键盘隐藏和显示问题.
     
 首先我们先来看些软键盘相关的解释.

针对软键盘,如果想让键盘覆盖我们视图控件.那么在AndroidManifest.xml中对该Activity加上android:windowSoftInputMode="adjustPan"  如果想让软键盘不覆盖我们的视图,我们应该加上android:windowSoftInputMode="stateVisible|adjustResize" 这样屏幕会上移动.

相关的SoftInputMode值:

stateUnspecified:软键盘的状态(是否它是隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。这个是为了软件盘行为默认的设置。

stateUnchanged:软键盘被保持无论它上次是什么状态,是否可见或隐藏,当主窗口出现在前面时。

stateHidden:当用户选择该Activity时,软键盘被隐藏——也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。

stateAlwaysHidden:软键盘总是被隐藏的,当该Activity主窗口获取焦点时。

stateVisible:软键盘是可见的,当那个是正常合适的时(当用户导航到Activity主窗口时)。

stateAlwaysVisible:当用户选择这个Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。

adjustUnspecified:它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为设置。

adjustResize:该Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间.

adjustPan:该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。

之前做项目用到软键盘的时候总是googele,找到了就copy+paste,也不理解究竟是Why.这次算是花点时间整理了下,希望下次可以自己搞定。有点跑题了,言归正传,如果你在配置文件中设置这些SoftInputMode应该都达不到理想的效果,这里我分析一下微博等应用的操作。


首先我跳转到了微博的发表页面,这个时候软键盘显示,并且软键盘没有遮挡控件,所以模式应该为stateVisible|adjustResize.而当我们点击表情头像的时候,软键盘隐藏,显示表情框(仔细操作下应该会发现,软键盘在隐藏的过程表情框直接都显示好了,用户体验很好.).在软件盘隐藏的时候模式应该是adjustPan.既然模式是动态改变的,那么在配置文件中就解决不了问题了,我们只有在代码中动态控件。


具体代码如下:

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);

}

代码我想就不用我解释了,实现起来很简单,只是我google了那么久都没有找到方案,最终还是自己无意中想到了。这样我们就做到和微博的效果一样了。

总之做应用要注重的就是用户体验,操作一下比较fashion的应用就可以看到,大公司与小公司的差别在哪里。

在这里我发一下牢骚,我呆过三家公司,可没有一家公司让我满意,别说流程了,连个像样的UI都做不到,总觉得公司是在敷衍移动产品,认为不就是一个UI吗,不就是一些UE操作吗,流程随便一划,设计随便一搞,最后随便找个web的前端工程师随便划几个Psd文件就开工了.你说这样开发出来的应用有用吗,用户会埋单吗。没有用户,老板你如何变现!!!所以想开发一款应用,不管是大是小,一定要用心,不牢骚了,鄙人已经辞去工作专心搞自己的项目,总之我的理念就是:UI+UE这是最近本的移动应用要求.

最后看一下实现的效果吧.(Demo版)

     


就说到这里,如有疑问请留言.


android 表情,软键盘冲突解决方案(仿微博等SNS应用)的更多相关文章

  1. 如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题

    如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 在android中有时候可能要实现一个底部弹 ...

  2. Android隐藏软键盘收回软键盘

    代码改变世界 Android隐藏软键盘收回软键盘 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPU ...

  3. Android 判断软键盘弹出并隐藏的简单完美解决方案

    最近项目中有一个编辑框,下面是个ListView.在触发编辑框弹出软键盘后,ListView还能滑动,并且ListView的item还能响应单击.这样的体验效果很不好.于是便想在滑动或单击item时判 ...

  4. Android中软键盘弹出时关于布局的问题

     当在Android的layout设计里面如果输入框过多,则在输入弹出软键盘的时候,下面的输入框会有一部分被软件盘挡住,从而不能获取焦点输入. 解决办法: 方法一:在你的activity中的oncre ...

  5. Android EditText软键盘显示隐藏以及“监听”

    一.写此文章的起因 本人在做类似于微信.易信等这样的聊天软件时,遇到了一个问题.聊天界面最下面一般类似于如图1这样(这里只是显示了最下面部分,可以参考微信等),有输入文字的EditText和表情按钮等 ...

  6. iOS 点击TextField不弹出软键盘的解决方案

    开发中遇到: 在模拟器里面,textfield可以通过电脑键盘输入,可是怎么也不会自动弹出模拟器软键盘 解决方案: 切换一下键盘,command+shift+k,Xcode6.3 中只能是一种输入源

  7. android设置软键盘搜索键以及监听搜索键点击时发生两次事件的问题解决

    在输入框中加入android:imeOptions="actionSearch",调用软键盘时,回车键就会显示搜索二字. 我想在点击搜索时,跳转到下一个页面,但是调用setOnKe ...

  8. Android WebView 软键盘挡住输入框

    解决方法一: 在所在的Activity中加入 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RES ...

  9. Android 禁止软键盘自动弹出

    Android系统对EditText这个控件有监听功能,如果某个Activity中含有该控件,就会自动弹出软键盘让你输入,这个看似人性化的方案有 时候并不被用户喜欢的,所以在有些情况下要禁用该功能.这 ...

随机推荐

  1. 两个android程序间的相互调用(apk互调)

    通常我们用到的只是activity之间的互相跳转和调用,很少会用到apk级别的互相调用. 往往在一些应用上会用到,比如一个支付系统,可能会有很多的一系列的程序调用到:彩票系统.订票系统.团购网……全部 ...

  2. mac下SSH很快被断开

    解决方法: 1. 切换到root账号:sudo bash -c 'su - root' 2. 修改/etc/ssh_config文件 ServerAliveCountMax 5 ServerAlive ...

  3. 值班问题:insert语句插入了两条数据?

    上周值班,碰到这样的一个客户问题,表结构简化如下: CREATE TABLE `aa` (`c1` int(10) unsigned NOT NULL AUTO_INCREMENT,`c2` int( ...

  4. ASP.NET MVC+Bootstrap个人博客之打造清新分页Helper(三)

    有点另类,分页直接是在后台拼接好html,然后发送到前台的: 1. 分页容器: <div class="pagination"> <ul> //****** ...

  5. POJ 1080 Human Gene Functions

    题意:给两个DNA序列,在这两个DNA序列中插入若干个'-',使两段序列长度相等,对应位置的两个符号的得分规则给出,求最高得分. 解法:dp.dp[i][j]表示第一个字符串s1的前i个字符和第二个字 ...

  6. hdu 3038 How Many Answers Are Wrong(种类并查集)2009 Multi-University Training Contest 13

    了解了种类并查集,同时还知道了一个小技巧,这道题就比较容易了. 其实这是我碰到的第一道种类并查集,实在不会,只好看着别人的代码写.最后半懂不懂的写完了.然后又和别人的代码进行比较,还是不懂,但还是交了 ...

  7. 《Python CookBook2》 第一章 文本 - 去字符串两端的空格 && 合并字符串 && 将字符串逐字符或者逐词反转

    去字符串两端的空格 任务: 获得一个开头和末尾都没有多余空格的字符串. 解决方案: 字符串对象的lstrip.rstrip和strip 方法正是为这种任务而设计的.这几个方法都不需要参数,它们会直接返 ...

  8. Mahout踩坑之路

    一.版本对比 公司版Mahout 由于Mahout只能允许于hadoop0.20以上版本上,而百度的hadoop是hadoop0.19的一个分支.因此百度HPC组曾经将Mahout移植到百度的hado ...

  9. 关于在Eclipse里面启动了服务,但是localhost:8080无法访问的问题:

    今天eclipse重新换了一个然后写项目,结果发生了一些bug,当在Tomca服务开启之后,浏览器端输入localhost:8080无法访问,以为是服务器没有搞定,检查了没问题,百度了一下有很多乱七八 ...

  10. DOM笔记(二):Node接口

    所有的节点都使用Node接口来表示,可以使用很多方法去获取节点,如document.getElementsByTagName().document.getElementsByName()等均返回一个N ...