整体实现思路

第一部分:伴随输入法显示

  1. 跟布局使用RelativeLayout铺满父窗口,
  2. emojiImage布局alignParentBottom,
  3. 在manifest文件中,对当前activity设置android:windowSoftInputMode=”stateHidden|adjustResize”

    这样,当EditText获取到焦点的时候,就会伴随输入法显示

第二部分:伴随输入法隐藏

  1. 为了伴随隐藏,EditText需要自定义
  2. 然后监听返回键,在点击返回键的时候,同时实现对输入法软键盘和控件的控制

1. 清单文件中的代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.cnpeng.cnpeng_showviewfollowinput"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"

            //重点是这里的windowSoftInputMode属性
       android:windowSoftInputMode="stateHidden|adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

2. 自定义EditText

package com.cnpeng.cnpeng_showviewfollowinput;

import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView;

/**
 * Created by CnPeng on 16/10/13. 自定义EditText(为了实现emoji和输入法的同显示或隐藏)
 */


public class MyEditText extends EditText {

    public MyEditText(Context context) {
        super(context);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public interface BackListener {
        void back(TextView textView);
    }


    private BackListener listener;

    public void setBackListener(BackListener listener) {
        this.listener = listener;
    }

    //该方法可以用来处理返回键来更新程序的UI。实现控件与输入法同时隐藏主要就靠这里
    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (listener != null) {
                listener.back(this);
            }
        }
        return false;
    }
}

3. MainActivity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:id="@+id/activity_main"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.cnpeng.cnpeng_showviewfollowinput.MyEditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:inputType="text"/>

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:src="@mipmap/ic_launcher"
        android:visibility="invisible"/>
</RelativeLayout>

4. MainActivity.java

package com.cnpeng.cnpeng_showviewfollowinput;

import android.media.Image;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 控制一个控件与输入法同步显示或隐藏
 */
public class MainActivity extends AppCompatActivity {

    private ImageView                                        iv;        //图片
    private com.cnpeng.cnpeng_showviewfollowinput.MyEditText et;        //输入框

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et = (MyEditText) findViewById(R.id.et);
        iv = (ImageView) findViewById(R.id.iv);

        // EditText输入框的触摸事件(也就是ET获取到焦点之后的处理事件)       
        et.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                iv.setVisibility(View.VISIBLE);
                return false;
            }
        });

        // 监听返回键        
        et.setBackListener(new MyEditText.BackListener() {
            @Override
            public void back(TextView textView) {
                //获取iv的可见属性,如果可见,点击返回时隐藏
                int ivVisibility = iv.getVisibility();
                if (ivVisibility == View.VISIBLE) {
                    iv.setVisibility(View.INVISIBLE);
                }
            }
        });
    }
}