【问题标题】:How to fix 'Android Soft Keyboard not returning KeyCode'如何修复“Android 软键盘不返回 KeyCode”
【发布时间】:2019-05-06 16:28:04
【问题描述】:

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

因此,用户将在编辑文本中输入文本,例如“hello World”,我想将其中每个的关键代码输出到文本文件中。

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

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

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();
                }
        }
    }

}

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

然后我想把它保存在一个文本文件中。

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

非常感谢您的帮助!我已经花了好几天(以及很多小时在互联网上寻找帮助但无济于事!)

【问题讨论】:

    标签: android android-softkeyboard


    【解决方案1】:

    试试editText.setOnEditorActionListener

    【讨论】:

    • 我尝试使用以下代码实现 setOnEditActionListener ``` et_content.setOnEditActionListener(new TextView.OnEditorActionListener(){ public boolean onEditorAction(TextView v, int keyCode, KeyEvent event) { String keyCodeStr = KeyEvent.keyCodeToString(keyCode); view.setText(String.valueOf(keyCodeStr)); log.setText(keyCodeStr + " " + log.getText()); return true; } }); ```但是android studio会抛出错误??找不到符号方法?
    【解决方案2】:

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

    为了解决这个问题,我必须在屏幕上重新创建按钮的键盘布局,然后才能工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多