weixin_40547914 2017-10-09 09:50 采纳率: 0%
浏览 646

为什么我自制的andriod词典一输入就退出

package com.aaaa.aaaa;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.TextView;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class MainActivity extends Activity implements OnClickListener,
TextWatcher {
// 定义数据库的存放路径
private final String DATABASE_PATH = android.os.Environment
.getExternalStorageDirectory().getAbsolutePath() + "/dictionary";
// 用户输入文本框
private AutoCompleteTextView word;
// 定义数据库的名字
private final String DATABASE_FILENAME = "dictionary.db";
private SQLiteDatabase database;
private Button searchWord;
// 用户显示查询结果
private TextView showResult;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 打开数据库
    database = openDatabase();
    searchWord = (Button) findViewById(R.id.searchWord);
    word = (AutoCompleteTextView) findViewById(R.id.word);
    // 绑定监听器
    searchWord.setOnClickListener(this);
    word.addTextChangedListener(this);
    showResult = (TextView) findViewById(R.id.result);
}

public class DictionaryAdapter extends CursorAdapter {
    private LayoutInflater layoutInflater;

    public DictionaryAdapter(Context context, Cursor c, boolean flags) {
        super(context, c, flags);
        layoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public CharSequence convertToString(Cursor cursor) {
        return cursor == null ? "" : cursor.getString(cursor
                .getColumnIndex("_id"));
    }

    // 生成新的选项
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View view = layoutInflater.inflate(R.layout.word_list_item, null);
        setView(view, cursor);
        return view;
    }

    // 绑定选项到列表中
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        setView(view, cursor);
    }

    // 将单词信息显示到列表中
    private void setView(View view, Cursor cursor) {
        TextView tvWordItem = (TextView) view;
        tvWordItem.setText(cursor.getString(cursor.getColumnIndex("_id")));
    }

}

// 打开数据库
private SQLiteDatabase openDatabase() {
    try {
        // 获得dictionary.db文件的绝对路径
        String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
        File dir = new File(DATABASE_PATH);
        // 如果目录不存在,则创建这个目录
        if (!dir.exists()) {
            dir.mkdir();
        }
        // 如果在/sdcard/dictionary目录中不存在
        // dictionary.db文件,则从res\raw目录中复制这个文件到
        // SD卡的目录(/sdcard/dictionary)
        if (!(new File(databaseFilename)).exists()) {
            // 获得封装dictionary.db文件的InputStream对象
            InputStream is = getResources().openRawResource(
                    R.raw.dictionary);
            FileOutputStream fos = new FileOutputStream(databaseFilename);
            byte[] buffer = new byte[8192];
            int count = 0;
            // 开始复制dictionary.db文件
            while ((count = is.read(buffer)) > 0) {
                fos.write(buffer, 0, count);
            }
            // 关闭文件流
            fos.close();
            is.close();
        }
        // 打开/sdcard/dictionary目录中的dictionary.db文件
        SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
                databaseFilename, null);
        return database;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

@Override
public void onClick(View v) {
    // 查询指定的单词
    String sql = "select chinese from t_words where english=?";
    Cursor cursor = database.rawQuery(sql, new String[] { word.getText()
            .toString() });
    String result = "未找到该单词.";
    // 如果查找单词,显示其中文的意思
    if (cursor.getCount() > 0) {
        // 必须使用moveToFirst方法将记录指针移动到第1条记录的位置
        cursor.moveToFirst();
        result = cursor.getString(cursor.getColumnIndex("chinese"))
                .replace("&", "&");
    }
    // 将结果显示到TextView中
    showResult.setText(word.getText() + "\n" + result.toString());
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
                              int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {
    // 必须将english字段的别名设为_id
    Cursor cursor = database.rawQuery(
            "select english as _id from t_words where english like ?",
            new String[] { s.toString() + "%" });
    // 新建新的Adapter
    DictionaryAdapter dictionaryAdapter = new DictionaryAdapter(this,
            cursor, true);
    // 绑定适配器
    word.setAdapter(dictionaryAdapter);
}

}

  • 写回答

1条回答 默认 最新

  • ziyejinwei1994 2017-10-10 02:38
    关注

    把退出的日志放出来,放代码一般没人看出来

    评论

报告相同问题?

悬赏问题

  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题