热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

二十六、自定义输入框--输入法与表情面板切换

自定义的输入框一般都有输入法与表情面板切换的功能,要做到美好的切换体验也是不容易的。切换时不要闪,闪的原因是输入法出现时,会把activity往上挤压,输入法隐藏时,activity又会复原,这个过程

自定义的输入框一般都有输入法与表情面板切换的功能,要做到美好的切换体验也是不容易的。切换时不要闪,闪的原因是输入法出现时,会把activity往上挤压,输入法隐藏时,activity又会复原,这个过程,我们的界面就会跳来跳去,给人感觉就是闪瞎眼睛。

知道原因后就好解决了,首先给AndroidManifest.xml的activity设置:

android:windowSoftInputMode="stateHidden|adjustResize"

作用是打开activity时隐藏软键盘和自动改变activity大小以适应弹出的软键盘。

整体布局如下:


android:layout_
android:layout_
android:orientation="vertical">





android:layout_
android:layout_
android:background="#008800"
android:orientation="horizontal">

android:id="@+id/tv_emoji"
android:layout_
android:layout_
android:padding="10dp"
android:text="\@"
android:textSize="20sp"
android:text/>

android:id="@+id/et_input"
android:layout_
android:layout_ />







显示未@的TextView就是输入法和表情面板的切换按钮。

一、点击切换按钮,弹出软键盘

固定输入框以上内容的高度,它的高度固定之后,自定义输入框的位置就固定了,它就不会跳来跳去了,同时设置表情面板高度为0.

二、点击切换按钮,关闭软键盘

原理和上面一样,不同是需要设置表情面板的高度,并且它的高度和软键盘的高度一致。


MainActivity代码:

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_emoji:
int softHeight = KeyBoardUtil.getSoftBoardHeight(this);
if (softHeight <= 0) {
softHeight = KeyBoardUtil.getSoftBoardHeightSP(this);
} else {
KeyBoardUtil.setSoftBoardHeight(this, softHeight);
}
KeyBoardUtil.setSoftBoardHeight(this, softHeight);

if(KeyBoardUtil.isShowSoftBoard(this)) {
lockHeight();
setEmojiViewHeight(softHeight);
KeyBoardUtil.closeKeyboard(inputEditText, this);
unlockHeight();
} else {
lockHeight();
setEmojiViewHeight(0);
KeyBoardUtil.openKeyboard(inputEditText, this);
unlockHeight();
}
break;
}
}

private void lockHeight() {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) showFrameLayout.getLayoutParams();
lp.height = showFrameLayout.getHeight();
lp.weight = 0;
showFrameLayout.setLayoutParams(lp);
}

private void unlockHeight() {
// 需要做一个延时操作,不然没有效果
inputEditText.postDelayed(new Runnable() {
@Override
public void run() {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) showFrameLayout.getLayoutParams();
lp.weight = 1;
showFrameLayout.setLayoutParams(lp);
}
}, 200);
}

private void setEmojiViewHeight(int h) {
ViewGroup.LayoutParams lp = emojiFrameLayout.getLayoutParams();
lp.height = h;
emojiFrameLayout.setLayoutParams(lp);
}
软键盘工具类代码:

public class KeyBoardUtil {

public static final String SP_SOFTBOARD_HEIGHT = "sp_softboard_height";

/**
* 软键盘是否显示
*
* @param activity
* @return
*/
public static boolean isShowSoftBoard(Activity activity) {
return getSoftBoardHeight(activity) > 100;
}

/**
* 软键盘高度
*
* @param activity
* @return
*/
public static int getSoftBoardHeight(Activity activity) {
Rect r = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
return getScreenHeight(activity) - r.bottom;
}

/**
* 获取屏幕高度
*
* @param activity
* @return
*/
private static int getScreenHeight(Activity activity) {
WindowManager wm = activity.getWindowManager();
return wm.getDefaultDisplay().getHeight();
}

/**
* 获取软键盘高度
*
* @param context
* @return
*/
public static int getSoftBoardHeightSP(Context context) {
SharedPreferences sp = context.getSharedPreferences("user", Context.MODE_PRIVATE);
return sp.getInt(SP_SOFTBOARD_HEIGHT, 400);
}

/**
* 设置软键盘高度
*
* @param context
* @param h
*/
public static void setSoftBoardHeight(Context context, int h) {
SharedPreferences sp = context.getSharedPreferences("user", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putInt(SP_SOFTBOARD_HEIGHT, h);
editor.apply();
}

/**
* 打开软键盘
*
* @param mEditText 输入框
* @param mContext 上下文
*/
public static void openKeyboard(EditText mEditText, Context mContext) {
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditText, InputMethodManager.SHOW_FORCED);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
}

/**
* 关闭软键盘
*
* @param mEditText 输入框
* @param mContext 上下文
*/
public static void closeKeyboard(EditText mEditText, Context mContext) {
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
}
}

效果图:

打开软键盘

关闭软键盘


demo代码下载:

http://download.csdn.net/detail/yu75567218/9629656

参考:

http://blog.csdn.net/javazejian/article/details/52126391

http://blog.163.com/ittfxin@126/blog/static/110674863201572513818601/


推荐阅读
author-avatar
Cher麻花
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有