【问题标题】:How to get KeyCode from Soft Keyboard Android如何从软键盘 Android 获取 KeyCode
【发布时间】:2019-05-09 07:13:36
【问题描述】:

我的代码(如下所示)无法正常运行。我已经尝试了 SO 上已经提出的所有解决方案,但我找不到任何可以解决我的问题的方法。

我的应用程序的目的是获取密钥代码(数字或表示为标签/“KEYCODE_A”)并将其输出到 txt 文件。无论 txt 文件方面如何,我什至无法获取要输出到日志的键码。

来自股票 android 键盘的唯一四个键码是:

KEYCODE_SHIFT_LEFT = 59

KEYCODE_SHIFT_RIGHT = 60

KEYCODE_ENTER = 66

KEYCODE_DEL = 67

请有人帮我将键盘上的字符表示为数值或以其他方式输出到日志、字段或文本文件。

我尝试了很多解决方案,例如

char unicodeChar = (char)event.getUnicodeChar();

试试editText.setOnEditorActionListener

它们不起作用。

提前感谢您的帮助!!!!!!!

public class MainActivity extends AppCompatActivity{

    EditText et_name, et_content;
    Button b_save;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1000);
        }
        et_name = (EditText) findViewById(R.id.et_name);
        et_content = (EditText) findViewById(R.id.et_content);
        final TextView view = (TextView) findViewById(R.id.view);
        b_save = (Button) findViewById(R.id.b_save);


        et_content.setOnKeyListener(new View.OnKeyListener(){
            public boolean onKey(View v, int keyCode, KeyEvent event) {
              //  String keyCodeStr = KeyEvent.keyCodeToString(keyCode);
                //view.setText(String.valueOf(keyCodeStr));
                char unicodeChar = (char) event.getUnicodeChar();
                Log.e("Key", "Code "+keyCode + " " + unicodeChar);
                et_content.getText().append(unicodeChar);


                return true;
            }
        });

        b_save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              String filename = et_name.getText().toString();
              String content = et_content.getText().toString();

              saveTextAsFile(filename, content);
            }
        });
    }

    private void saveTextAsFile (String filename, String content){
        String fileName = filename + ".txt";

        //create file
        File file = new File (Environment.getExternalStorageDirectory().getAbsolutePath(), fileName);

        //write to file
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(content.getBytes());
            fos.close();
            Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show();
        } catch (FileNotFoundException e){
            e.printStackTrace();
            Toast.makeText(this, "File not found", Toast.LENGTH_SHORT).show();
        } catch (IOException e){
            e.printStackTrace();
            Toast.makeText(this, "Error saving", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case 1000:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();
                } else{
                    Toast.makeText(this, "Permission Not Granted", Toast.LENGTH_SHORT).show();
                    finish();
                }
        }
    }

}

感谢您的帮助!

如果需要更多信息,请告诉我,但我非常渴望解决这个问题!

【问题讨论】:

    标签: android android-softkeyboard


    【解决方案1】:

    软键盘很少发送键码。他们倾向于通过输入连接上的 commitText() 调用直接发送文本。它们只是不适用于您希望它们使用的旧“发送硬件密钥事件”模型,没有办法做您正在尝试的事情。

    您可以尝试创建自己的自定义输入连接并在该级别上工作。但我的猜测是,在处理键盘的预测能力和撰写文本(其中部分文本是临时的并且被下一次发送的任何文本覆盖的概念)时,你会遇到很多问题。而且它可能一次发送整个单词而不是字母/击键

    【讨论】:

    • 感谢您的诚实回复@Gabe。关于自定义输入连接的任何建议?我创建了一个没有预测功能的自定义键盘,所以应该会有所帮助。
    • 好吧,如果您愿意仅将其与您自己的自定义键盘一起使用,那么您可以让该键盘发送按键事件——这是可能的,只是它们中的大多数不是这样工作的。使用 inputConnection.sendKeyEvent() 而不是 commitText 和相关调用将做到这一点。如果您想使用任何键盘来执行此操作 - 您需要有一个专注于屏幕的视图,该视图在 getInputConnection 中返回您的自定义输入连接,并且它需要将 commitText 和其他调用转换为您想要的事件。
    • 查看example 了解如何发出键码。
    • @GabeSechan 谢谢你,我只使用自定义键盘。你有什么可以帮助我的吗?我确实考虑过使用从该字段输入的文本,然后以某种方式获取每个字母的 keyup keydown 并将它们附加到文本文件中?关于这是否可行的任何想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多