Android 输入法与聊天表情之间切换 edittext悬浮输入法之上
来源:互联网 发布:链路状态协议网络拓扑 编辑:程序博客网 时间:2024/05/21 18:31
废话不多说,先上效果
设计知识点:
1.点击edittext显示输入法时,如何使使输入法在布局的最底部(默认紧挨edittext)
2.如何获取输入法的高度,来设置表情的height
3.如何表情和输入法之间流畅切换(我们只涉及到手动隐藏输入法)
4.一些根据特殊需求,和特殊情况(输入法弹出时可能会导致listview缩小)
监听输入法显示隐藏:
需要viewtree的监听
/**用到的成员变量*/private int mSoftHeight;// 输入法的高度private boolean mIsShowKeyBoard;// 是否显示了输入法mRl_edit_container.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { fixKeyBoardState(); } }); private void fixKeyBoardState() { Rect rect = new Rect(); // 获取当前页面窗口的显示范围 getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); int screenHeight = getScreenHeight(); int softHeight = screenHeight - rect.bottom; // 输入法的高度 if (Math.abs(softHeight) > screenHeight / 5) {// 超过屏幕五分之一则表示弹出了输入法 mIsShowKeyBoard = true; mSoftHeight = softHeight; } else { mIsShowKeyBoard = false; } }
解决问题一:
在viewtree的监听中根据输入法的状态来改变整个view的位置
mRl_edit_container.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { fixKeyBoardState(); if (mIsShowKeyBoard) { mLL_View_container.scrollTo(0, mSoftHeight); } else { mLL_View_container.scrollTo(0, 0); } } });
解决问题二:
其实我们的输入法告诉已经获取到了,只是给表情布局设置height即可
private void showEmojiList() { if (mSoftHeight > 100) {// 输入法曾经打开过 LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mGV_emoji.getLayoutParams(); params.height = mSoftHeight; mGV_emoji.setLayoutParams(params); } showView(); }
解决问题三:
涉及到手动隐藏输入法:
private void hideSoftInput() { if (mEt_chat == null || mIsShowKeyBoard == false) { return; } InputMethodManager imm = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mEt_chat.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);}
点击按钮,如果输入法没有显示就显示 emojiView,如果输入法正在显示就手动隐藏并且显示emojiView
逻辑的代码不贴出了,后面统一给出。
注意点:判断输入法状态最好不要用 isActive()方法来判断。我们监听的viewtree中有 变量(mIsShowKeyBoard )的^_^
流畅切换我们还需要手动调整整体view的
/**成员变量 用于点击时状态的标志 详情见最后代码*/private static final int SHOW_NOTING = 0;private static final int SHOW_KEYBOARD = 1;private static final int SHOW_EMOJI = 2;mRl_edit_container.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { fixKeyBoardState(); if (mIsShowKeyBoard && mActionShow == SHOW_KEYBOARD) { hideView(); } if (mIsShowKeyBoard) { mLL_View_container.scrollTo(0, mSoftHeight); } else if (mActionShow == SHOW_EMOJI) { mLL_View_container.scrollTo(0, mGV_emoji.getHeight()); } else { mLL_View_container.scrollTo(0, 0); } } }); @Override public void onClick(View v) { switch (v.getId()) { case R.id.mEt_chat://这里也要监听ontouch事件,并且设置标志状态 mActionShow = SHOW_KEYBOARD; break; case R.id.mImage_gif_emoji: if (mIsShowKeyBoard) { mActionShow = SHOW_EMOJI; showEmojiList(); hideSoftInput(); } else if (mActionShow == SHOW_EMOJI) { mActionShow = SHOW_NOTING; hideView(); } else { mActionShow = SHOW_EMOJI; showEmojiList(); } break; default: break; } }
解决问题四:
特殊需求很多,我项目中的listview 输入法显示时会压缩listview,而整体布局不动。所以只需手动设置height即可。输入法消失后再隐藏设置回去
private void fixedListViewHeight() { int height = mListView.getHeight(); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mListView.getLayoutParams(); params.height = height; params.weight = 0; mListView.setLayoutParams(params);}private void resetListViewHeight() { LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mListView.getLayoutParams(); params.weight = 1; mListView.setLayoutParams(params);}
由于demo代码并不多,所以直接上代码了
SoftActivity.java
package com.example.mlc.softtest;import android.app.Activity;import android.content.Context;import android.graphics.Rect;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.view.ViewTreeObserver;import android.view.WindowManager;import android.view.inputmethod.InputMethodManager;import android.widget.Button;import android.widget.EditText;import android.widget.GridView;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.RelativeLayout;public class SoftActivity extends AppCompatActivity implements View.OnClickListener { private EditText mEt_chat; private ListView mListView; private ImageView mImage_gif_emoji; private RelativeLayout mRl_edit_container; private GridView mGV_emoji; private int mScreenHeight; private int mSoftHeight;// 输入法的高度 private boolean mIsShowKeyBoard;// 是否显示了输入法 private int mActionShow; private static final int SHOW_NOTING = 0; private static final int SHOW_KEYBOARD = 1; private static final int SHOW_EMOJI = 2; private LinearLayout mLL_View_container; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_soft); initView(); } private void initView() { mEt_chat = (EditText) findViewById(R.id.mEt_chat); mListView = (ListView) findViewById(R.id.mList_chat); Button mBtn_sendMessage = (Button) findViewById(R.id.mBtn_sendMessage); mImage_gif_emoji = (ImageView) findViewById(R.id.mImage_gif_emoji); mRl_edit_container = (RelativeLayout) findViewById(R.id.mRl_edit_container); mGV_emoji = (GridView) findViewById(R.id.mGV_emoji); mLL_View_container = (LinearLayout) findViewById(R.id.mLL_View_container); mImage_gif_emoji.setSelected(false); mBtn_sendMessage.setOnClickListener(this); mImage_gif_emoji.setOnClickListener(this); mEt_chat.setOnClickListener(this); mEt_chat.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mActionShow = SHOW_KEYBOARD; return false; } }); mRl_edit_container.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { fixKeyBoardState(); if (mIsShowKeyBoard && mActionShow == SHOW_KEYBOARD) { hideView(); } if (mIsShowKeyBoard) { mLL_View_container.scrollTo(0, mSoftHeight); } else if (mActionShow == SHOW_EMOJI) { mLL_View_container.scrollTo(0, mGV_emoji.getHeight()); } else { mLL_View_container.scrollTo(0, 0); } } }); } private void fixKeyBoardState() { Rect rect = new Rect(); // 获取当前页面窗口的显示范围 getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); int screenHeight = getScreenHeight(); int softHeight = screenHeight - rect.bottom; // 输入法的高度 if (Math.abs(softHeight) > screenHeight / 5) {// 超过屏幕五分之一则表示弹出了输入法 mIsShowKeyBoard = true; mSoftHeight = softHeight; } else { mIsShowKeyBoard = false; } } private int getScreenHeight() { if (mScreenHeight > 0) { return mScreenHeight; } mScreenHeight = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getHeight(); return mScreenHeight; } private void showEmojiList() { if (mSoftHeight > 100) {// 输入法打开了,输入法没有打开,但是曾经打开过 LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mGV_emoji.getLayoutParams(); params.height = mSoftHeight; mGV_emoji.setLayoutParams(params); } fixedListViewHeight(); showView(); } private void fixedListViewHeight() { int height = mListView.getHeight(); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mListView.getLayoutParams(); params.height = height; params.weight = 0; mListView.setLayoutParams(params); } private void resetListViewHeight() { LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mListView.getLayoutParams(); params.weight = 1; mListView.setLayoutParams(params); } private void showView() { mGV_emoji.setVisibility(View.VISIBLE); mGV_emoji.setSelected(true); } private void hideView() { mGV_emoji.setVisibility(View.GONE); mGV_emoji.setSelected(false); resetListViewHeight(); } private void hideSoftInput() { if (mEt_chat == null || mIsShowKeyBoard == false) { return; } InputMethodManager imm = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mEt_chat.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.mEt_chat: mActionShow = SHOW_KEYBOARD; break; case R.id.mImage_gif_emoji: if (mIsShowKeyBoard) { mActionShow = SHOW_EMOJI; showEmojiList(); hideSoftInput(); } else if (mActionShow == SHOW_EMOJI) { mActionShow = SHOW_NOTING; hideView(); } else { mActionShow = SHOW_EMOJI; showEmojiList(); } break; default: break; } }}
activity_soft.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/mLL_View_container" android:orientation="vertical"> <!--自己的布局--> <View android:background="@android:color/holo_green_light" android:layout_width="match_parent" android:layout_height="200dp" /> <!--listview--> <ListView android:background="@android:color/holo_red_light" android:id="@+id/mList_chat" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#23202b" android:gravity="center_vertical" android:orientation="horizontal" android:paddingBottom="8dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="8dp"> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <RelativeLayout android:id="@+id/mRl_edit_container" android:layout_width="232dp" android:layout_height="wrap_content" android:background="@drawable/chat_edittext_bg" 这里你应该没有,可以自己替换 > <ImageView android:id="@+id/mImage_gif_emoji" android:layout_width="34dp" android:layout_height="32dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_margin="3dp" android:src="@drawable/chat_emoji_selector" 这里你应该没有,可以自己替换 /> <EditText android:id="@+id/mEt_chat" android:layout_width="232dp" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toLeftOf="@id/mImage_gif_emoji" android:background="@android:color/transparent" android:hint="说点什么吧~" android:padding="6dp" android:textColorHint="#767088" /> </RelativeLayout> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <Button android:id="@+id/mBtn_sendMessage" android:layout_width="54dp" android:layout_height="40dp" android:textColor="#767088" /> </LinearLayout> <!--表情--> <GridView android:background="@android:color/holo_blue_light" android:id="@+id/mGV_emoji" android:layout_width="match_parent" android:layout_height="50dp" android:visibility="gone" /></LinearLayout>
activity的设置
<activity android:name=".SoftActivity" android:windowSoftInputMode="adjustPan|stateHidden" android:theme="@style/Theme.AppCompat.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
阅读全文
0 0
- Android 输入法与聊天表情之间切换 edittext悬浮输入法之上
- android EditText完美解决禁止输入法表情
- android EditText完美解决禁止输入法表情
- 关于陌陌和微信表情页与输入法之间切换的问题
- 关于陌陌和微信表情页与输入法之间切换的问题
- Android 输入法表情实现
- 【android开发】解决输入法与表情面板切换时的界面抖动问题
- 微信表情与输入法无缝切换(原理篇)
- 二十六、自定义输入框--输入法与表情面板切换
- Android EditText与输入法相关问题
- 解决聊天页面输入法和表情面板切换界面闪动问题
- Android 输入法表情上传服务器
- Android EditText 不能输入 手机输入法自带 Emoji 表情,为EditText 添加输入限制
- android EditText 设置imeOptions 切换输入法回车键的显示
- iPone实现快速切换表情输入法?
- Android自定义表情键盘与输入法键盘冲突
- Android 切换输入法
- Android 切换输入法
- ArcGIS API for JavaScript(4.x)+EasyUI——图层控制
- 最小的K个数
- 代理服务器与NAT
- 简单LinuxC程序关于报数问题
- C++中“引用”的底层实现
- Android 输入法与聊天表情之间切换 edittext悬浮输入法之上
- day_04 Linux下有关增删查改的Shell命令
- 又是权限的问题啊啊啊!------远程定位一个与我不相关的问题
- java学习之路(2)-java的基本元素
- VLC android 3.0解码器使用及移植TV项目调研
- NAT技术及其应用
- 块设备文件的readpage方法
- 《剑指offer》从上往下打印二叉树
- 解决Android 中那些嵌套滑动事件冲突问题--合集