Android接入WebView(一)——基本用法

Android接入WebView(二)——与JavaScript交互

Android接入WebView(三)——浏览器书签与历史记录与二维码分享

Android接入WebView(四)——浏览器书签与历史记录详细处理

Android接入WebView(五)——浏览器制作总结及源码分享

最近写了一个基于webview和zxing,sqlite实现的一款浏览器

主要功能有:扫描二维码以及打开本地二维码加载网页,书签和历史记录管理,无痕浏览,分享网址,分享网址二维码,浏览器出错自定义等功能。

源码地址:此资源解压后用Android可直接打开

前段时间很忙,现在终于有时间来写写书签和历史记录的详细处理了

由于书签处理和历史记录处理类似,我这里只写怎么处理历史记录,总共包含如下几个函数:

实现的功能:显示历史记录并点击可进入,长按出现功能菜单,以及查看详细信息:

         

好了,现在说几个重要的,文末会给出全部代码

我们进入history Activity后,会显示最近浏览过的网址,按访问时间逆序排序,即最后访问的出现在最前面,这也符合大多数人的使用习惯。

这个函数实现的功能就是逆序查询数据库:

如果返回不为空,布尔变量if_exsit就置为true,再把返回数据绑定到listview上;

如果返回为空,布尔变量if_exsit就置为false,并把listview设置为默认的内容

map.put("title", "暂时没有浏览记录");
map.put("url", "此处是存放您历史记录地方");
//数据库逆序查询函数:public void queryinfo(){final ArrayList<HashMap<String, Object>> listItem = new ArrayList <HashMap<String,Object>>();/*在数组中存放数据*///第二个参数是数据库名dbHelper = new MyDatabaseHelper(this,"usersDataBase",null,1);SQLiteDatabase db = dbHelper.getWritableDatabase();//Cursor cursor = db.rawQuery("select * from bookmarkDB", null);//查询语句也可以这样写Cursor cursor = db.query("historyDB", null, null, null, null, null, "id desc");if (cursor != null && cursor.getCount() > 0) {if_exsit=true;while(cursor.moveToNext()) {get_id=cursor.getInt(0);//得到int型的自增变量get_title = cursor.getString(1);get_url = cursor.getString(2);HashMap<String, Object> map = new HashMap<String, Object>();map.put("title", get_title);map.put("url", get_url);arrayList.add(get_id);listItem.add(map);//new String  数据来源, new int 数据到哪去SimpleAdapter mSimpleAdapter = new SimpleAdapter(this,listItem,R.layout.list_item,new String[] {"title","url"},new int[] {R.id.textView2,R.id.textView3});lv.setAdapter(mSimpleAdapter);//为ListView绑定适配器}}else {if_exsit=false;HashMap<String, Object> map = new HashMap<String, Object>();map.put("title", "暂时没有浏览记录");map.put("url", "此处是存放您历史记录地方");listItem.add(map);//new String  数据来源, new int 数据到哪去SimpleAdapter mSimpleAdapter = new SimpleAdapter(this,listItem,R.layout.item_list,new String[] {"title","url"},new int[] {R.id.textView2,R.id.textView3});lv.setAdapter(mSimpleAdapter);//为ListView绑定适配器}cursor.close();db.close();}

然后是删除数据后的处理:

删除数据后,我们要刷新一次UI,处理如下:

最后两行代码是清空与listview绑定的ArrayList,并且重新执行queryinfo()加载UI

 //删除函数:public void delete(int position){dbHelper = new MyDatabaseHelper(this,"usersDataBase",null,1);SQLiteDatabase db = dbHelper.getWritableDatabase();db.delete("historyDB","id=?",new String[] {String.valueOf(arrayList.get(position))});db.close();Toast.makeText(this,"删除成功",Toast.LENGTH_SHORT).show();//删除后清空数组,重新放入数据,刷新UIarrayList.clear();queryinfo();}

然后是点击listview,当if_exsit为true的时候才返回MainActivity加载网页:

