问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android shouldoverrideurlloading返回true和false的区别

发布网友 发布时间:2022-04-24 19:04

我来回答

3个回答

热心网友 时间:2023-10-03 11:30

给大家分享一下Android中onInterceptTouchEvent与onTouchEvent,,记得楼主以前刚开始找工作的时候,被人问了关于Android中事件传递,当时还是菜鸟一枚,当然答不上来,被人无情的BS了。好了言归正传讲重点.
onInterceptTouchEvent:
onInterceptTouchEvent是在ViewGroup里面定义的。Android中的layout布局类一般都是继承此类的。onInterceptTouchEvent是用于拦截手势事件的,每个手势事件都会先调用onInterceptTouchEvent。
onTouchEvent:
onTouchEvent同样也是在view中定义的一个方法。处理传递到view 的手势事件。手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL等事件。
其中Layout里的onInterceptTouchEvent默认返回值是false,这样touch事件会传递到View控件,Layout里的onTouch默认返回值是false, View里的onTouch默认返回值是true,当我们手指点击屏幕时候,先调用ACTION_DOWN事件,当onTouch里返回值是true的时候,onTouch回继续调用ACTION_UP事件,如果onTouch里返回值是false,那么onTouch只会调用ACTION_DOWN而不调用ACTION_UP.

为了让当家更容易理解我写了一个简单的Demo.自定义了Layout与View,Android工程目录如下:

新建一个MyLayout.java代码如下:

[java] view plaincopy
package com.tutor.touch;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.FrameLayout;

public class MyLayout extends FrameLayout {

public MyLayout(Context context){
super(context);
}

public MyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.e(TouchDemoActivity.TAG, "MyLayout onInterceptTouchEvent.");
Log.e(TouchDemoActivity.TAG,"MyLayout onInterceptTouchEvent default return "
+ super.onInterceptTouchEvent(ev));
return super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e(TouchDemoActivity.TAG, "MyLayout onTouchEvent.");
Log.e(TouchDemoActivity.TAG,"MyLayout onTouchEvent default return "
+ super.onTouchEvent(event));
return super.onTouchEvent(event);
}
}

然后新建一个MyView.java代码如下:

[java] view plaincopy
package com.tutor.touch;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Button;

public class MyView extends Button {

public MyView(Context context){
super(context);
}

public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e(TouchDemoActivity.TAG, "MyView onTouchEvent.");
Log.e(TouchDemoActivity.TAG,"MyView onTouchEvent default return "
+ super.onTouchEvent(event));
return super.onTouchEvent(event);
}

}

其中TouchDemoActivity代码如下:

[java] view plaincopy
package com.tutor.touch;

import android.app.Activity;
import android.os.Bundle;

public class TouchDemoActivity extends Activity {
public static final String TAG = "TouchDemoActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

上面所有的布局文件main.xml代码如下:

[java] view plaincopy
<?xml version="1.0" encoding="utf-8"?>
<com.tutor.touch.MyLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<com.tutor.touch.MyView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />

</com.tutor.touch.MyLayout>

运行上述Android工程效果如下:

热心网友 时间:2023-10-03 11:31

shouldoverrideurlloading返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。

public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}

shouldOverrideUrlLoading方法在webview加载URL的时候可以截获这个动作。

这里主要说它的返回值的问题:
1、 默认返回:return super.shouldOverrideUrlLoading(view, url); 这个返回的方法会调用父类方法,也就是跳转至手机浏览器,平时写webview一般都在方法里面写 webView.loadUrl(url); 然后把这个返回值改成下面的false。
2、返回: return true; webview处理url是根据程序来执行的。
3、返回: return false; webview处理url是在webview内部执行。

热心网友 时间:2023-10-03 11:31

很多人误把false当true用,理解完全反了。看这个方法的文档:

public boolean shouldOverrideUrlLoading(WebView view,
                                        String url)
Description copied from class: WebViewClient Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url. This method is not called for requests using the POST "method".
Overrides:
shouldOverrideUrlLoading in class WebViewClient
Parameters:
view - The WebView that is initiating the callback.
url - The url to be loaded.
Returns:
True if the host application wants to leave the current WebView and handle the url itself, otherwise return false.

描述:

当一个新的 url 即将被WebView加载时,给本地APP一个接管控制权的机会。如果没有为WebView提供WebViewClient,那么通过Activity管理器为 url 选择适当的处理程序。如果WebViewClient被提供,return true意味着本地APP来处理url,而return false意味着当前WebView将处理url。

Returns:

如果应用想离开当前WebView,然后自己处理url,返回true。否则,返回false。

于是很多人返回true,允许应用跳走,打开其他应用来打开,并且让webview再次加载url。

这个方法其实是用来处理自定义的请求链接的,比如 map://xxx,百度地图,写代码检测到url是这种格式开头,跳转到百度地图APP,返回true:

try {
    if (url.startsWith("map://")) {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
} catch (Exception e) {
    return false;
}

另外,webview 不知道什么版本开始,一些配置还是什么原因会导致其对不安全的链接http会自动换成https,然后,如果返回true,自己又没有手动调用webview去加载url,webview默认就不处理url了,导致页面空白。同时,如果连接还有类似百度地图这样的,会挂。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...油桶横放长6、25米,圆的直径为2、05米,液体横放的高度为1、8米。求... 一个圆桶半径为1.2米,高为12米,现将油桶平放,此时装油的高度为1.722米... 大油桶是横放的,油桶圆的直径是2.15米,长是3.6米,里面的净油位高度... 一个圆柱油桶横着放,长5.5米,直径2.4米,里面装着油,油高度1米,求现在... 有一个圆柱体桶横放,长7米,高2.7米,里面装的油与油桶距离1.2米,求油的... 圆柱形油桶横放时油部分占底面圆周的三分之一当油桶直立油的高度和桶... 有一个圆柱体桶横放 有一个圆柱体桶横放 长9.4米 高2.6米 里面装的油与桶底距离0.6米,求里 ... 电脑单独安装outlook教程如何在电脑上安装outlook 直角转弯为什么会压角 棕熊和美洲黑熊哪个更凶残? 如何阻止android 系统对话框弹出 笔记本和电视HDMI连接后屏幕黑屏 Android的onTouchEvent事件的返回值问题 成年银背大猩猩是美洲黑熊的对手吗? hdmi连接电视黑屏是怎么回事? 安卓开发 手机号码拦截 为什么HDMI线连接电脑电视正确而电视出现黑屏 android shouldinterceptrequest怎么拦截不跳转 雄性黑熊能否与棕熊一战? 为什么我的电脑用hdmi线连到电视上就黑屏了,电视也是但显示连接 安卓UC浏览器怎么把这个拦截窗口给关了,太烦了 点了允许弹出后就返回不回来去了,直接回到图2那里 电脑用HDMI连电视为什么黑屏? android开发scrollview拦截问题 android按系统返回键为什么会退出 hdmi连接电视黑屏是怎么回事 android开发什么时候会事件拦截 android handlemessage的返回值有什么用 泰拉瑞亚增加生命值方法攻略 如何将生命值变为金心 泰拉瑞亚生命体分析仪范围多大 主机HDMI连接电视正常,连接电脑显示屏却无信号,然后就黑屏 android 弹出对话框后禁止back键 必须按对话框里的确定或取消按钮才能关闭对话框 警察可以通过qq定位吗 电脑主机用HDMI线连接电视,上下有黑边怎么解决 黑熊都是黑色的吗? android GestureDetector监听屏幕事件后 子view 的onTouch 无法触发 如果熊和狮子单挑,谁的胜算大?为什么? 怎么才能屏蔽掉photoview单击返回 棕熊和黑熊都是熊,谁的战斗力更高? QQ里的定位功能可以自选位置定位吗?? 熊科、犬科、猫科相对来说谁更厉害一些? 世界上现存的熊有哪几种? QQ可以定位吗 警方可以通过电脑qq定位吗? 请问手机QQ可以定位吗 手机qq可以定位吗? 腾讯会议号会与别人一样吗 腾讯会议号如果不删除是不是一直能用? 腾讯会议突然终断,再打开就没会议号了,怎么办? 腾讯视频 共享电脑声音