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. python(pil)图像处理(等比例压缩、裁剪压缩) 缩略(水印)图
  2. 设计模式C++实现——组合模式
  3. 用户管理:搭建系统微服务
  4. centos 开机执行的命令
  5. 商品pid是什么意思_0基础搞懂自动驾驶传统算法与深度学习的鸿沟-PID控制算法与MLP优化方法...
  6. 【JS 逆向百例】网洛者反爬练习平台第三题:AAEncode 加密
  7. 采用contentprivider扫描手机SD卡的图片资源
  8. 【Vue】一个案例带你搞懂methods、watch及computed的使用规则
  9. iPhone 14系列或均搭载A16芯片:但Pro型号为A16 Pro
  10. 一个简易Android购物App的开发
  11. 中科大计算机博士毕业条件,惊呆!中科大博士毕业6年后再考医学专科,他这样回应……...
  12. 群晖网络不通_网络菜鸟入手Synology群晖 DS218+,求问网络安装环境几个问题?
  13. Qt 与 Qt Creator 简介
  14. error LNK2019: 无法解析的外部符号 _Direct3DCreate9@4,该符号在函数 long __cdecl InitD3D(struct HWND__ *) (?InitD3D
  15. 谷歌云服务_Google Cloud_使用注意
  16. 两种方法编写圆的周长和面积
  17. 全选、全不选、反选功能的实现
  18. .dll文件(DLL文件)
  19. openwrt 恢 复 出厂设置
  20. 【SQL练习】学生成绩查询

热门文章

  1. 阿里斯托芬的剧本《云》
  2. 实现div滚动条默认在最底部
  3. ModelCheckpoint自动保存模型
  4. element el-table组件修改表格表头和某个单元格背景色
  5. 除了谷歌,10个细分搜索引擎扩大你的流量池
  6. 迅为i.MX8M mini开发板Andaoid9系统测试4G
  7. [转] 乔布斯的真正伟大之处在哪里
  8. Zookeeper研究系列之纵观全局
  9. 算法设计与分析(贪心法)
  10. 2021信息安全工程师学习笔记(二)