整体实现思路
第一部分:伴随输入法显示
- 跟布局使用RelativeLayout铺满父窗口,
- emojiImage布局alignParentBottom,
-
在manifest文件中,对当前activity设置android:windowSoftInputMode=”stateHidden|adjustResize”
这样,当EditText获取到焦点的时候,就会伴随输入法显示
第二部分:伴随输入法隐藏
- 为了伴随隐藏,EditText需要自定义
- 然后监听返回键,在点击返回键的时候,同时实现对输入法软键盘和控件的控制
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);
}
}
});
}
}