如何修复 'Android Soft Keyboard not returning KeyCode'

How to fix 'Android Soft Keyboard not returning KeyCode'

我是 Android 的新手,我正在尝试创建一个应用程序来输出软键盘输入的键码(屏幕上的 android 键盘,而不是物理键盘)从编辑文本字段到文本文件。

所以用户将在编辑文本中输入文本,例如 "hello World",我想将每个文本的键码输出到文本文件。

我最终会得到 Keyup 系统时间和 keydown 系统时间,但这是我以后的问题!

我尝试过各种不同的方法,例如编写自己的软键盘并使用它,以及为每个字符使用 switch 语句。下面代码是我的主要activity:

package com.example.useridentificationapp;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Parcelable;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


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);
        final EditText log  = (EditText) findViewById(R.id.log);
        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));
                log.setText(keyCodeStr + " " + log.getText());
                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();
                }
        }
    }

}

上面的代码只有returns "KEYCODE_ENTER"、"KEYCODE_BACK"、"KEYCODE_SHIFT"和"KEYCODE_DELETE"。这很好,但我希望它 return 对于每个按键,例如,如果用户按下键盘上的 A,我希望它输出 "KEYCODE_A"。我在 "log"(我创建的用于显示用于调试的键码的字段)中没有得到任何内容,对于任何其他键,它只是保持为空,但是该键确实在该字段中输入。

然后我想将其保存在文本文件中。

如有任何帮助,我们将不胜感激!我已经阅读了大量关于 KeyEvent 和相关方法的 android 文档,但我似乎无法正常工作!

非常感谢您的帮助!我花了好几天时间(还有很多时间在网上搜索帮助,但无济于事!)

尝试editText.setOnEditorActionListener

只是为了回答这个问题,由于 Android 处理软键盘输入的方式,它实际上无法完成。

为了解决这个问题,我不得不在屏幕上重新创建按钮的键盘布局,然后才起作用。