Android棒棒糖无法获得键盘输入

时间:2014-11-21 08:53:27

标签: android input keyboard

除了Android Lollipop(5.0)之外,我的所有Android版本都有用户键盘输入。

我用它来打开软件键盘:

 public static void OpenKeyBoard(){     
MainActivity._Instance.runOnUiThread(new Runnable() {
    public void run() {         
        InputMethodManager imm = (InputMethodManager)    MainActivity._Instance.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(MainActivity._Instance.getWindow().getDecorView(), 0);        
    }
});                     

}

我通过标准事件获得用户输入:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{   

我有这个代码适用于Android的所有Lollipop前版本。当我在Lollipop上使用它时,会出现软件键盘,但当我尝试点击任何字母/数字时,键盘消失,方法“onKeyDown”不会收到任何键码。

有人有这个问题吗?任何意见如何解决这个问题?

谢谢。

5 个答案:

答案 0 :(得分:0)

尝试将您的谷歌SDK更新到最新版本,我做了,这解决了我在键盘解雇时遇到的任何问题。

答案 1 :(得分:0)

我也有这个问题。我设法通过覆盖onLayout,onFocusChanged&来解决这个问题。 WebView中的onCheckIsTextEditor方法。这是使其工作的代码(我以编程方式生成webview):

        this.webView = new WebView(context)
        {
            boolean layoutChangedOnce = false;

            @Override
            protected void onLayout(boolean changed, int l, int t, int r, int b)
            {
                if (!layoutChangedOnce)
                {
                    super.onLayout(changed, l, t, r, b);
                    layoutChangedOnce = true;
                }
            }

            @Override
            protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect)
            {
                super.onFocusChanged(true, direction, previouslyFocusedRect);
            }

            @Override
            public boolean onCheckIsTextEditor()
            {
                return true;
            }
        };

        this.webView.setFocusable(true);
        this.webView.setFocusableInTouchMode(true);
        this.webView.requestFocus(View.FOCUS_DOWN);

        addView(this.webView);

答案 2 :(得分:0)

此问题不仅限于Android应用程序,还会在手机浏览器中使用javascript或jquery访问任何键盘相关事件时发生。

例如。我的网站要求用户在某个页面上输入邮政编码(数字字符)。现在的问题是当点击输入框时,会出现数字键盘,但它也允许您在其中粘贴字母数字字符。

到目前为止搜索的原因, 尝试通过桌面以及运行Android OS 5.0+的移动设备访问this并尝试不同的可能击键。

注意:

  1. 使用上述移动设备输入任何字母字符时 提到的配置显示了' 229'作为键码。

  2. 当您使用桌面输入任何字母字符时,它会显示 适当的密码。

答案 3 :(得分:0)

这对我有用我有一个SurfaceView实现SurfaceHolder.Callback与一个线程来做绘图

@Override
public boolean onTouchEvent(MotionEvent event)
{
    synchronized (this)
    {
        mouse.useEvent(event);
    }
    return true;
}


@Override
public InputConnection onCreateInputConnection(EditorInfo editorinfo) {

    BaseInputConnection bic = new BaseInputConnection(this, false);
    editorinfo.actionLabel = null;
    editorinfo.inputType = InputType.TYPE_NULL;
    editorinfo.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN;
    bic.finishComposingText();
    return bic;
}

@Override
public boolean dispatchKeyEvent(KeyEvent event)
{

    input.useEvent(event);
    return super.dispatchKeyEvent(event);
}

答案 4 :(得分:0)

我已经使用AlertDialog editText以编程方式解决了这个问题。例如:

public void KeyboardTextField(int id){              
    if (id == 0){
        final String title = getStringResourceByName("profile_title");       
        final String createP = getStringResourceByName("profile_confirm");
        final String cancel = getStringResourceByName("profile_cancel");    

        MainActivity._Instance.ActivityWillBeShown = true;
        MainActivity._Instance.runOnUiThread(new Runnable() {
              public void run() {                   
                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity._Instance);
                alert.setCancelable(false);

                alert.setTitle(title);
               // alert.setMessage(""); // message

                // Set an EditText view to get user input 
                final EditText input = new EditText(MainActivity._Instance);
                final int maxLength = 12;                       

                input.setFilters(new InputFilter[] {new InputFilter() {                     
                    @Override
                    public CharSequence filter(CharSequence source, int start, int end,
                            Spanned dest, int dstart, int dend) {
                        if (source != null && blockCharacterSet.contains(("" + source))) {
                         return "";
                        }                           
                        // TODO Auto-generated method stub
                        return null;
                    }
                } , new InputFilter.LengthFilter(maxLength)});

                //input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_CLASS_NUMBER);
                input.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); //turn off txt auto complete
                input.setInputType(InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS); // type only text,numbers and some special char              

                alert.setView(input);
                //input.setText("Player");

                alert.setPositiveButton(createP, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                  String value = input.getText().toString();
                  // Do something with value!   

                  if (value.isEmpty()){
                      value = "Player";
                  }

                  nativeName(value);                     

                  InputMethodManager imm = (InputMethodManager)getSystemService(
                          Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);

                }

                });

                alert.setNegativeButton(cancel, new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int whichButton) {
                    // Canceled.
                      InputMethodManager imm = (InputMethodManager)getSystemService(
                              Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
                  }
                });

                alert.show();                  
              };
        });
    }

每当你需要键盘时,你只需要调用此功能。它适用于所有Android版本(4.x,5.x,6.0)