android shouldoverrideurlloading返回true和false的区别
2015-01-26 · 知道合伙人影视综艺行家
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工程效果如下:
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内部执行。
很多人误把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。
这个方法其实是用来处理自定义的请求链接的,比如 baidumap://xxx,百度地图,写代码检测到url是这种格式开头,跳转到百度地图APP,返回true:
try {
if (url.startsWith("baidumap://")) {
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了,导致页面空白。同时,如果连接还有类似百度地图这样的,会挂。