【问题标题】:Saving data internally to a text file from keyboard input从键盘输入将数据内部保存到文本文件
【发布时间】:2016-07-21 15:53:13
【问题描述】:

我是 android studio 的新手,并按照教程成功构建了一个键盘。我现在正在尝试捕获带时间戳的事件。因此,当按下按钮时,我会得到时间戳。我尝试使用 SQLite 数据库,但遇到了问题。我现在正在尝试创建一个文本文件并将数据保存到文件中。我想知道是否有人可以帮助我解决这个问题。

我对 SO 做了一些研究,只找到了将数据保存到外部 sdcard 的文档,当我尝试修改代码时它不起作用。

import android.content.Context;
import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.media.AudioManager;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.InputConnection;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;

public class SimpleIME extends InputMethodService
        implements KeyboardView.OnKeyboardActionListener {

    private KeyboardView kv;
    private Keyboard keyboard;

    private boolean caps = false;

    @Override
    public View onCreateInputView() {

        kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
        keyboard = new Keyboard(this, R.xml.qwerty);
        kv.setKeyboard(keyboard);
        kv.setOnKeyboardActionListener(this); 
        return kv;
    }

    private void playClick(int keyCode){
        AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
        switch(keyCode){
            case 32:
                am.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR);
                break;
            case Keyboard.KEYCODE_DONE:
            case 10:
                am.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN);
                break;
            case Keyboard.KEYCODE_DELETE:
                am.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE);
                break;
            default: am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
        }
    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {
        InputConnection ic = getCurrentInputConnection();
        playClick(primaryCode);
        switch(primaryCode){
            case Keyboard.KEYCODE_DELETE :
                ic.deleteSurroundingText(1, 0);
                break;
            case Keyboard.KEYCODE_SHIFT:
                caps = !caps;
                keyboard.setShifted(caps);
                kv.invalidateAllKeys();
                break;
            case Keyboard.KEYCODE_DONE:
                ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
                break;
            default:
                char code = (char)primaryCode;
                if(Character.isLetter(code) && caps){
                    code = Character.toUpperCase(code);
                }
                ic.commitText(String.valueOf(code),1);
        }
    }

【问题讨论】:

  • 告诉我们究竟是什么不起作用,您使用了哪些文档等。这是一个广泛的问题,如果有人在没有您提供更多信息的情况下回答它,我不会感到惊讶。另一件需要注意的事情是,使用某些数据库模型通常比在文件中显式保存数据更好。如果你不想直接进入“大”数据库,你可以试试 SugarORM。这是 SQLite 的简单 ORM。
  • @spork 基本上我只想知道如何创建文本文件并在按下按钮时插入时间戳。如何使用 SQLite 做到这一点?

标签: android text-files


【解决方案1】:

要简单地将一些文本写入文件,您可以使用 Java 的内置 FileWriter 或 FileOutputStream。

File root = new File(DIRECTORY_PATH);
File mFile = new File(root, "samples.txt");
FileWriter writer = new FileWriter(gpxfile);
writer.append("String to write.");
writer.flush();
writer.close();

这里已经回答过了:How do I write to a .txt file in Android?

要获得时间戳,我建议使用 Calendar 和 SimpleDateFormat 。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
sdf.format(Calendar.getInstance()); //returns string

【讨论】:

  • 我能把这个功能放在我的创建视图中吗?公共视图 onCreateInputView() { kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);键盘=新键盘(这个,R.xml.qwerty); kv.setKeyboard(键盘); kv.setOnKeyboardActionListener(this);返回千伏; }
  • 你想在按下按钮时保存这个时间戳,所以上面给出的逻辑应该在按钮的onClick方法中实现。你熟悉 OnClickListener 吗?另外,检查编辑
  • 我在上面添加了我的 .java 文件。这就是我所拥有的,并且有效。
  • 不知道你还有没有什么问题。我了解到您在布局中有一个 Button 对象,您想用它来将其保存在手机上,对吗?如果是这样,请在此按钮上设置一个新的 OnClickListener 并使用上述逻辑创建一个方法。另外,请记住对您从其他用户那里获得的任何有用信息进行投票并接受最佳解决方案。
  • 我在布局中没有按钮,因为键盘没有主要活动,您可以使用它来代替您的 android 内置键盘。我只是很困惑在哪里添加文本文件
【解决方案2】:

关于写入内部存储,请查看official docs about writing files to the internal storage。基本上你在你的应用程序私有文件夹中编写一个文件,只有你的应用程序可以访问(它通常在“/data/data/”目录中)。正如文档所说,您将使用“getFilesDir()”来获取您的私有目录路径,您使用 FileOutputStream 编写文件,而您要写入文件的格式取决于您。

【讨论】:

  • 我的应用没有主要活动,这有关系吗?
  • @csciBeginner 你应该只需要一个 Context 对象来获取文件目录
  • 是的,“getFilesDir()”方法来自 Context 类,您的 Activity 或 Service 扩展了该类。
  • 我把上面的代码贴出来了。我应该在哪里添加代码?
  • 我建议你做一个方法来写入数据,比如“writeKeyboardEvent(int keyboardEvent, long timestamp)”,对于时间戳它可以是“System.currentTimeMillis()”方法(它以毫秒为单位为您提供 unix 纪元格式的当前系统时间)。这个方法可以从任何地方调用(比如你的 switch 键盘代码案例),我建议你在另一个线程中写入文件(因为你会锁定 UI 线程)。
猜你喜欢
  • 2013-12-24
  • 2011-02-01
  • 2015-11-02
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多