if (if_exsit) {Intent mIntent = new Intent();//没有任何参数(意图),只是用来传递数据mIntent.putExtra("2_data_return", query_by_id(position));setResult(RESULT_OK, mIntent);finish();}

然后是查看详细信息:

在history里面,详细信息显示为TextView,不可编辑,在bookmark里面,为EditText,可以编辑

//url详细信息对话框public void url_infomation(final int position){final Dialog dialog = new Dialog(this, R.style.NormalDialogStyle);View view = View.inflate(this, R.layout.history_url_informatiom, null);text_title = (TextView) view.findViewById(R.id.textView4);text_url = (TextView) view.findViewById(R.id.textView5);dialog.setContentView(view);//使得点击对话框外部可消失对话框dialog.setCanceledOnTouchOutside(true);//设置对话框的大小view.setMinimumHeight((int) (ScreenSizeUtils.getInstance(this).getScreenHeight() * 0.23f));Window dialogWindow = dialog.getWindow();WindowManager.LayoutParams lp = dialogWindow.getAttributes();lp.width = (int) (ScreenSizeUtils.getInstance(this).getScreenWidth() * 0.75f);lp.height = WindowManager.LayoutParams.WRAP_CONTENT;lp.gravity = Gravity.CENTER;dialogWindow.setAttributes(lp);//显示详细信息text_url.setText(query_by_id(position));text_title.setText(titler);dialog.show();}

下面给出完整history Activity的代码:

package mountain_hua.browser;import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;import java.util.ArrayList;
import java.util.HashMap;/*** Created by dhs on 2018/7/27.*/public class history extends AppCompatActivity {private ListView lv;private MyDatabaseHelper dbHelper;private String get_title,get_url;//暂存从数据库得到的title和urlprivate int get_id; //暂存从数据库得到的idprivate String titler, url;//按值查找详细信息int id; //按值查找idprivate TextView text_title, text_url;//书签详细信息edittextprivate ArrayList arrayList=new ArrayList();private boolean if_exsit;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.history);lv=(ListView)findViewById(R.id.history_list);queryinfo();//点击函数:lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {if (if_exsit) {Intent mIntent = new Intent();//没有任何参数(意图),只是用来传递数据mIntent.putExtra("2_data_return", query_by_id(position));setResult(RESULT_OK, mIntent);finish();}}});//长按选择删除lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {if (if_exsit)dialog_bottom(position);return true;}});}//删除函数:public void delete(int position){dbHelper = new MyDatabaseHelper(this,"usersDataBase",null,1);SQLiteDatabase db = dbHelper.getWritableDatabase();db.delete("historyDB","id=?",new String[] {String.valueOf(arrayList.get(position))});db.close();Toast.makeText(this,"删除成功",Toast.LENGTH_SHORT).show();//删除后清空数组,重新放入数据,刷新UIarrayList.clear();queryinfo();}//全部删除public void delete_all(){dbHelper = new MyDatabaseHelper(this,"usersDataBase",null,1);SQLiteDatabase db = dbHelper.getWritableDatabase();Cursor cursor = db.rawQuery("select * from historyDB", null);while (cursor.moveToNext()) {id=cursor.getInt(0);db.delete("historyDB","id=?",new String[] {String.valueOf(id)});}cursor.close();db.close();Toast.makeText(this,"删除成功",Toast.LENGTH_SHORT).show();//删除后清空数组,重新放入数据,刷新UIarrayList.clear();queryinfo();}//全部删除对话框public void delete_all_dialog(){AlertDialog dialog = new AlertDialog.Builder(this).setTitle("确定全部删除吗?")//设置对话框的标题//设置对话框的按钮.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}}).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {delete_all();dialog.dismiss();}}).create();dialog.show();}//数据库逆序查询函数:public void queryinfo(){final ArrayList<HashMap<String, Object>> listItem = new ArrayList <HashMap<String,Object>>();/*在数组中存放数据*///第二个参数是数据库名dbHelper = new MyDatabaseHelper(this,"usersDataBase",null,1);SQLiteDatabase db = dbHelper.getWritableDatabase();//Cursor cursor = db.rawQuery("select * from bookmarkDB", null);//查询语句也可以这样写Cursor cursor = db.query("historyDB", null, null, null, null, null, "id desc");if (cursor != null && cursor.getCount() > 0) {if_exsit=true;while(cursor.moveToNext()) {get_id=cursor.getInt(0);//得到int型的自增变量get_title = cursor.getString(1);get_url = cursor.getString(2);HashMap<String, Object> map = new HashMap<String, Object>();map.put("title", get_title);map.put("url", get_url);arrayList.add(get_id);listItem.add(map);//new String  数据来源, new int 数据到哪去SimpleAdapter mSimpleAdapter = new SimpleAdapter(this,listItem,R.layout.list_item,new String[] {"title","url"},new int[] {R.id.textView2,R.id.textView3});lv.setAdapter(mSimpleAdapter);//为ListView绑定适配器}}else {if_exsit=false;HashMap<String, Object> map = new HashMap<String, Object>();map.put("title", "暂时没有浏览记录");map.put("url", "此处是存放您历史记录地方");listItem.add(map);//new String  数据来源, new int 数据到哪去SimpleAdapter mSimpleAdapter = new SimpleAdapter(this,listItem,R.layout.item_list,new String[] {"title","url"},new int[] {R.id.textView2,R.id.textView3});lv.setAdapter(mSimpleAdapter);//为ListView绑定适配器}cursor.close();db.close();}//按值查找:public String query_by_id(int position){dbHelper = new MyDatabaseHelper(this,"usersDataBase",null,1);SQLiteDatabase db = dbHelper.getWritableDatabase();Cursor cursor = db.rawQuery("select * from historyDB", null);while (cursor.moveToNext()) {url = cursor.getString(2);titler=cursor.getString(1);id=cursor.getInt(0);//找到id相等的就返回urlif (arrayList.get(position).equals(id))break;}cursor.close();db.close();return url;}//url详细信息对话框public void url_infomation(final int position){final Dialog dialog = new Dialog(this, R.style.NormalDialogStyle);View view = View.inflate(this, R.layout.history_url_informatiom, null);text_title = (TextView) view.findViewById(R.id.textView4);text_url = (TextView) view.findViewById(R.id.textView5);dialog.setContentView(view);//使得点击对话框外部可消失对话框dialog.setCanceledOnTouchOutside(true);//设置对话框的大小view.setMinimumHeight((int) (ScreenSizeUtils.getInstance(this).getScreenHeight() * 0.23f));Window dialogWindow = dialog.getWindow();WindowManager.LayoutParams lp = dialogWindow.getAttributes();lp.width = (int) (ScreenSizeUtils.getInstance(this).getScreenWidth() * 0.75f);lp.height = WindowManager.LayoutParams.WRAP_CONTENT;lp.gravity = Gravity.CENTER;dialogWindow.setAttributes(lp);//显示详细信息text_url.setText(query_by_id(position));text_title.setText(titler);dialog.show();}//底部对话框public void dialog_bottom(final int position){//弹出对话框final Dialog dialog = new Dialog(this, R.style.NormalDialogStyle);View view = View.inflate(this, R.layout.history_dialog_bottom, null);dialog.setContentView(view);dialog.setCanceledOnTouchOutside(true);view.setMinimumHeight((int) (ScreenSizeUtils.getInstance(this).getScreenHeight() * 0.23f));Window dialogWindow = dialog.getWindow();WindowManager.LayoutParams lp = dialogWindow.getAttributes();lp.width = (int) (ScreenSizeUtils.getInstance(this).getScreenWidth() * 0.9f);lp.height = WindowManager.LayoutParams.WRAP_CONTENT;lp.gravity = Gravity.BOTTOM;dialogWindow.setAttributes(lp);dialog.show();//点击事件view.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//取消对话框dialog.dismiss();}});view.findViewById(R.id.delete).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//删除制定position,并取消对话框delete(position);dialog.dismiss();}});view.findViewById(R.id.lookup).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//查看、修改dialog.dismiss();url_infomation(position);}});view.findViewById(R.id.clear_all).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//全部删除dialog.dismiss();delete_all_dialog();}});}}

Android接入WebView(四)——浏览器书签与历史记录详细处理相关推荐

  1. android封装浏览器,android利用WebView实现浏览器的封装

    android提供了封装浏览器的接口,可以让开发者利用自己的view显示网页内容.今天又实现研究了一下,利用WebView显示浏览器内容,还可以利用 WebViewClient显示自己需要的内容. 效 ...

  2. android利用WebView实现浏览器的封装

    android提供了封装浏览器的接口,可以让开发者利用自己的view显示网页内容.今天又实现研究了一下,利用WebView显示浏览器内容,还可以利用 WebViewClient显示自己需要的内容.中国 ...

  3. Android之实现夸克浏览器书签和历史页面滑动时候右上角图标切换效果

    1 需求 实现夸克浏览器书签和历史页面滑动时候右上角图标切换效果,页面滑动的时候,图标也左右滑动,但是只是显示其中的一个 https://www.captainai.net/st/ 2 代码实现 xm ...

  4. android webview 弹出浏览器,android – 防止WebView打开浏览器

    我已经为给定的WebView启用了JavaScript,并在WebView中打开了新链接,而不是在浏览器中. 这是主要活动 package com.Afrogfx.pronouns; import a ...

  5. android 设置webview的浏览器标识 User-Agent

    为了便于WEB端统计分析,需要将APP的 user-agent 作特征标记,所以搜索了一下android对webview的User-Agent设置方法,具体如下: // 修改ua使得web端正确判断 ...

  6. android 微信webview,微信浏览器webview调试

    生命不息,折腾不止! QQ浏览器提供微信调试的插件,本来应该是一件很值得高兴的事情,但是TX改不了一贯的作风,产品狗非要设计为强制设置默认浏览器且QQ所有链接都必须使用QQ浏览器打开,并且无法修改(老 ...

  7. android实现在线阅读功能,Android使用WebView实现离线阅读功能

    1.先看效果图,加载动画: 加载完成,注意当前为飞行模式! 2.使用 1).让你的javabean实现OffLineLevelItem接口,因为我的这个离线阅读支持多级下载,比如Demo中的每个频道下 ...

  8. Android开发-WebView的缓存处理和性能优化 实现H5页面秒开【四】

    前言 老早之前就想总结下Webview相关的知识点了,因为互联网大潮中,很多APP都会使用到Webview,像那些不计其数的电商APP,无一例外的使用Webview:或者一些非电商APP中的像广告页面 ...

  9. 火狐浏览器书签(收藏夹)全部消失,历史记录也消失,如何恢复

    火狐浏览器书签(收藏夹)全部消失,历史记录也消失,如何恢复_weixin_34297300的博客-CSDN博客

最新文章

  1. 一个web.Config或app.Config自定义段configSections的示例
  2. 在springboot项目中如何创建子项目
  3. 【机器学习】PyCaret!又一个神仙的自动机器学习库!
  4. python 泛型_Python插件 - 如何创建C#泛型List
  5. 51nod 正整数分组
  6. NOI.AC#2139-选择【斜率优化dp,树状数组】
  7. pandas series取值_【小学生级】pandas入门到精通备查表——AI未来系列3
  8. python数字类型及运算_Python基础教程:运算符以及数据类型解析
  9. CRI 与 ShimV2:一种 Kubernetes 集成容器运行时的新思路
  10. 从零开始使用Vscode调试XV6
  11. 股市最好用的大数据软件_最实用的5款炒股软件
  12. 什么是ASIC芯片?与CPU、GPU、FPGA相比如何?
  13. 图像分类halcon
  14. 最有价值证书——ITIL名列第三
  15. EasyMock 单元测试
  16. JDK9 的字符串底层原理是什么?
  17. 什么是SAP ECC企业控制中心系统 ECC简介
  18. mht文件打开后显示不正常或乱码问题的排除
  19. git推送被拒绝可能的原因
  20. R语言快速制作学术论文三线表

热门文章

  1. 对抗学习DCGAN网络
  2. java hook技术_API Hook基本原理和实现 - - JavaEye技术网站
  3. Failed to list units: No such method ‘ListUnitsFiltered‘ systemctl list-units
  4. python给函数设置超时时间_Python设置函数调用超时
  5. react项目搭建(基础学习笔记)
  6. 快速搭建react项目
  7. python?java?都能制作自己的植物大战僵尸!
  8. FlyAI小课堂:Tensorflow基操
  9. csdn上设置关注博主即可阅读全文【亲测有效】
  10. 一个月把热门关键词做到百度第3经验分享