Android Fragment内EditText软键盘无法隐藏问题求助
解决Fragment中EditText点击自动弹出软键盘的问题
我来帮你搞定这个头疼的问题~你试过的方法没生效,大概率是因为Fragment的生命周期和Activity的配置联动问题,或者键盘隐藏的时机不对,下面给你几个靠谱的解决方案:
方案1:让父布局抢占焦点(最简单有效)
EditText默认会在加载时自动获取焦点并弹出键盘,我们可以让它的父布局先拿到焦点,这样EditText就不会触发键盘弹出了。修改你的FrameLayout布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context="rahuldadoriya.mathsolver.convert.Convert" android:id="@+id/frame_data" android:focusable="true" android:focusableInTouchMode="true"> <!-- 新增这两行 --> <!-- 你的两个EditText保持不变 --> </FrameLayout>
方案2:禁用EditText获取焦点时弹出键盘(API 21+)
如果你的APP最低兼容API 21及以上,可以直接给EditText设置setShowSoftInputOnFocus(false),从根源上禁止它获取焦点时弹键盘:
@Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { final ViewGroup viewGroup = (ViewGroup) inflater.inflate(R.layout.converter_data_layout, container, false); screen_v1 = (EditText) viewGroup.findViewById(R.id.data_value1); screen_v2 = (EditText) viewGroup.findViewById(R.id.data_value2); // 新增这两行代码 screen_v1.setShowSoftInputOnFocus(false); screen_v2.setShowSoftInputOnFocus(false); // 原来的焦点监听可以保留也可以去掉,看你需求 return viewGroup; }
方案3:修复你的hideKeyboard方法(兼容低版本)
如果需要兼容API 21以下,那得优化你原来的隐藏键盘逻辑,确保在正确的时机调用,并且避免空指针:
public void hideKeyboard(Context context, View view) { if (view == null) return; InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); } // 然后在焦点监听里这样调用: screen_v1.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean hasFocus) { if (hasFocus) { // 只有当获取焦点时才隐藏 hideKeyboard(getContext(), view); } } });
为什么你之前的方法没生效?
android:windowSoftInputMode="stateHidden"是针对Activity的,只会在Activity启动时隐藏键盘,但Fragment加载时EditText获取焦点,还是会触发键盘弹出;- 你原来的
hideKeyboard方法里,((Activity)context).getCurrentFocus()可能拿到的不是当前的EditText,或者在调用时view还没拿到焦点,导致view.getWindowToken()为空,隐藏失败; - 焦点监听里没判断
hasFocus,不管是获取还是失去焦点都调用隐藏,时机不对。
可以先试试方案1,简单粗暴见效快,如果不行再用方案2或3~
内容的提问来源于stack exchange,提问作者Rahul Dadoriya
相关产品推荐
相关产品推荐

