需求是要做一个鼠标控制+键盘,因此在界面上就是一个鼠标绘板和一个键盘。
我的是用的fragment 界面上加了一个EditText 高宽都设置为0 这样在界面上就看不到这个控件了
<EditText
android:id="@+id/show_edit"
android:layout_width="0dp"
android:layout_height="0dp"
android:textColor="#00ffffff"
android:background="#00ffffff"
android:textColorHint="#00ffffff"
android:visibility="visible" />
我最外层用的是LinearLayout 然后重写LinearLayout 加了一个界面改变 的回调接口
代码如下
public class XLinearLayout extends LinearLayout {
private InputWindowListener listener;
public XLinearLayout(Context context) {
super(context);
}
public XLinearLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public XLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (oldh > h) {
listener.show();
} else{
listener.hidden();
}
}
public void setListener(InputWindowListener listener) {
this.listener = listener;
}
public interface InputWindowListener {
void show();
void hidden();
}
}
整个fragment代码如下
public class MouseModelFragment extends XFragment {
@BindView(R.id.switchButton)
FunSwitch switchButton;
@BindView(R.id.shou_text)
TextView showText;
@BindView(R.id.show_edit)
EditText showEdit;
@BindView(R.id.touch)
LinearLayout touch;
@BindView(R.id.btn_submit)
Button btnSubmit;
@BindView(R.id.mouse_root_layout)
XLinearLayout mouse_root_layout;
boolean isSendNull = true;
@Override
public void initData(Bundle savedInstanceState) {
//添加layout大小发生改变监听器
mouse_root_layout.setListener(new XLinearLayout.InputWindowListener() {
@Override
public void show() {
isSendNull = true;
}
@Override
public void hidden() {
isSendNull = false;
showEdit.setText("");
}
});
showEdit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
if(isSendNull){
System.out.println("---------afterTextChanged----->>>"+s);
}
}
});
new Handler().postDelayed(() ->{
closeInputMethod();
}, 100);
}
@OnClick({R.id.btn_submit})
public void EventClick(View view){
switch (view.getId()){
case R.id.btn_submit:
openInputMethod(showEdit);
break;
}
}
public void openInputMethod(final EditText editText) {
editText.requestFocus();
InputMethodManager imm =(InputMethodManager)editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.SHOW_FORCED);
}
public void closeInputMethod(){
View mv = context.getWindow().peekDecorView();
if (mv != null){
InputMethodManager input_manger = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
input_manger.hideSoftInputFromWindow(mv.getWindowToken(), 0);
}
}
@Override
public int getLayoutId() {
return R.layout.activity_control_mouse_model_fragment;
}
public static MouseModelFragment newInstance() {
return new MouseModelFragment();
}
}
最后 就是要在AndroidManifest 中 activity 中加上 android:windowSoftInputMode="adjustResize"
不然重写的linearlayout 就不生效。。。。。