android fragment 中显示和隐藏键盘再监听键盘的值

需求是要做一个鼠标控制+键盘,因此在界面上就是一个鼠标绘板和一个键盘。
我的是用的fragment 界面上加了一个EditText 高宽都设置为0 这样在界面上就看不到这个控件了




我最外层用的是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 就不生效。。。。。

你可能感兴趣的:(android fragment 中显示和隐藏键盘再监听键盘的值)