android webView不简单

手机屏幕大小很伤程序员

励志成为一名Java工程师的我,真的被它伤到了,不仅因为webView的强大,而且这个内容适合各样屏幕大小问题。想当年苹果工程师嘲笑安卓工程师们加班在处理屏幕的适配,简直是在重复的工作,没想到多年后,苹果的手机也出现了屏幕大小不一样的,苹果工程师哭倒在厕所里,万事真的没有绝对啊!

1.解析RSS的xml文件

现在大多数的新闻和杂志都会给大家RSS,我们需要解析它的xml文件,但是如果获取里面的数据时,注意它的标签并不都一样,需要注意!

                        File tempFile = Environment.getExternalStorageDirectory()
					.getAbsoluteFile();
			File file = new File(tempFile, (format.format(date) + ".xml"));
			HttpClient client = new DefaultHttpClient();
			HttpGet get = new HttpGet(RSS_URL);
			try {
				HttpResponse response = client.execute(get);
				if (response.getStatusLine().getStatusCode() == 200) {
					InputStream inputStream = response.getEntity().getContent();

					FileOutputStream fos = new FileOutputStream(file);
					int byteread = 0;
					byte[] buffer = new byte[1024];
					while ((byteread = inputStream.read(buffer)) != -1) {

						fos.write(buffer, 0, byteread);
					}
					fos.flush();
					fos.close();
					inputStream.close();
				}
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
                        list=new ArrayList<Map<String,RssItem>>();
			SAXReader reader = new SAXReader();
			try {
				Document document = reader.read(file); // 通过reader对象的read方法获得document对象
				Element rootelement = document.getRootElement(); // 获得根节点
				Element channelelement = rootelement.element("channel");// 获得channel节点
				Iterator channel_iterator = channelelement.elementIterator();

				 // 准备第一个模板,将需要改变的时间格式
				String pat1 = "EEE, dd MMM yyyy HH:mm:ss Z" ;
		        // 准备第二个模板,将提取后的日期数字变为指定的格式
		        String pat2 = "yyyy年MM月dd日 HH时mm分" ;
		        Locale local=Locale.ENGLISH;
		        SimpleDateFormat sdf1 = new SimpleDateFormat(pat1,local) ;        // 实例化模板对象
		        SimpleDateFormat sdf2 = new SimpleDateFormat(pat2) ;        // 实例化模板对象
				while (channel_iterator.hasNext()) {
					//只能放在map里,不能发在对象里
					Map<String,RssItem>map1=new HashMap<String,RssItem>();
					Element itemelement = (Element) channel_iterator.next();
					if ("item".equals(itemelement.getName())) {
						Iterator item_iterator = itemelement.elementIterator();
						rssItem = new RssItem();
						while (item_iterator.hasNext()) {

							Element itemChild = (Element) item_iterator.next();

							if ("title".equals(itemChild.getName())) {

								rssItem.setTitle(itemChild.getStringValue());
								Log.i("RSS", itemChild.getStringValue());

							}
							if ("link".equals(itemChild.getName())) {
								rssItem.setLink(itemChild.getStringValue());
								Log.i("RSS", itemChild.getStringValue());
							}
							if ("description".equals(itemChild.getName())) {
								rssItem.setDescription(itemChild
										.getStringValue());
								Log.i("RSS", itemChild.getStringValue());
								if (getImgStr(itemChild.getStringValue())!=null) {
									//区第一个的url地址
									rssItem.setImage(getImgStr(itemChild.getStringValue()));
								}else{
									rssItem.setImage("");
								}

							}
							if ("pubDate".equals(itemChild.getName())) {

								Date date1= sdf1.parse(itemChild.getStringValue());
								String pubDate=sdf2.format(date1);
								rssItem.setPubDate(pubDate);
								Log.i("RSS", pubDate);
							}
							if ("author".equals(itemChild.getName())) {

								rssItem.setAuthor(itemChild.getStringValue());
								Log.i("RSS", itemChild.getStringValue());
							}

						}
						if (rssItem.getImage().equals("")) {

						}else {
							map1.put("rssItem", rssItem);
							list.add(map1);
						}

						//feed.addItem(map1);

					}
				}

			} catch (DocumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			 Message message = new Message();
			 message.what = 1;
			 handler.sendMessage(message);
			 RSS_URL=null;
		}

这样的写法不要学习,需要把其中一部分写成公共的方法。因为也是在学习,所有后期会都封装成公用的方法。

2.时间的格式化

因为RSS里的文章日期格式是:Thu, 13 Aug 2015 11:30:00 +0800, Calendar时间格式,我们需要的格式是2015年9月1日。这个该怎么转换呢?网上找的都是以
new DATE()做为转换对象,这不符合我们实际情况,这时候你需要查询你的jdk文档了,在文档里可以找到他的格式:"EEE, dd MMM yyyy HH:mm:ss Z"。

        String a="Fri, 14 Aug 2015 02:20:10 +0800";//
	String pat1 = "EEE, dd MMM yyyy HH:mm:ss Z" ;    //EEE, dd MMM yyyy HH:mm:ss Z
        // 准备第二个模板,将提取后的日期数字变为指定的格式
        String pat2 = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒" ;  //MOTH
        //由于local生成很费时间,提前生成
        Locale local=Locale.ENGLISH;
        SimpleDateFormat sdf1 = new SimpleDateFormat(pat1,local) ;        // 实例化模板对象
        SimpleDateFormat sdf2 = new SimpleDateFormat(pat2) ;        // 实例化模板对象
        try {
			Date date= sdf1.parse(a);
			System.out.println(sdf2.format(date));
		} catch (ParseException e) {
			e.printStackTrace();
		}

   
对于这个应该都会很常用。

3.手机大小适配

webView很强大,能够显示html的内容,这让手机能够解析html,而且到了5.0 webView增加了更大的功能。我需要显示文章的图片,但是图片变会超出屏幕大小,为了能在每个机子里显示的效果,需要加上这两行代码:

            //是内容与手机适配
	    bodyHtml.getSettings().setUseWideViewPort(true);
	    bodyHtml.getSettings().setLoadWithOverviewMode(true);

这样确实可以把图片变得适合手机大小,但是字体随着图片同样的变小了,因此我们需要把字体调大:

            //设置默认的字体大小
	    bodyHtml.getSettings().setDefaultFontSize(40);

这虽然不是最佳解决办法,应该在RSS里文章的内容写设定好图片的最大大小,但如果在重新修改img标签,会让图片多的文章加载变得慢,因此只能委曲求全应这个办法,(网上写的大多数方法还是不能解决我的需求,还是在泡上在网上的日子找到解决的办法,该网站做的不错,风格我喜欢的类型,简洁风格)把全部代码显示如下:

                Intent itent=getIntent();
		//文章内容
		String title=itent.getStringExtra("content");

		//去除超链接,保留字体
		String regex="<\\s*a.*?/a\\s*>";
		title=title.replaceAll(regex, "");

		//添加html标头
		String news="<html>"+title+"<html>";

		//得到WebView组件
	    WebView bodyHtml=(WebView)this.findViewById(R.id.wv_paper_content);

	    //设置默认的字体大小
	    bodyHtml.getSettings().setDefaultFontSize(40);
	    //是内容与手机适配
	    bodyHtml.getSettings().setUseWideViewPort(true);
	    bodyHtml.getSettings().setLoadWithOverviewMode(true);

	    //能够的调用JavaScript代码
	    bodyHtml.getSettings().setJavaScriptEnabled(true);
	    bodyHtml.getSettings().setDefaultTextEncodingName("utf-8");
	    //加载HTML字符串进行显示
	    bodyHtml.loadDataWithBaseURL(null, news, "text/html", "utf-8", null);

总算把这个星期碰到的问题和解决办法写完了,虽然只是简单写下,而且还是学了两个星期的安卓,就开始做项目,但是真的学到了很多知识,尤其运用到了web的知识,我也相信webApp才是未来的主潮!!!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 00:06:41

android webView不简单的相关文章

Android WebView 开发教程

1.WebView的使用 (a). 创建WebView的实例加入到Activity中 WebView webview = new WebView(this); setContentView(webview); 或者在xml中配置WebView <Webview android:layout_width="match_parent" android:layout_height="match_parent" > </Webview> (b). 访

屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能加载页面

发现在家里的时候用Android App里的WebView打开网站很慢,会有十几秒甚至更长时间的卡住. 但是在电脑上打开同样的网页却很快. 查找这个问题的过程比较曲折,记录下来. 抓取Android网络数据 为了调试这个问题,首先要抓取Android的网络包数据.开始时,是想用Wireshark来抓包的,但是很麻烦,tcpdump在手机要root权限. 于是转换思路,能不能在Android上设置代理,来抓包? 但是fiddler没有linux版本,于是转用BurpSuite了. 设置Androi

Android WebView 输入框键盘不弹出

问题 在Android中使用内嵌的WebView加载HTML网页时,如果html页面中存在输入框.那么在有些手机设备中,当输入框获取焦点时,系统输入法键盘无法正确弹出,从而无法完成正常的输入要求 在做APP时,自己也遇到了这个问题,以下是自己解决的方法,有可能不适合大家所遇到的情况,但值得借鉴~ WebView设置问题 有些时候我们设计的html页面并不能够很好的适应WebView,尤其我们的html页面是为PC浏览器设计的时候,当使用WebView来加载时,界面很可能会发生错乱,当input输

android webview 通过html5播放在线视频 切换大屏

1.添加网络访问权限 <uses-permission android:name="android.permission.INTERNET" /> 2.webview添加全屏支持 developer官方文档关于html5支持视频播放描述如下:In order to support inline HTML5 video in your application, you need to have hardware acceleration turned on, and set

android webview点击返回键返回上一级activity

android webview点击返回键返回上一个activity 1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 // TODO Auto-generated method stub 4 if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 5 return true; 6 } 7 return super

Android:WebView中对图片注册上下文菜单

前言 今天一朋友问我一个问题,就是如何在WebView控件中的图片增加上下文菜单,以便增加保存图片等功能.今天就给他简单做了一个演示Demo,现写下来,给有相同问题的朋友提供些许思路吧. 概要实现 其实这个功能很简单,没有太复杂的东西,就是对WebView的控件的使用,一是给WebView注册了上下文菜单事件,二是在响应事件中去判断事件源的类型,如果是图片类型,则把url取出来 注册上下文菜单事件 这个就比较简单了通过下面的代码即可完成. WebView vw = (WebView) findV

android webview &quot;Uncaught SecurityError: Failed to read the &#39;localStorage&#39; property from &#39;Window&#39;: Access is denied for this document.&quot;, source: (1)

这种错误,可以在loadurl之后再调用 localstorage.setitem()即可解决. "Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.", source:  (1) android webview "Uncaught SecurityError: Failed to read t

android WebView详细使用方法(转)

1.最全面的Android Webview详解 2.最全面总结 Android WebView与 JS 的交互方式 3.你不知道的 Android WebView 使用漏洞

Android WebView 开发详解(一)

转载请注明出处  http://blog.csdn.net/typename/article/details/39030091 powered by meichal zhao 概览: Android WebView在Android平台上是一个特殊的View, 他能用来显示网页,这个类可以被用来在你的app中仅仅显示一张在线的网页,还可以用来开发浏览器.WebView内部实现是采用渲染引擎来展示view的内容,提供网页前进后退,网页放大,缩小,搜索,前端开发者可以使用web inspector(A