记录一次软键盘不能调出来的问题

一、前提条件

设置其所在Activity,AndroidManifest.xml属性 android:windowSoftInputMode=“stateVisible|adjustResize”
EditText点击本身的话,据系统规则会调用起软键盘

二、操作表现

点击EditText,系统没有调用软键盘,不知为何原因?
故手动调用软键盘看能不能调用起来

InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);imm.showSoftInput(mContentEditText, InputMethodManager.SHOW_FORCED);

发现仍然不能调用起软键盘,故Debug showSoftInput的源代码

三、追踪问题

1、只有Debug showSoftInput源代码,最终定位到

public boolean showSoftInput(View view, int flags, ResultReceiver resultReceiver) {        checkFocus();        synchronized (mH) {            if (mServedView != view && (mServedView == null                    || !mServedView.checkInputConnectionProxy(view))) {                return false;            }            try {                return mService.showSoftInput(mClient, flags, resultReceiver);            } catch (RemoteException e) {                throw e.rethrowFromSystemServer();            }        }    }

发现传过来的view是EditView,没有任何问题,问题在mServedView != view返回为true,mServedView竟然为另外的view,故不能向下调用mService.showSoftInput(mClient, flags, resultReceiver)去启用软键盘

2、寻找mServedView的赋值位置

private boolean checkFocusNoStartInput(boolean forceNewFocus) {        // This is called a lot, so short-circuit before locking.        if (mServedView == mNextServedView && !forceNewFocus) {            return false;        }        final ControlledInputConnectionWrapper ic;        synchronized (mH) {            if (mServedView == mNextServedView && !forceNewFocus) {                return false;            }            if (DEBUG) Log.v(TAG, "checkFocus: view=" + mServedView                    + " next=" + mNextServedView                    + " forceNewFocus=" + forceNewFocus                    + " package="                    + (mServedView != null ? mServedView.getContext().getPackageName() : ""));            if (mNextServedView == null) {                finishInputLocked();                // In this case, we used to have a focused view on the window,                // but no longer do.  We should make sure the input method is                // no longer shown, since it serves no purpose.                closeCurrentInput();                return false;            }            ic = mServedInputConnectionWrapper;            mServedView = mNextServedView;            mCurrentTextBoxAttribute = null;            mCompletions = null;            mServedConnecting = true;        }        if (ic != null) {            ic.finishComposingText();        }        return true;    }

最终定位于Activity中EditView的焦点失去,导致mServedView重新被赋值,mServedView = mNextServedView;
所以… …

更多相关文章

  1. Android(安卓)Overlay学习 一
  2. Android(安卓)EditText获取焦点后只显示光标不弹出软键盘
  3. 配置dialog无标题的几种方法
  4. 【Android】使用SearchView时软键盘不支持actionSearch的问题
  5. setImageResource和setImageDrawable区别
  6. Android(安卓)Frame Animation 帧动画不播放问题。
  7. super.onCreate(savedInstanceState); setContentView(R.layout.
  8. android Onmeasure
  9. 【Android】使用persist属性来调用脚本文件

随机推荐

  1. 解决TextView中MaxLines与ellipsize=end
  2. Android屏幕100%适配方案
  3. eclipse中build没有apk输出
  4. Android之——AIDL深入
  5. android app请求获取root权限
  6. Android(安卓)TTS 使用教程
  7. Android之怎么隐藏EditText光标和自动显
  8. Android开发设置Activity全屏与不全屏的
  9. 基于Android的Linux内核的电源管理
  10. Android程序入口ActivityThread和Android