首页
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
Search
1
职教云小助手重构更新,职教云助手最新版下载地址【已和谐】
13,329 阅读
2
职教云-智慧职教,网课观看分析(秒刷网课)
10,943 阅读
3
gradle-5.4.1-all.zip下载
8,841 阅读
4
职教云-智慧职教,签到补签分析(逆天改命系列)
7,830 阅读
5
一个优秀的程序员从写文档开始:免费领14个月语雀云笔记会员
6,870 阅读
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
登录
/
注册
Search
Lan
累计撰写
624
篇文章
累计收到
615
条评论
首页
栏目
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
页面
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
搜索到
17
篇与
的结果
2021-02-23
android stadio 一直在下载download fastutil-7.2.0.jar
重新装了个系统,然后新装Android Studio导入项目时一直在下载 fastutil-7.2.0.jar原因是需要科学。所以改一下你的buil.gradlebuildscript { repositories { maven{ url = "http://maven.aliyun.com/nexus/content/groups/public/" } google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { maven{ url = "http://maven.aliyun.com/nexus/content/groups/public/" } google() jcenter() } }
2021年02月23日
1,790 阅读
0 评论
0 点赞
2020-11-24
Android为属性组件动画无效
本来我的代码是这样的然后发现这动画只能在窗体onCreate的时候使用有效。放在点击事件之类的就不行了。后经百度发现需要开始动画而不是设置动画carImg.startAnimation(animation);
2020年11月24日
517 阅读
0 评论
0 点赞
2020-11-18
JavaScript调用Android方法,显示Echarts
开个坑,以后写
2020年11月18日
550 阅读
3 评论
0 点赞
2020-10-30
安卓实时获取数据并刷新图表
先来个效果图吧然后直接上代码,解说以后有机会我再补上assets>index.html<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <script src="./js/echarts.min.js"></script> <title>Document</title> </head> <body> <div id="main" style="width: 400px;height:400px;"></div> <script type="text/javascript" src="./js/echarts.min.js"></script> <script> var myChart = echarts.init(document.getElementById('main')); function updateData(jsonstr) { var shuju = JSON.parse(jsonstr); option = { xAxis: { type: 'category', data: shuju.data, }, yAxis: { type: 'value' }, series: [{ data: shuju.wendu, type: 'line' }] }; myChart.setOption(option); } </script> </body> </html>Mainactivity.javapackage cn.lanol.wendu; import androidx.annotation.NonNull; import androidx.annotation.UiThread; import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.webkit.JavascriptInterface; import android.webkit.WebView; import android.widget.Button; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import java.io.IOException; import java.sql.Time; import java.util.Timer; import java.util.TimerTask; import cn.lanol.wendu.Helper.GetContext; import cn.lanol.wendu.Helper.SQLiteDBhelper; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class MainActivity extends AppCompatActivity { private SQLiteDBhelper dBhelper = new SQLiteDBhelper(GetContext.getContext(), "DATA", null, 1); private SQLiteDatabase db = dBhelper.getReadableDatabase(); private WebView webView; private Handler handler; @SuppressLint({"SetJavaScriptEnabled", "HandlerLeak"}) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化数据库 new Thread(new Runnable() { @Override public void run() { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { getWenDuData(); Message msg = new Message(); msg.what = 1; handler.sendMessage(msg); } }, 0, 60000); } }).start(); webView = findViewById(R.id.echartsView); webView.getSettings().setAllowFileAccess(true); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl("file:///android_asset/index.html"); handler = new Handler() { @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); Log.d("标签", "handleMessage: " + msg.what); webView.loadUrl("javascript:updateData('" + getNewData() + "')"); } }; try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } public String getNewData() { dBhelper.getWritableDatabase(); String wenduJson = "["; String timeJson = "["; Cursor a = db.query("WenDu", null, null, null, null, null, "ID desc", "5"); if (a.moveToFirst()) { do { String time = a.getString(a.getColumnIndex("time")); String wendu = a.getString(a.getColumnIndex("wendu")); wenduJson += """ + wendu + "","; timeJson += """ + time + "","; } while (a.moveToNext()); } timeJson = timeJson.substring(0, timeJson.length() - 1) + ']'; wenduJson = wenduJson.substring(0, wenduJson.length() - 1) + ']'; String result = "{"data":" + timeJson + ","wendu":" + wenduJson + "}"; return result; } public void getWenDuData() { OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder().url("https://api.565.ink/json").get().build(); try { Response response = okHttpClient.newCall(request).execute(); String res = response.body().string(); JsonObject a = JsonParser.parseString(res).getAsJsonObject(); String time = a.get("time").getAsString(); String wendu = a.get("wendu").getAsString(); Cursor cursor = db.query("WenDu", null, "time like '%" + time + "%'", null, null, null, null); if (cursor.moveToFirst()) { Log.d("已存在", time); } else { ContentValues values = new ContentValues(); values.put("time", time); values.put("wendu", wendu); db.insert("WenDu", null, values); Log.d("不存在", time); } Log.d("结果", time + "," + wendu); } catch (IOException e) { e.printStackTrace(); } } }activity_main.xml<?xml version="1.0" encoding="utf-8"?> <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" tools:ignore="WebViewLayout"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="温度" /> <WebView android:id="@+id/echartsView" android:layout_width="match_parent" android:layout_height="400dp" /> </LinearLayout> <com.google.android.material.navigation.NavigationView android:id="@+id/navigationView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="start" /> </androidx.drawerlayout.widget.DrawerLayout>AndroidMainifest.xml<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="cn.lanol.wendu"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" android:name=".Helper.GetContext" tools:ignore="GoogleAppIndexingWarning"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>SQLiteDBHelper.javapackage cn.lanol.wendu.Helper; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.widget.Toast; import androidx.annotation.Nullable; public class SQLiteDBhelper extends SQLiteOpenHelper { private Context mcontext; private static final String CREATE_WENDU = "create table WenDu(id integer primary key autoincrement,time text,wendu integer)"; public SQLiteDBhelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mcontext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_WENDU); Toast.makeText(GetContext.getContext(), "欢迎使用温度实时监控系统", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }GetContext.javapackage cn.lanol.wendu.Helper; import android.app.Application; import android.content.Context; public class GetContext extends Application { private static Context context; @Override public void onCreate() { super.onCreate(); context = getApplicationContext(); } public static Context getContext() { return context; } }目录结构
2020年10月30日
686 阅读
0 评论
0 点赞
2020-10-22
Gson解析百度实时热榜Json数据
OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder().url("http://top.baidu.com/mobile_v2/buzz/hotspot").build(); try { Response response = okHttpClient.newCall(request).execute(); ArrayList<NewsContent> newss = new ArrayList<>(); JsonObject a = JsonParser.parseString(response.body().string()).getAsJsonObject(); JsonElement result = a.get("result").getAsJsonObject().get("descs"); JsonArray jsonArray = result.getAsJsonArray(); for (JsonElement newContent : jsonArray) { NewsContent newsContent = new Gson().fromJson(newContent.getAsJsonObject().get("content").getAsJsonObject().get("data").getAsJsonArray().get(0).toString(), NewsContent.class); newss.add(newsContent); Log.d("标题", newsContent.getTitle()); } } catch (IOException e) { e.printStackTrace(); }
2020年10月22日
534 阅读
0 评论
0 点赞
2020-10-19
按照第一行代码使用ToolBar报错。
Unable to start activity ComponentInfo{cn.lanol.studykongjian/cn.lanol.studykongjian.MainActivity}: android.view.InflateException: Binary XML file line #11 in cn.lanol.studykongjian:layout/activity_main: Binary XML file line #11 in cn.lanol.studykongjian:layout/activity_main: Error inflating class android.support.v7.widget.Toolbar经过尝试发现,现在似乎ToolBar不能像书上那样写了。<android.support.v7.widget.Toolbar android:id="@+id/toolBar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />应该这样写<androidx.appcompat.widget.Toolbar android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
2020年10月19日
703 阅读
0 评论
0 点赞
2020-10-15
Android webView打开网页
这个就比较简单了,直接拖一个控件,再加载一下url,记得在AndroidManifest.xml中加一下权限WebView webView = findViewById(R.id.web); String url = "https://www.lanol.cn"; webView.loadUrl(url);<uses-permission android:name="android.permission.INTERNET" />还有下面的就是网上的一些文章,留以记录Android WebView:https://www.jianshu.com/p/b6f2f1334053生命周期:onResume():活跃状态,可以正常执行网页的响应。onPause():暂停状态,页面被失去焦点,暂停所有进行中的动作,如:DOM解析、CSS和JavaScript执行等。pauseTimers():全局WebView暂停状态,如:layout、parsing、javascripttimer等。resumeTimers():恢复到pauseTimers()执行前的状态。destroy():销毁状态,释放资源。注意:使用WebView不当容易引起内存泄漏,所以WebView的生命周期方法应跟随Activity的生命周期的方法来调用。WebSettings控件的相关配置WebSettings webSettings = webView.getSettings();webSettings.setJavaScriptEnabled(true); -> 是否开启JS支持 webSettings.setPluginsEnabled(true); -> 是否开启插件支持 webSettings.setJavaScriptCanOpenWindowsAutomatically(true); -> 是否允许JS打开新窗口 webSettings.setUseWideViewPort(true); -> 缩放至屏幕大小 webSettings.setLoadWithOverviewMode(true); -> 缩放至屏幕大小 webSettings.setSupportZoom(true); -> 是否支持缩放 webSettings.setBuiltInZoomControls(true); -> 是否支持缩放变焦,前提是支持缩放 webSettings.setDisplayZoomControls(false); -> 是否隐藏缩放控件 webSettings.setAllowFileAccess(true); -> 是否允许访问文件 webSettings.setDomStorageEnabled(true); -> 是否节点缓存 webSettings.setDatabaseEnabled(true); -> 是否数据缓存 webSettings.setAppCacheEnabled(true); -> 是否应用缓存 webSettings.setAppCachePath(uri); -> 设置缓存路径 webSettings.setMediaPlaybackRequiresUserGesture(false); -> 是否要手势触发媒体 webSettings.setStandardFontFamily("sans-serif"); -> 设置字体库格式 webSettings.setFixedFontFamily("monospace"); -> 设置字体库格式 webSettings.setSansSerifFontFamily("sans-serif"); -> 设置字体库格式 webSettings.setSerifFontFamily("sans-serif"); -> 设置字体库格式 webSettings.setCursiveFontFamily("cursive"); -> 设置字体库格式 webSettings.setFantasyFontFamily("fantasy"); -> 设置字体库格式 webSettings.setTextZoom(100); -> 设置文本缩放的百分比 webSettings.setMinimumFontSize(8); -> 设置文本字体的最小值(1~72)webSettings.setDefaultFontSize(16); -> 设置文本字体默认的大小 webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); -> 按规则重新布局 webSettings.setLoadsImagesAutomatically(false); -> 是否自动加载图片 webSettings.setDefaultTextEncodingName("UTF-8"); -> 设置编码格式 webSettings.setNeedInitialFocus(true); -> 是否需要获取焦点 webSettings.setGeolocationEnabled(false); -> 设置开启定位功能 webSettings.setBlockNetworkLoads(false); -> 是否从网络获取资源WebViewClient控件客户端,用于处理各种通知和请求事件。onPageStarted():页面开始加载时调用,这时候可以显示加载进度条,让用户耐心等待页面的加载。onPageFinished():页面完成加载时调用,这时候可以隐藏加载进度条,提醒用户页面已经完成加载。onLoadResource():页面每次加载资源时调用。shouldOverrideUrlLoading():WebView加载url默认会调用系统的浏览器,通过重写该方法,实现在当前应用内完成页面加载。onReceivedError():页面加载发生错误时调用,这时候可以跳转到自定义的错误提醒页面,总比系统默认的错误页面美观,优化用户体验。onReceivedHttpError():页面加载请求时发生错误。onReceivedSslError():页面加载资源时发生错误。shouldOverrideKeyEvent():覆盖按键默认的响应事件,这时候可以根据自身的需求在点击某些按键时加入相应的逻辑。onScaleChanged():页面的缩放比例发生变化时调用,这时候可以根据当前的缩放比例来重新调整WebView中显示的内容,如修改字体大小、图片大小等。shouldInterceptRequest():可以根据请求携带的内容来判断是否需要拦截请求。WebViewClient webViewClient = new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { } @Override public void onPageFinished(WebView view, String url) { } @Override public boolean onLoadResource(WebView view, String url) { } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; -> 消费事件终止传递 } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){ view.loadUrl("file:///android_assets/error.html"); -> assets目录下放置文件}webView.setWebViewClient(webViewClient);WebChromeClient浏览器客户端,用于处理网站图标、网站标题、网站弹窗等。onProgressChanged():页面加载进度发生变化时调用,可以通过该方法实时向用户反馈加载情况,如显示进度条等。onReceivedIcon():接收Web页面的图标,可以通过该方法把图标设置在原生的控件上,如Toolbar等。onReceivedTitle():接收Web页面的标题,可以通过该方法把图标设置在原生的控件上,如Toolbar等。onJsAlert():处理JS的Alert对话框。onJsPrompt():处理JS的Prompt对话框。onJsConfirm():处理JS的Confirm对话框。onPermissionRequest():Web页面请求Android权限时调用。onPermissionRequestCanceled():Web页面请求Android权限被取消时调用。onShowFileChooser():Web页面上传文件时调用。getVideoLoadingProgressView():自定义媒体文件播放加载时的进度条。getDefaultVideoPoster():设置媒体文件默认的预览图。onShowCustomView():媒体文件进入全屏时调用。onHideCustomView():媒体文件退出全屏时调用。WebChromeClient webChromeClient = new WebChromeClient();Android调用JS语法:webView.loadUrl("javascript:method()");在Web页面中定义两个Js方法,分别是有返回值和无返回值。let name = ''; function setter(name){ this.name = name; } function getter(){ return this.name; }在Android中通过WebView调用Js方法String setter = "javascript:setter('"+"wjx"+"');"; webView.loadUrl(setter); -> 调用有参无返回值的函数 webView.evaluateJavascript("getter()", new ValueCallback<String>() { @Override public void onReceiveValue(String s) { -> 调用无参有返回值的函数 System.out.println("my name is "+s); }});七、Js调用AndroidwebView.addJavascriptInterface(this, "bridge"); -> 建立通讯桥梁 webView.removeJavascriptInterface("bridge"); -> 移除通讯桥梁在Android中定义一个方法,标记为Js接口@JavascriptInterfacepublic void toast(String toast){ Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show(); }在Web页面中调用Android方法function toast(toast){ javascript:bridge.toast(toast); -> 通过桥梁调用方法 window.bridge.toast(toast); -> 通过桥梁调用方法}Android WebView基本使用:https://blog.csdn.net/lowprofile_coding/article/details/77928614加载html四种方式webView.loadUrl("https://gitlab.com/Vastsa/lanpicbed/-/raw/master/");//加载url webView.loadUrl("file:///android_asset/test.html");//加载asset文件夹下html //方式3:加载手机sdcard上的html页面 webView.loadUrl("content://com.ansen.webview/sdcard/test.html"); //方式4 使用webview显示html代码 webView.loadDataWithBaseURL(null,"<html><head><title> 欢迎您 </title></head>" + "<body><h2>使用webview显示 html代码</h2></body></html>", "text/html" , "utf-8", null);WebViewClient与WebChromeClient区别使用WebView基本都会使用这两个类,那他们有哪些区别呢?WebViewClient主要帮助WebView处理各种通知、请求事件的,有以下常用方法:- onPageFinished 页面请求完成- onPageStarted 页面开始加载- shouldOverrideUrlLoading 拦截url- onReceivedError 访问错误时回调,例如访问网页时报错404,在这个方法回调的时候可以加载错误页面。WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等,有以下常用方法。- onJsAlert webview不支持js的alert弹窗,需要自己监听然后通过dialog弹窗- onReceivedTitle 获取网页标题- onReceivedIcon 获取网页icon- onProgressChanged 加载进度回调简单使用因为需要加载网页url,所以需要在AndroidManifest.xml中添加访问网络权限。<uses-permission android:name="android.permission.INTERNET" />1布局文件:activity_main.xml<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"/> <ProgressBar android:id="@+id/progressbar" style="@android:style/Widget.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="3dip" android:max="100" android:progress="0" android:visibility="gone"/> </FrameLayout>外层FrameLayout,里面有WebView跟ProgressBar,WebView的宽高匹配父类,ProgressBar横向进度条,高度3dip,按照FrameLayout布局规则,ProgressBar会覆盖在WebView之上,默认是隐藏不显示。MainActivity.javapublic class MainActivity extends AppCompatActivity { private WebView webView; private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progressBar= (ProgressBar)findViewById(R.id.progressbar);//进度条 webView = (WebView) findViewById(R.id.webview); // webView.loadUrl("file:///android_asset/test.html");//加载asset文件夹下html webView.loadUrl("http://139.196.35.30:8080/OkHttpTest/apppackage/test.html");//加载url //使用webview显示html代码 // webView.loadDataWithBaseURL(null,"<html><head><title> 欢迎您 </title></head>" + // "<body><h2>使用webview显示 html代码</h2></body></html>", "text/html" , "utf-8", null); webView.addJavascriptInterface(this,"android");//添加js监听 这样html就能调用客户端 webView.setWebChromeClient(webChromeClient); webView.setWebViewClient(webViewClient); WebSettings webSettings=webView.getSettings(); webSettings.setJavaScriptEnabled(true);//允许使用js /** * LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据 * LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。 * LOAD_NO_CACHE: 不使用缓存,只从网络获取数据. * LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。 */ webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用缓存,只从网络获取数据. //支持屏幕缩放 webSettings.setSupportZoom(true); webSettings.setBuiltInZoomControls(true); //不显示webview缩放按钮 // webSettings.setDisplayZoomControls(false); } //WebViewClient主要帮助WebView处理各种通知、请求事件 private WebViewClient webViewClient=new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) {//页面加载完成 progressBar.setVisibility(View.GONE); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) {//页面开始加载 progressBar.setVisibility(View.VISIBLE); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.i("ansen","拦截url:"+url); if(url.equals("http://www.google.com/")){ Toast.makeText(MainActivity.this,"国内不能访问google,拦截该url",Toast.LENGTH_LONG).show(); return true;//表示我已经处理过了 } return super.shouldOverrideUrlLoading(view, url); } }; //WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等 private WebChromeClient webChromeClient=new WebChromeClient(){ //不支持js的alert弹窗,需要自己监听然后通过dialog弹窗 @Override public boolean onJsAlert(WebView webView, String url, String message, JsResult result) { AlertDialog.Builder localBuilder = new AlertDialog.Builder(webView.getContext()); localBuilder.setMessage(message).setPositiveButton("确定",null); localBuilder.setCancelable(false); localBuilder.create().show(); //注意: //必须要这一句代码:result.confirm()表示: //处理结果为确定状态同时唤醒WebCore线程 //否则不能继续点击按钮 result.confirm(); return true; } //获取网页标题 @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); Log.i("ansen","网页标题:"+title); } //加载进度回调 @Override public void onProgressChanged(WebView view, int newProgress) { progressBar.setProgress(newProgress); } }; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.i("ansen","是否有上一个页面:"+webView.canGoBack()); if (webView.canGoBack() && keyCode == KeyEvent.KEYCODE_BACK){//点击返回按钮的时候判断有没有上一页 webView.goBack(); // goBack()表示返回webView的上一页面 return true; } return super.onKeyDown(keyCode,event); } /** * JS调用android的方法 * @param str * @return */ @JavascriptInterface //仍然必不可少 public void getClient(String str){ Log.i("ansen","html调用客户端:"+str); } @Override protected void onDestroy() { super.onDestroy(); //释放资源 webView.destroy(); webView=null; } }onCreate 查找控件,给webView设置加载url,添加js监听,监听的名称是”android”,设置webChromeClient跟webViewClient回调,通过getSettings方法获取WebSettings对象,设置允许加载js,设置缓存模式,支持缩放。webViewClient 重写了几个方法,onPageFinished页面加载完成隐藏进度条,onPageStarted页面开始加载显示进度条,shouldOverrideUrlLoading拦截url,如果请求url是打开google,不让他请求,因为google在国内不能访问,就算请求也请求不到还不如拦截掉,直接告诉用户不能访问。webChromeClient onJsAlert()因为WebView不支持alert弹窗,在这个方法中用AlertDialog去弹窗。onReceivedTitle获取网页标题。onProgressChanged页面加载进度,把加载进度给progressBar。onKeyDown 如果点击系统自带返回键&&webView有上一级页面,调用goBack返回。否则不处理。什么时候辉有上一级页面呢?就是你从首页跳转到了一个新页面,点击返回的时候会返回首页。如果本来就在首页点击返回的时候会退出app。getClient html页面的JS可以通过这个方法回调原生APP,这个方法有个注解@JavascriptInterface,这个是必须的,这个方法有个字符串参数,这个方法跟我们在onCreate中调用addJavascriptInterface传入的name一起使用的。例如html中想要回调这个方法可以这样写:javascript:android.getClient(“传一个字符串给客户端”);onDestroy activity销毁时释放webView资源。
2020年10月15日
813 阅读
0 评论
0 点赞
1
2
3