首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在碎片替换上显示/隐藏Android软键盘

在碎片替换上显示/隐藏Android软键盘
EN

Stack Overflow用户
提问于 2014-09-05 06:23:06
回答 8查看 15.2K关注 0票数 24

我有一个包含片段的活动。让我们假设有一个列表片段,其中包含一系列内容。现在,我想让用户添加一个东西,所以我使用FragmentManager将列表片段替换为具有EditText的插入片段。EditText获得焦点,光标闪烁。但是软键盘打不开。反过来也是一样的:如果用户输入了新的内容并将其添加到列表中,我就用一个列表片段替换掉插入片段。但是,尽管不再有EditText,键盘却无法关闭。

实现这一点的正确方法是什么?我不敢相信我必须在所有的转换中手动显示和隐藏键盘?!

EN

回答 8

Stack Overflow用户

发布于 2015-05-26 03:29:57

我想做以下几件事:

扩展Fragment classOverride onAttach()onDetach() callbacksImplement显示和隐藏软件键盘方法

示例代码:

代码语言:javascript
复制
class MyFragment extends Fragment {
   @Override
   public void onAttach(Activity activity) {
       super.onAttach(activity);

       //show keyboard when any fragment of this class has been attached
       showSoftwareKeyboard(true);
   }

   @Override
   public void onDetach() {
       super.onDetach();

       //hide keyboard when any fragment of this class has been detached
       showSoftwareKeyboard(false);
   }

   protected void showSoftwareKeyboard(boolean showKeyboard){
       final Activity activity = getActivity();
       final InputMethodManager inputManager = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);

       inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), showKeyboard ? InputMethodManager.SHOW_FORCED : InputMethodManager.HIDE_NOT_ALWAYS);
   }
}
票数 9
EN

Stack Overflow用户

发布于 2015-05-26 00:37:53

我的应用程序也有同样的问题,最后我们有两个选择,首先创建一个通用函数并在所有转换中调用它,或者创建一个全局转换,如下所示:

代码语言:javascript
复制
public static void RemoveAndReplaceFragment(FragmentManager fragmentManager, int FragmentContent, Fragment PlaceHolderFragment,Activity context){
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.remove(fragmentManager.findFragmentById(R.id.frgMainActivity))
                .commit();

        //Close keyBoard in transition
        InputMethodManager inputManager = (InputMethodManager) context.getSystemService(
                Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(),
                InputMethodManager.HIDE_NOT_ALWAYS);

        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.animation_fade_in,R.anim.animation_fade_out);
        fragmentTransaction.replace(R.id.frgMainActivity, new PlaceholderFragment_MainActivity_AcceptAndFollowTask()).commit();
    }
}

最好的方法是捕获过渡事件,但目前我们不能...如果我能帮你,请告诉我,祝你好运!

票数 3
EN

Stack Overflow用户

发布于 2015-05-22 20:18:34

这肯定会起作用:

代码语言:javascript
复制
private void hideKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }

    private void showKeyboard(){
    EditText myEditText = (EditText) findViewById(R.id.myEditText);  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
   }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25675883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档