本文将介绍AndroidStudio,在新活动中显示完整的WebView的详细情况,特别是关于androidstudiowebview的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地
本文将介绍Android Studio,在新活动中显示完整的WebView的详细情况,特别是关于android studio webview的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于android listview的item中有webview,但是点击webview会没有反应?、Android pdf viewer在android studio应用问题说明详解、Android Studio Java 在新行中显示文本文件内容、Android Studio 学习笔记 (五):WebView 简单说明的知识。
本文目录一览:- Android Studio,在新活动中显示完整的WebView(android studio webview)
- android listview的item中有webview,但是点击webview会没有反应?
- Android pdf viewer在android studio应用问题说明详解
- Android Studio Java 在新行中显示文本文件内容
- Android Studio 学习笔记 (五):WebView 简单说明
Android Studio,在新活动中显示完整的WebView(android studio webview)
我真的是android的新手,我正在尝试制作一个简单的应用,其中一个视图以完整尺寸显示一个webview.
我已经开始了一个带有导航抽屉的新项目,并添加了四个仅显示文本字段的菜单.菜单选项卡之一称为ECG.当我转到菜单并单击此菜单时,我希望此选项卡的视图以全屏显示Web视图,而不是在浏览器中.
我已经在xml文件中创建了一个Web视图,但是我无法弄清楚如何在该视图中呈现网站.
我希望你们能帮助我!提前致谢!
我的MainActivity.java:
package com.nybroe.blivredder;
import android.app.Activity;
import android.support.v7.app.ActionBaractivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
import android.webkit.WebView;
public class MainActivity extends ActionBaractivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {
private NavigationDrawerFragment mNavigationDrawerFragment;
private CharSequence mTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNavigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected(int position) {
Fragment objFragment = null;
switch (position) {
case 0:
objFragment = new FrontPage();
break;
case 1:
objFragment = new ECG();
break;
case 2:
objFragment = new Electrodes();
break;
case 3:
objFragment = new Arrhythmia();
break;
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, objFragment)
.commit();
}
public void onSectionAttached(int number) {
switch (number) {
case 0:
mTitle = getString(R.string.title_section0);
break;
case 1:
mTitle = getString(R.string.title_section1);
break;
case 2:
mTitle = getString(R.string.title_section2);
break;
case 3:
mTitle = getString(R.string.title_section3);
break;
}
}
public void restoreActionBar() {
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setdisplayShowTitleEnabled(true);
actionBar.setTitle(mTitle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!mNavigationDrawerFragment.isDraweropen()) {
getMenuInflater().inflate(R.menu.main, menu);
restoreActionBar();
return true;
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onoptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onoptionsItemSelected(item);
}
public static class PlaceholderFragment extends Fragment {
private static final String ARG_SECTION_NUMBER = "section_number";
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MainActivity) activity).onSectionAttached(
getArguments().getInt(ARG_SECTION_NUMBER));
}
}
}
我的ECG.java
package com.nybroe.blivredder;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
public class ECG extends Fragment{
WebView web_view;
View rootview;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootview = inflater.inflate(R.layout.ecg_main, container, false);
return rootview;
}
}
我的ecg_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<WebView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/webView1">
</WebView>
</RelativeLayout>
解决方法:
尝试这个:
public class ECG extends Fragment{
WebView web_view;
View rootview;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootview = inflater.inflate(R.layout.ecg_main, container, false);
web_view = (WebView) rootview.findViewById(R.id.webView1);
return rootview;
}
}
并在xml中:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webView1">
</WebView>
</RelativeLayout>
android listview的item中有webview,但是点击webview会没有反应?
listview的item中嵌套有webview,给listview设置了onclickItem的点击事件,但是当点到webview的位置时没有响应,其他位置却可以,应该怎么设置才能在点到webview的位置时也有响应?Android pdf viewer在android studio应用问题说明详解
之前一直是做.NET开发的,最近需要弄一个新闻app,能力有限,只能借助HTML5 WebAPP+android studio来完成这项工作。
android studio主要用WebView来加载发布好的WebApp,打包生产APP。
其中由于显示一些pdf文档,所以研究了一下,记录一下心得,同时也希望帮助到新手们。
android 显示网络pdf,基本原理:先将pdf文件通过DownloadManager下载到手机sdk某个文件夹中,然后通过android-pdf-viewer插件进行显示。
android-pdf-viewer插件可以直接到github上下载,地址:https://github.com/barteksc/AndroidPdfViewer
或者直接到发布好的页面下载:https://github.com/barteksc/AndroidPdfViewer/releases
我下载的是:AndroidPdfViewer-2.1.0版本zip包
将下载AndroidPdfViewer-2.1.0包解压出来,再你的app项目中,打开 File -> New -> Import Module 选择到刚才解压的文件夹
本人目录是:D:\AndroidStudioProjects\AndroidPdfViewer-2.1.0\android-pdf-viewer
完成后,回提示先ERROR:
Error:Plugin with id ‘com.github.dcendents.android-maven' not found.
解决方法:
点击你的工程Gradle Scripts目录下的bulid.gradle (Project:你的工程名)
在
buildscript { repositories { jcenter() } dependencies { classpath ‘com.android.tools.build:gradle:2.0.0' } }
中dependencies的下添加 classpath ‘com.github.dcendents:android-maven-gradle-plugin:1.3',
Mark Modules之后,出现新的ERROR:
Error:Plugin with id ‘com.jfrog.bintray' not found.
此时同样在dependencies下添加:classpath “com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0”
再次Mark Modules就不会报错了。
先就可以开始使用 android-pdf-viewer 插件了,
别忘记引用权限问题哦
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <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" /> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/> <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
先代码为项目中report activity.java,实现了接收另外一个activity跳转过来同时传递参数pdf地址,然后通过DownloadManager下载完成之后,显示pdf。
package cn.cgrs.myphone; import android.app.DownloadManager; import android.content.broadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.os.Environment; import android.preference.PreferenceManager; import android.provider.OpenableColumns; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.webkit.MimeTypeMap; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.TextView; import android.widget.Toast; import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener; import com.github.barteksc.pdfviewer.listener.OnPagechangelistener; import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle; import com.shockwave.pdfium.PdfDocument; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; public class Report extends AppCompatActivity implements OnPagechangelistener,OnLoadCompleteListener { private com.github.barteksc.pdfviewer.PDFView pdfView ; private TextView textView; private DownloadManager downloadManager; private SharedPreferences prefs; private static String DL_ID = "downloadId"; Integer pageNumber = 0; String pdfFileName = "yyy.pdf"; Uri uri; String AUrl; private Boolean isDown = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_report); Intent intent = getIntent(); // 获取 Intent AUrl = intent.getStringExtra("url"); // 获取 String 值 Log.e("接收url:",AUrl); //AUrl = "http://www.tyyq.cn/xhsapp/download/a03790b7f27243eeada01537a2ce2f77.pdf"; String[] exts = AUrl.split("/"); pdfFileName = exts[exts.length-1]; Log.e("pdf文件名:",pdfFileName); String pdfName = Environment.getExternalStorageDirectory() + "/download"; File file = new File(pdfName,pdfFileName); pdfView = (com.github.barteksc.pdfviewer.PDFView)findViewById(R.id.pdfView); textView = (TextView) findViewById(R.id.textView); if(file.exists()){ Log.e("Tip:","报告已经存在!"); //文件已经存在,则直接显示 uri = Uri.fromFile(file); displayFromUri(uri); textView.setVisibility(View.GONE); pdfView.setVisibility(View.VISIBLE); } else{ isDown = true; } //Log.e("prefs字符串:",prefs.toString()); } @Override protected void onResume(){ super.onResume(); if(isDown) { try{ Log.e("Tip:","报告不存在,需要下载!"); DL_ID = pdfFileName; //文件不存在需要先下载 downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE); prefs = PreferenceManager.getDefaultSharedPreferences(this); StartReport(); } catch (Exception ex) { Toast.makeText(this,ex.getMessage(),Toast.LENGTH_LONG).show(); } } } @Override protected void onPause() { // Todo Auto-generated method stub super.onPause(); //unregisterReceiver(receiver); try { unregisterReceiver(receiver); } catch (IllegalArgumentException e) { if (e.getMessage().contains("Receiver not registered")) { // Ignore this exception. This is exactly what is desired } else { // unexpected,re-throw throw e; } } } //下载报告启动函数 protected void StartReport() { // Todo Auto-generated method stub if(!prefs.contains(DL_ID) || true) { // // String url = AUrl; //Log.e("-----",AUrl); //String[] exts = url.split("/"); //pdfFileName = "97b49c0822c14a01b3ebc273679bc6bf.pdf"; //exts[exts.length-1]; String url = AUrl;//"http://www.tyyq.cn/RollImage/11.pdf"; Log.e("开始下载url:",AUrl); //开始下载 Uri resource = Uri.parse(encodeGB(url)); DownloadManager.Request request = new DownloadManager.Request(resource); request.setAllowednetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI); request.setAllowedOverRoaming(false); //设置文件类型 MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url)); request.setMimeType(mimeString); //在通知栏中显示 //设置通知栏标题 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE); request.setDescription("舆情报告正在下载"); //request.setShowRunningNotification(true); request.setVisibleInDownloadsUi(true); //sdcard的目录下的download文件夹 request.setDestinationInExternalPublicDir("/download/",pdfFileName); request.setTitle("舆情报告"); long id = downloadManager.enqueue(request); //保存id prefs.edit().putLong(DL_ID,id).commit(); } else { Log.e("提示:","下载已经开始,检查状态"); //下载已经开始,检查状态 queryDownloadStatus(); } registerReceiver(receiver,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); } /** * 如果服务器不支持中文路径的情况下需要转换url的编码。 * @param string * @return */ public String encodeGB(String string) { //转换中文编码 String split[] = string.split("/"); for (int i = 1; i < split.length; i++) { try { split[i] = URLEncoder.encode(split[i],"GB2312"); } catch (UnsupportedEncodingException e) { e.printstacktrace(); } split[0] = split[0]+"/"+split[i]; } split[0] = split[0].replaceAll("\\+","%20");//处理空格 return split[0]; } private broadcastReceiver receiver = new broadcastReceiver() { @Override public void onReceive(Context context,Intent intent) { //这里可以取得下载的id,这样就可以知道哪个文件下载完成了。适用与多个下载任务的监听 Log.v("intent",""+intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,0)); queryDownloadStatus(); } }; private void queryDownloadStatus() { DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(prefs.getLong(DL_ID,0)); Cursor c = downloadManager.query(query); if(c.movetoFirst()) { int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); switch(status) { case DownloadManager.STATUS_PAUSED: Log.v("down","STATUS_PAUSED"); case DownloadManager.STATUS_PENDING: Log.v("down","STATUS_PENDING"); case DownloadManager.STATUS_RUNNING: //正在下载,不做任何事情 Log.v("down","STATUS_RUNNING"); break; case DownloadManager.STATUS_SUCCESSFUL: //完成 Log.v("down","下载完成"); String pdfName = Environment.getExternalStorageDirectory() + "/download"; File file = new File(pdfName,pdfFileName); uri = Uri.fromFile(file); Log.e("----",uri.toString()); displayFromUri(uri); textView.setVisibility(View.GONE); pdfView.setVisibility(View.VISIBLE); break; case DownloadManager.STATUS_Failed: //清除已下载的内容,重新下载 Log.v("down","STATUS_Failed"); downloadManager.remove(prefs.getLong(DL_ID,0)); prefs.edit().clear().commit(); break; } } } /*pdf显示函数集合*/ private void displayFromUri(Uri urii) { //pdfFileName = getFileName(urii); pdfView.fromUri(urii) .defaultPage(pageNumber) .onPageChange(this) .enableAnnotationRendering(true) .onLoad(this) .scrollHandle(new DefaultScrollHandle(this)) .load(); } public void onResult(int resultCode,Intent intent) { if (resultCode == RESULT_OK) { uri = intent.getData(); displayFromUri(uri); } } @Override public void onPageChanged(int page,int pageCount) { pageNumber = page; setTitle(String.format("%s %s / %s",pdfFileName,page + 1,pageCount)); } public String getFileName(Uri uri) { String result = null; if (uri.getScheme().equals("content")) { Cursor cursor = getContentResolver().query(uri,null,null); try { if (cursor != null && cursor.movetoFirst()) { result = cursor.getString(cursor.getColumnIndex(OpenableColumns.disPLAY_NAME)); } } finally { if (cursor != null) { cursor.close(); } } } if (result == null) { result = uri.getLastPathSegment(); } return result; } @Override public void loadComplete(int nbPages) { PdfDocument.Meta Meta = pdfView.getDocumentMeta(); printBookmarksTree(pdfView.getTableOfContents(),"-"); } public void printBookmarksTree(List<PdfDocument.Bookmark> tree,String sep) { for (PdfDocument.Bookmark b : tree) { // Log.e(TAG,String.format("%s %s,p %d",sep,b.getTitle(),b.getPageIdx())); if (b.hasChildren()) { printBookmarksTree(b.getChildren(),sep + "-"); } } } }
以上所述是小编给大家介绍的Android pdf viewer在android studio应用问题说明详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!
Android Studio Java 在新行中显示文本文件内容
如何解决Android Studio Java 在新行中显示文本文件内容?
我正在创建一个体重跟踪应用程序,用户在其中输入体重,点击保存按钮,然后保存体重。还有一个加载按钮可以加载所有以前的输入。我遇到的问题是,一旦点击加载,它就会加载屏幕上的权重,但它会在一行中完成,而不是每行单独一行。
我检查了文本文件,所有的权重都存储在一行中,所以存储输入的函数没有问题。
这是“体重跟踪器”的代码
package com.example.workouttracker;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Weighttracking extends AppCompatActivity {
private static final String FILE_NAME = "Weighttracking.txt";
EditText mEditText;
EditText mEditText2;
private Button button_back_home;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weight_tracking);
mEditText = findViewById(R.id.weight);
mEditText2 = findViewById(R.id.weight2);
button_back_home=(Button) findViewById(R.id.button_back_home);
button_back_home.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
homePage();
}
private void homePage(){
startActivity(new Intent(getApplicationContext(),MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
}
});
}
public void save(View v) {
String text = mEditText.getText().toString();
FileOutputStream fos = null;
try {
fos = openFileOutput(FILE_NAME,MODE_APPEND);
fos.write((text + "kg''s\n").getBytes());
mEditText.getText().clear();
Toast.makeText(this,"Saved to " + getFilesDir() + "/" + FILE_NAME,Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
e.printstacktrace();
} catch (IOException e) {
e.printstacktrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printstacktrace();
}
}
}
}
public void load(View v) {
FileInputStream fis = null;
try {
fis = openFileInput(FILE_NAME);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String text;
while ((text = br.readLine()) != null) {
sb.append(text);
sb.append(''\n'');
}
mEditText2.setText(sb.toString());
} catch (FileNotFoundException e) {
e.printstacktrace();
} catch (IOException e) {
e.printstacktrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printstacktrace();
}
}
}
}
}
有人知道如何让它逐行加载每个重量吗? 谢谢
`
解决方法
如果您在编辑文本中添加了属性 android:inputType="textMultiLine"
,请检查您的 xml 文件
尝试像这样更改您的代码:
String sb = "";
String text;
while ((text = br.readLine()) != null) {
sb = sb + text + "\n";
}
Android Studio 学习笔记 (五):WebView 简单说明
https://www.cnblogs.com/ifever/archive/2020/02/20/12337779.html
Android 中一个用于网页显示的控件,实际上,也可以看做一个功能最小化的浏览器,看起来类似于在微信中打开网页链接的页面。WebView 主要用于在 app 应用中方便地访问远程网页或本地 html 资源。同时,WebView 也在 Android 中充当 Java 代码和 JS 代码之间交互的桥梁。
WebView 基本用法
设置 WebView 至少有两种方法
- 布局文件中添加 WebView 控件 & Activity 中设置加载页面
- 调用 setContentView () 方法,直接通过代码创建
一般采用第一种方法,在 Activity 中设置加载页面步骤如下
设置加载网址并使用 loadUrl () 方法加载
对变量 private WebView wView;
电脑本地文件:放在 app/src/main/assets 下的 html
wView.loadUrl("file:///android_asset/test.html");
手机本地文件
wView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");
远程资源:
需先在清单文件 AndroidManifest 文件中为 app 申请网络使用权限:
<uses-permission android:name="android.permission.INTERNET"/>
填入网页地址进行加载
wView.loadUrl("https://www.cnblogs.com/ifever/")
加载 HTML 页面的一小段内容
WView.loadData(String data, String mimeType, String encoding)
- 默认情况下,WebView 会调用系统默认浏览器加载传入的网址或者资源。如果需要在当前 app 页面内加载,则需要设置 WebViewClient 中的 shouldOverrideUrlLoading () 方法
在当前 app 页面内加载
wView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return false;
}
以上两个方法都会在 WebView 加载新的 url 时触发。
Android 5.0 以下系统会回调第一个方法,反之回调第二个方法。因此,为了兼容不同的系统版本,可以同时重写这两个方法。
可以看到,这两个方法都有一个 boolean 返回值。假如修改为 true,会带来重定向问题。
返回键始终无法退出应用:重定向问题
设置 true 的代码如下
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);//手动加载
return true;
}
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());//手动加载
return true;
}
虽然不会影响加载,不过会带来用户点击回退键始终无法退出应用的问题,下面简单介绍下原理:
假设访问网页过程为 A - > B - > C 共三个站点,在 C 时点回退,C - > B 没问题,接着再点 B -> A,这个时候问题出现了。尽管 B 来到了 A,但是因为重定向又跳转到了 B,如此循环往复...
返回值设为 false 的情况(且删去 view.loadUrl () 方法)就可解决这种问题。其实无论返回 true 还是 false,只要为 WebView 设置了 WebViewClient,都不影响正常的加载功能,只是系统就不会再将 url 交给第三方的浏览器去处理了。
这两种返回值的真正区别是这样的:
shouldOverrideUrlLoading 返回 false,代表将 url 交给当前 WebView 加载,也就是正常的加载状态;shouldOverrideUrlLoading 返回 true,代表开发者已经对 url 进行了处理,WebView 就不会再对这个 url 进行加载了。可以用于屏蔽某些网址,借此实现黑名单机制。
解决了用户点击回退键始终无法退出应用,但还存在一个显著问题:用户希望回退到上一级页面,却直接退出了 app
回退问题解决方法
goBack () // 回退到上一级页面
canGoBack ()// 能否回退到上一级页面
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && wView.canGoBack()) {
//如果按下返回键,同时又可以回退到上一级页面,就返回上一级
wView.goBack();
return true;
}
return super.onKeyDown(keyCode,event);
}
默认情况下,返回键会执行 finish () 方法,结束当前 Activity。
有些 app 为了防止用户误触,在按下返回键且无法回退上一级页面时,会提示需要再次按下返回键,才结束当前 Activity。这意味着需要在一定时间内连续按动两次返回键才可退出,设计更加人性化。将上述代码改为
private long exitTime = 0;
@Override
public void onBackPressed() {
if (wView.canGoBack()) {
wView.goBack();
} else {
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
}
}
}
此外修改布局文件,通过添加按钮并编写,也可以添加其他新功能,常用的有
finish (); // 关闭当前 Activity,一键退出
wView.reload (); // 刷新当前页面
wView.setScrollY (0); // 滚动到顶部
- 添加进度条
public void onProgressChanged(WebView view, int newProgress){
super.onProgressChanged(view,newProgress);
}
newProgress*100,即可获得当前加载的百分比,具体方法网上可查,这里暂不深入
- 标题改为当前网页标题
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view,title);
setTitle(title);
}
在开通 Java 权限后,可以设置网页弹窗,至少有两种方式,alert、confirm、prompt 三种类型的弹窗
- wView.loadUrl("javascript:alert(''hello'')");
- wView.evaluateJavascript("javascript:alert(''hello'')",null);
放置位置如下:
wView.setWebViewClient(new WebViewClient() {
// @Override
// public boolean shouldOverrideUrlLoading(WebView view, String url) {
// return false;
// }
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return false;
}
@Override
public void onPageFinished(WebView view, String url) {
//网页加载完成时
super.onPageFinished(view, url);
//wView.loadUrl("javascript:alert(''hello'')");
// wView.evaluateJavascript("javascript:alert(''hello'')",null);
}});
开通 Java 权限及其他设置见下文
WebSettings:WebView 状态管理
WebSettings 用来管理 WebView 状态
为了方便,这里写为 WebSettings settings = wView.getSettings();
默认情况下,WebView 是不支持 Javascript 的,需要调用 setJavaScriptEnabled (true),即
settings.setJavaScriptEnabled(true);
比如打开百度,添加该行代码前,网页少了很多广告,进入搜索结果会提示需要切换为完整版(因为无法不支持 JS 所以无法),但不涉及复杂功能的情况下,不影响使用
添加后,反而容易报错,也存在安全隐患,在本人的 oppo r11 上调试就会出现 net_ERROR 错误,暂时找不到原因
在网页自定义缩放
即双指缩放页面的手势控制缩放,由以下代码实现
settings.setUseWideViewPort(true);//设定支持viewport属性,有些页面是很早期的只适配了pc的浏览器的页面,页面很大,需要宽大的视野来展示,这时候设置为true就可以在足够的空间拖动,并且页面可以以任意比例缩放。
settings.setLoadWithOverviewMode(true); //自适应屏幕,用尽可能大的视野展示页面,一般和上一属性搭配使用。当然大视野显示的字都很小。
settings.setBuiltInZoomControls(true); // 使用缩放控件
settings.setDisplayZoomControls(false); // 隐藏缩放控件
settings.setSupportZoom(true);//设定支持缩放,只设置此属性并不能实现缩放,在某些版本的手机上也只是能实现点击缩放。
在很多网页依旧不能缩放,经查阅,应该是页面已经被设置好手机样式了,但对于传统的 PC 版网页,缩放功能仍有效。
WebView 在实际使用中需要用到的两个类,这里记录一下二者的区别
WebViewClient 与 WebChromeClient 的区别
WebViewClient 主要帮助 WebView 处理各种通知、请求事件的
WebChromeClient 主要帮助 WebView 处理 Javascript 的对话框、网站图标、网站 title、加载进度等
实际使用的话,如果你的 WebView 只是用来处理一些 html 的页面内容,只用 WebViewClient 就行了,如果需要更丰富的处理效果,比如 JS、进度条等,就要用到 WebChromeClient,根据实际使用的方法进行回调
参考资料
- 这是一份全面 & 详细的 Webview 使用攻略
https://www.jianshu.com/p/3c94ae673e2a/ - Android WebView 的使用 (超详细用法)
https://blog.csdn.net/weixin_40438421/article/details/85700109 - Android WebView 全面讲解
https://www.2cto.com/kf/201712/706339.html - 安卓使用 WebView 加载百度首页
https://www.jianshu.com/p/b073102fb504 - Android webView 支持缩放及自适应屏幕
https://blog.csdn.net/qq_40885379/article/details/83058732 - android WebView(二)缩放
https://blog.csdn.net/w2865673691/article/details/44941495?utm_source=distribute.pc_relevant.none-task - 【天哥】Android 开发视频教程最新版 Android Studio 开发
https://www.bilibili.com/video/av38409964 - WebViewClient 与 WebChromeClient
https://www.cnblogs.com/yaowen/p/5562971.html - WebView (网页视图) 基本用法 | 菜鸟教程
https://www.runoob.com/w3cnote/android-tutorial-webview.html
我们今天的关于Android Studio,在新活动中显示完整的WebView和android studio webview的分享已经告一段落,感谢您的关注,如果您想了解更多关于android listview的item中有webview,但是点击webview会没有反应?、Android pdf viewer在android studio应用问题说明详解、Android Studio Java 在新行中显示文本文件内容、Android Studio 学习笔记 (五):WebView 简单说明的相关信息,请在本站查询。
本文标签: