GVKun编程网logo

Android Studio,在新活动中显示完整的WebView(android studio webview)

21

本文将介绍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 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会没有反应?

android listview的item中有webview,但是点击webview会没有反应?

listview的item中嵌套有webview,给listview设置了onclickItem的点击事件,但是当点到webview的位置时没有响应,其他位置却可以,应该怎么设置才能在点到webview的位置时也有响应?

Android pdf viewer在android studio应用问题说明详解

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 在新行中显示文本文件内容

如何解决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 简单说明

Android Studio 学习笔记 (五):WebView 简单说明

https://www.cnblogs.com/ifever/archive/2020/02/20/12337779.html


Android 中一个用于网页显示的控件,实际上,也可以看做一个功能最小化的浏览器,看起来类似于在微信中打开网页链接的页面。WebView 主要用于在 app 应用中方便地访问远程网页或本地 html 资源。同时,WebView 也在 Android 中充当 Java 代码和 JS 代码之间交互的桥梁。

WebView 基本用法

设置 WebView 至少有两种方法

  1. 布局文件中添加 WebView 控件 & Activity 中设置加载页面
  2. 调用 setContentView () 方法,直接通过代码创建

一般采用第一种方法,在 Activity 中设置加载页面步骤如下

设置加载网址并使用 loadUrl () 方法加载

对变量 private WebView wView;

  1. 电脑本地文件:放在 app/src/main/assets 下的 html

    wView.loadUrl("file:///android_asset/test.html");

    手机本地文件

    wView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");

  2. 远程资源:

    需先在清单文件 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,根据实际使用的方法进行回调

参考资料

  1. 这是一份全面 & 详细的 Webview 使用攻略
    https://www.jianshu.com/p/3c94ae673e2a/
  2. Android WebView 的使用 (超详细用法)
    https://blog.csdn.net/weixin_40438421/article/details/85700109
  3. Android WebView 全面讲解
    https://www.2cto.com/kf/201712/706339.html
  4. 安卓使用 WebView 加载百度首页
    https://www.jianshu.com/p/b073102fb504
  5. Android webView 支持缩放及自适应屏幕
    https://blog.csdn.net/qq_40885379/article/details/83058732
  6. android WebView(二)缩放
    https://blog.csdn.net/w2865673691/article/details/44941495?utm_source=distribute.pc_relevant.none-task
  7. 【天哥】Android 开发视频教程最新版 Android Studio 开发
    https://www.bilibili.com/video/av38409964
  8. WebViewClient 与 WebChromeClient
    https://www.cnblogs.com/yaowen/p/5562971.html
  9. WebView (网页视图) 基本用法 | 菜鸟教程
    https://www.runoob.com/w3cnote/android-tutorial-webview.html

我们今天的关于Android Studio,在新活动中显示完整的WebViewandroid studio webview的分享已经告一段落,感谢您的关注,如果您想了解更多关于android listview的item中有webview,但是点击webview会没有反应?、Android pdf viewer在android studio应用问题说明详解、Android Studio Java 在新行中显示文本文件内容、Android Studio 学习笔记 (五):WebView 简单说明的相关信息,请在本站查询。

本文标签: