参考https://blog.csdn.net/yyingwei/article/details/8128899这篇博客尝试了一下Android 浏览器开发,然后尝试把浏览过的链接保存起来下次输入的时候可以自动选择。
代码中控制这些字符串是通过ArrayAdapter,每次打开时先创建一个空的ArrayAdapter,然后从数据库里读出保存的url添加到ArrayAdapter中,再用AutoCompleteTextView.setAdapter完成配置。
在setAdapter之后可以动态地修改ArrayAdapter对象的内容,这些修改都能同步到页面上。
数据库的定义:
import android.content.Context; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import androidx.annotation.Nullable; public class BrowserDatabaseHelper extends SQLiteOpenHelper { private Context mContext; private static final String SQL_CREATE_URL_HISTORY = "create table url_history (url text primary key)"; //这里数据库只需要在onCreate时执行这一句,创建名为url_history的表,其中有一列名为url并且是主key public BrowserDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) { super(context, name, factory, version, errorHandler); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(SQL_CREATE_URL_HISTORY); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
url_history是表名字,url是唯一的一列,设置为primary key.
保存和读取浏览过的链接:
url = (AutoCompleteTextView)activity.findViewById(R.id.url); mBrowserDatabaseHelper = new BrowserDatabaseHelper(this, DATABASE_NAME, null, 1, null); //DATABASE_NAME可以自己定义,1是版本号最小为1 SQLiteDatabase db = mBrowserDatabaseHelper.getReadableDatabase(); Cursor cursor = db.query("url_history", null, null, null, "url", null, null); //获取光标查询"url"这一列 ArrayAdapter<String> openUrlAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line); //这里创建了一个空的ArrayAdapter<String> while(cursor.moveToNext()) { //一开始从数据库里读取所有已存的链接 openUrlAdapter.add(cursor.getString(cursor.getColumnIndex("url"))); } cursor.close(); url.setAdapter(openUrlAdapter); //将ArrayAdapter配置到AutoCompleteTextView url.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) { String strUrl = url.getText().toString(); ContentValues values = new ContentValues(); values.clear(); values.put("url", strUrl); //这里要用insertWithOnConflict并且参数要用SQLiteDatabase.CONFLICT_IGNORE,为了不重复添加,需要在数据库中把"url"设置成主key if(mBrowserDatabaseHelper.getReadableDatabase().insertWithOnConflict("url_history", null, values, SQLiteDatabase.CONFLICT_IGNORE) > 0) { openUrlAdapter.add(strUrl); //如果没有重复,则在添加到数据库的同时也添加到当前的ArrayAdapter中 } Pattern p = Pattern.compile("https://([\\w-]+\\.)+[\\w-]+(/[\\w-\\./?%=]*)?"); Matcher m = p.matcher(strUrl); if(!m.find()) { strUrl = "https://" + strUrl; } if(strUrl == null)strUrl = "https://cn.bing.com"; show.loadUrl(strUrl); return true; } return false; } });