Android开发:如何避免EditText显示在键盘上方并保留指定输入框状态
嘿,这几个软键盘适配的需求我刚好踩过坑,给你分步骤讲清楚怎么实现,都是实打实的可运行方案:
分步实现方案
需求1:点击EditText时,不让该EditText显示在键盘上方
核心是禁止系统自动把EditText推到键盘上方,我们通过Activity的软键盘模式+布局设置来实现:
- 先在
AndroidManifest.xml里给目标Activity配置软键盘属性:
<activity android:name=".YourTargetActivity" android:windowSoftInputMode="adjustNothing|stateHidden"> </activity>
adjustNothing:软键盘弹出时,系统完全不调整布局,EditText会死死待在原来的位置,绝对不会被推到键盘上方(哪怕被键盘挡住,要是需要EditText可见但不在键盘上方,后续可以结合ScrollView手动控制滚动,而非系统自动滚动)stateHidden:默认隐藏键盘,只有用户主动点击EditText才会弹出
- 如果你的布局用了
ScrollView,要禁止它自动滚到EditText位置,给ScrollView加这个属性:
ScrollView scrollView = findViewById(R.id.your_scroll_view); scrollView.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
之后手动给EditText设置焦点逻辑,这样就不会出现系统把EditText卷到键盘上方的情况了。
需求2:输入EditText1时,不让EditText2显示在键盘上方
这里给你两个实用方案,看你需求选:
方案一:直接隐藏EditText2(简单粗暴)
给EditText1加焦点监听,获得焦点时藏起EditText2:
EditText et1 = findViewById(R.id.editText1); EditText et2 = findViewById(R.id.editText2); et1.setOnFocusChangeListener((v, hasFocus) -> { if (hasFocus) { et2.setVisibility(View.GONE); } else { // 失去焦点后恢复显示 et2.setVisibility(View.VISIBLE); } });
这样输入EditText1时,EditText2直接消失,自然不会出现在键盘上方。
方案二:保留EditText2但不让它被推到键盘上方
要是需要EditText2可见但保持原位,结合需求1的adjustNothing设置,再给EditText1加输入监听确保布局不偏移:
et1.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) { // 强制锁定布局状态 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); } @Override public void afterTextChanged(Editable s) {} });
这样EditText2会一直待在原来的布局位置,不会被键盘顶上去。
需求3:输入EditText2时,保持当前布局状态不变
这个其实和需求1的核心逻辑一致,再给EditText2加个焦点监听加固一下:
et2.setOnFocusChangeListener((v, hasFocus) -> { if (hasFocus) { // 强制布局完全不动 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); } });
这样不管EditText2有没有焦点,布局都不会因为软键盘弹出而有任何变化,完全保持初始状态。
内容的提问来源于stack exchange,提问作者xiaohanhan
相关产品推荐
相关产品推荐

