【问题标题】:Android: hide keyboard and show it again after spinner is closedAndroid:隐藏键盘并在微调器关闭后再次显示
【发布时间】:2017-04-10 22:00:54
【问题描述】:

我有一个带有 Spinner 和 EditText 的活动。如果我关注 EditText,则会显示键盘。好的。如果我然后触摸 Spinner,则键盘应该被隐藏。我得到了这个(见代码)。

现在我的问题: 当我关闭 Spinner 时(无论是否选择了某个项目),如果键盘再次打开 EditText 而不单击它会很好。 (当打开 Spinner 时,焦点仍然在 EditText 上)

EditText myET = (EditText) findViewById(R.id.editText);
Spinner mySpin = (Spinner) findViewById(R.id.spinner);
InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);

Spinner.OnTouchListener hideKeyboard = new Spinner.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        return false;
    }
};
mySpin.setOnTouchListener(hideKeyboard);

【问题讨论】:

    标签: android keyboard spinner android-spinner


    【解决方案1】:

    在 onItemSelected 中使用此代码

    InputMethodManager imm = (InputMethodManager) 
    getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);
    

    这将自动打开下一个editText的键盘。

    【讨论】:

    • 这仅在我选择一个项目时才有效(与已选择的项目不同)
    • 可能在微调器上方的 editText 上,您可以检查当用户单击 Enter 转到下一个 editText(在这种情况下必须关闭键盘)时,您应该检查微调器项目是否选中,如果选中,那么你应该使用上面的代码为下一个editText打开键盘
    【解决方案2】:

    使用此代码在所选项目上再次显示键盘:

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                    // open keyboard code here.
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> adapterView) {
    
                }
            });
    

    注意:使用点击监听器来满足您的要求。由于不支持微调器上的直接单击侦听器,因此请让类扩展微调器并覆盖单击方法,并在此方法中执行您想做的事情。

    /** Spinner extension that calls onItemSelected even when the selection is the same as its previous value */
        public class CutomSpinner extends Spinner {
    
          public CutomSpinner(Context context)
          { super(context); }
    
          public CutomSpinner (Context context, AttributeSet attrs)
          { super(context, attrs); }
    
          public CutomSpinner (Context context, AttributeSet attrs, int defStyle)
          { super(context, attrs, defStyle); }
    
          @Override public void
          setSelection(int position, boolean animate)
          {
            boolean sameSelected = position == getSelectedItemPosition();
            super.setSelection(position, animate);
            if (sameSelected) {
              // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
              getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
            }
          }
    
          @Override public void
          setSelection(int position)
          {
            boolean sameSelected = position == getSelectedItemPosition();
            super.setSelection(position);
            if (sameSelected) {
              // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
              getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
            }
          }
        }
    

    【讨论】:

    • 仅在我选择一个新项目时有效,如果我关闭微调器时使用与之前相同的选择或没有选择
    • 您是否尝试将相同的代码添加到 onNothingSelected() 中?
    • 是的,我做到了。好像这个部分永远不会到达
    • 可能是 Spinner 类似于弹出窗口或下拉列表之类的东西,可以使用其他一些侦听器吗?
    【解决方案3】:

    我找到了可以执行以下操作的解决方案

    当你按下edittext键盘时会显示然后当你按下微调器时它会消失

    然后当你在微调器上选择项目时,即使相同的项目再次出现键盘

    最后的问题是,如果我按下微调器(所以键盘消失)然后我按下屏幕上的任意位置(我希望键盘重新出现)这很容易,只需在每次你让键盘出现时将全局布尔值设置为 true,反之亦然反之亦然,并为活动中的所有视图制作 onClickListener,当然微调器除外,并且 onClickListener 具有以下代码

    boolean keyboardIsVisible; // which is true if keyboard is visible
    if (!keyboardIsVisible) {
            InputMethodManager imm = (InputMethodManager) 
                    getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
    

    这是解决所有问题的代码,除了最终问题,我已经告诉过你如何解决它

    CustomSpinner.java

    public class CustomSpinner extends Spinner {
    
        Context mainContext;
    
        public CustomSpinner(Context context) {
            super(context);
            mainContext = context;
        }
    
        public CustomSpinner (Context context, AttributeSet attrs) {
            super(context, attrs);
            mainContext = context;
        }
    
        public CustomSpinner (Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            mainContext = context;
        }
    
        @Override public void
        setSelection(int position) {
            boolean sameSelected = position == getSelectedItemPosition();
            super.setSelection(position);
            if (sameSelected) {
                Activity activity = (Activity) mainContext;
    
                EditText editText = (EditText) activity.findViewById(R.id.edit_text);
    
                InputMethodManager imm = (InputMethodManager)
                        activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
            }
        }
    }
    

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        EditText editText;
        Button button;
        CustomSpinner customSpinner;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            editText = (EditText) findViewById(R.id.edit_text);
            button = (Button) findViewById(R.id.button);
            customSpinner = (CustomSpinner) findViewById(R.id.spinner);
    
            customSpinner.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    editText.setEnabled(false);
                    editText.setEnabled(true);
                    return false;
                }
            });
    
            customSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                int count = 0;
    
                @Override
                public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                    if (count > 0){
                        InputMethodManager imm = (InputMethodManager)
                                getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
                    }else count++;
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> adapterView) {
                    // Do Nothing
                }
            });
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 2015-09-04
      • 2014-07-19
      相关资源
      最近更新 更多