黑马程序员技术交流社区

标题: 【济南中心】Android课程同步笔记智慧北京:Day06(下) [打印本页]

作者: 小鲁哥哥    时间: 2017-7-2 22:52
标题: 【济南中心】Android课程同步笔记智慧北京:Day06(下)
【济南中心】Android课程同步笔记智慧北京:Day06(下)

网页详情
引言
分类新闻完成以后,接下来,我们处理每个条目的点击事件,
并进入新闻详情页,通过WebView加载显示新闻详情页。
实现步骤第一步给每个条目设置点击事件
在【NewsAdapter.java】文件中的onBindViewHolder方法中,给条目添加点击事件的逻辑
[Java] 纯文本查看 复制代码
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    final ResuleBean.NewsData newsData = newsDataList.get(position);
    if (newsData.imgs.size() == 3) {//显示三张图片
        ViewHolder1 viewHolder1 = (ViewHolder1) holder;
        viewHolder1.tvTitle.setText(newsData.title);
        Picasso.with(context).load(newsData.imgs.get(0)).into(viewHolder1.iv1);
        Picasso.with(context).load(newsData.imgs.get(1)).into(viewHolder1.iv2);
        Picasso.with(context).load(newsData.imgs.get(2)).into(viewHolder1.iv3);
        //条目的点击事件
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context,NewsDetailActivity.class);
                //传递的数据为url地址
                intent.putExtra("url",newsData.weburl);
                //作为一个新的任务栈开启activity
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        });
    } else if (newsData.imgs.size() == 0) {//显示文字
        ViewHolder2 viewHolder2 = (ViewHolder2) holder;
        viewHolder2.tvTitle.setText(newsData.title);
    } else if (newsData.imgs.size() == 1) {//显示一张图片和文字
        ViewHolder3 viewHolder3 = (ViewHolder3) holder;
        viewHolder3.tvTitle.setText(newsData.title);
        Picasso.with(context).load(newsData.imgs.get(0)).into(viewHolder3.iv1);
    }
}
第二步:新闻详情页实现
创建【NewsDetailActivity.java】文件
创建布局activity_news_detail.xml
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></WebView>

</LinearLayout>
初始化WebView并加载新闻详情
[Java] 纯文本查看 复制代码
public class NewsDetailActivity extends Activity {

    @BindView(R.id.webView)
    WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_news_detail);
        ButterKnife.bind(this);
        //初始化WebView
        webView.setWebViewClient(new WebViewClient());
        webView.setWebChromeClient(new WebChromeClient());
        webView.getSettings().setJavaScriptEnabled(true);
        String url = getIntent().getStringExtra("url");
        //加载网页
        webView.loadUrl(url);

        //传递对象给webview
        webView.addJavascriptInterface(new JsCallJava() {
            @JavascriptInterface
            @Override
            public void openImage(String src) {
                Intent intent = new Intent(getApplicationContext(),ShowActivity.class);
                intent.putExtra("url",src);
                startActivity(intent);
            }
        },"imagelistner");

    }
    public interface JsCallJava{
        public void openImage(String src);
    }

}

给网页图片添加点击事件、图片双击放大引言
进入新闻详情页以后,
但是,有时候,有这样的需求,当我点击网页中的图片时,跳转到新的activity的,查看大图。
并能给图片进行放大和缩小这样的功能。
实现这样的功能涉及两个技能要点:
点击网页中的图片时,跳转到新的activity:
js与android相互调用来实现
java调用js:给网页中每个图片添加点击事件
js调用java:点击网页中图片,调用android中方法,打开activity
查看大图:
可以使用开源框架photoView来实现
photoView:
它是开源的框架,该控件对图片显示进行扩展,能够很方便的实现缩放的效果
实现步骤第一步网页加载完成手动给图片添加点击事件
由于网页本身并没有对图片设置点击事件,因此,这里我们要动态给每个img标签添加点击事件
[Java] 纯文本查看 复制代码
//初始化WebView
webView.setWebViewClient(new WebViewClient(){
    //页面加载完成
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        //给网页里面的img标签去添加点击事件
        addPictureClick();
    }
});
给每个img标签添加点击事件
Android 调用js代码,给每个img标签添加点击事件
[Java] 纯文本查看 复制代码
private void addPictureClick() {
    //android调用js代码
    webView.loadUrl("javascript:(function(){"
            + "var objs = document.getElementsByTagName(\"img\"); "
            + "for(var i=0;i<objs.length;i++)  " + "{"
            + "    objs.onclick=function()  " + "   " + " {  "
            + "        window.imagelistner.openImage(this.src);  "
            + "    }  " + "}" + "})()");

}
第二步js调用android本地方法,打开新的Activity查看大图
当点击图片时,调用android 本地方法,打开新的activity
[Java] 纯文本查看 复制代码
//传递对象给webview
webView.addJavascriptInterface(new JsCallJava() {
    @JavascriptInterface
    @Override
    public void openImage(String src) {
        Intent intent = new Intent(getApplicationContext(),ShowActivity.class);
        intent.putExtra("url",src);
        startActivity(intent);
    }
},"imagelistner");

//创建接口对象
public interface JsCallJava{
    public void openImage(String src);
}
第三步:查看大图实现
初始化ShowActivity的布局文件
布局结构实现:
[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <uk.co.senab.photoview.PhotoView
        android:id="@+id/photoView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
注意:布局中加载图片的控件是photoView该控件对图片显示进行扩展
能够很方便的实现缩放的效果
要使用该控件需要在moudle中添加相关依赖:phoneView.jar的依赖

ShowActivity的实现
[Java] 纯文本查看 复制代码
public class ShowActivity extends Activity {

    @BindView(R.id.photoView)
    PhotoView photoView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_show);
        ButterKnife.bind(this);

        String url = getIntent().getStringExtra("url");
        Toast.makeText(this,url,Toast.LENGTH_SHORT).show();

        //显示图片
        Picasso.with(this).load(url).into(photoView);
    }
}
问题
问题1:如何在android本地中给网页中的图片添加点击事件?
l Android调用js代码来实现:
l 声明js函数
l 变量网页中每个img标签
l 给每个img标签添加onClick事件
l 在onClick方法中声明调用android本地代码的实现

作者: kona94    时间: 2017-7-3 18:03

作者: haha6598    时间: 2017-7-7 18:07
求个源码

作者: Hosing    时间: 2017-7-13 11:46
求源码,自己写的快崩溃啦

作者: baby14    时间: 2018-12-21 08:07
多谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2