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