Android 手机浏览器的开发

最近看android资料,随手写了个简单手机浏览器应用,该应用很简单,主要包括AutoCompleteTextView 、WebView、Button控件,但是涉及到了很多android开发常识,例如:权限管理、布局标题栏状态栏隐藏、开辟线程监听事件、子线程不能更新主线程UI等,下面介绍一下代码示例:

1,修改AndroidManifest.xml文件,首先添加上网和应用旋转权限, 如下:

 

[html] view plaincopy
 
  1. <uses-permission android:name="android.permission.INTERNET"/>  
  2. <uses-permission android:name="android.permission.SET_ORIENTATION"/>  


在此也可以添加如下代码使应用全屏,即隐藏状态栏和标题栏

 

 

[html] view plaincopy
 
  1. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  

2, xml布局代码如下:

 

 

[html] view plaincopy
 
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <AutoCompleteTextView  
  7.         android:id="@+id/url"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:hint="@string/url"  
  11.         android:inputType="textUri"   
  12.         android:completionHint="@string/url"  
  13.         android:completionThreshold="1" />  
  14.   
  15.     <WebView  
  16.         android:id="@+id/show"  
  17.         android:layout_width="match_parent"  
  18.         android:layout_height="match_parent"  
  19.         android:layout_above="@+id/btnLayout"  
  20.         android:layout_below="@+id/url" />  
  21.   
  22.     <LinearLayout  
  23.         android:id="@+id/btnLayout"  
  24.         android:layout_width="match_parent"  
  25.         android:layout_height="wrap_content"  
  26.         android:layout_alignParentBottom="true"  
  27.         android:layout_alignParentLeft="true"  
  28.         android:layout_alignParentRight="true"  
  29.         android:orientation="horizontal" >  
  30.   
  31.         <Button  
  32.             android:id="@+id/back"  
  33.             android:layout_width="wrap_content"  
  34.             android:layout_height="wrap_content"  
  35.             android:layout_weight="1.0"  
  36.             android:text="@string/back" />  
  37.   
  38.         <Button  
  39.             android:id="@+id/forward"  
  40.             android:layout_width="wrap_content"  
  41.             android:layout_height="wrap_content"  
  42.             android:layout_weight="1.0"  
  43.             android:text="@string/forward" />  
  44.   
  45.         <Button  
  46.             android:id="@+id/refresh"  
  47.             android:layout_width="wrap_content"  
  48.             android:layout_height="wrap_content"  
  49.             android:layout_weight="1.0"  
  50.             android:text="@string/refresh" />  
  51.   
  52.         <Button  
  53.             android:id="@+id/home"  
  54.             android:layout_width="wrap_content"  
  55.             android:layout_height="wrap_content"  
  56.             android:layout_weight="1.0"  
  57.             android:text="@string/home" />  
  58.     </LinearLayout>  
  59.   
  60. </RelativeLayout>  

布局设计中要注意实现适应屏幕。

 

3, java代码

 

[java] view plaincopy
 
  1. package com.example.webbrowser;  
  2.   
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5. import java.util.regex.Matcher;  
  6. import java.util.regex.Pattern;  
  7.   
  8. import android.app.Activity;  
  9. import android.graphics.Bitmap;  
  10. import android.os.Bundle;  
  11. import android.os.Handler;  
  12. import android.os.Message;  
  13. import android.view.KeyEvent;  
  14. import android.view.Menu;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.webkit.WebView;  
  18. import android.webkit.WebViewClient;  
  19. import android.widget.ArrayAdapter;  
  20. import android.widget.AutoCompleteTextView;  
  21. import android.widget.Button;  
  22. import android.widget.Toast;  
  23.   
  24. public class WebBrowser extends Activity {  
  25.   
  26.     AutoCompleteTextView url;  
  27.     WebView show;  
  28.       
  29.     String[] booksArray = new String[]  
  30.     {  
  31.             "http://maps.google.com",  
  32.             "http://maps.baidu.com",  
  33.             "http://qq.com",  
  34.             "www.baidu.com",  
  35.             "www.163.com"  
  36.     };  
  37.       
  38.     @Override  
  39.     public void onCreate(Bundle savedInstanceState)   
  40.     {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.activity_web_browser);  
  43.           
  44.         final Activity activity = this;  
  45.                   
  46.         show = (WebView)findViewById(R.id.show);  
  47.         show.getSettings().setJavaScriptEnabled(true);  
  48.         show.getSettings().setBuiltInZoomControls(true);  
  49.         //show.getSettings().setDisplayZoomControls(false);  
  50.         show.setWebViewClient(new WebViewClient()  
  51.         {  
  52.             public boolean shouldOverrideUrlLoading(WebView view, String strUrl)  
  53.             {  
  54.                 view.loadUrl(strUrl);  
  55.                 url.setText(strUrl);  
  56.                 return false;  
  57.             }  
  58.               
  59.             public void onPageStarted(WebView view, String strUrl, Bitmap favicon)  
  60.             {  
  61.                 super.onPageStarted(view, strUrl, favicon);  
  62.                 url.setText(strUrl);  
  63.             }  
  64.               
  65.             public void onPageFinished(WebView view, String strUrl)  
  66.             {  
  67.             }  
  68.               
  69.             public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)   
  70.             {  
  71.                  Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();  
  72.             }  
  73.         });  
  74.           
  75.                   
  76.         url = (AutoCompleteTextView)findViewById(R.id.url);  
  77.         ArrayAdapter<String> aa = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, booksArray);  
  78.         url.setAdapter(aa);  
  79.         url.setOnKeyListener(new View.OnKeyListener()   
  80.         {             
  81.             public boolean onKey(View v, int keyCode, KeyEvent ev)   
  82.             {  
  83.                 if (keyCode == KeyEvent.KEYCODE_ENTER)  
  84.                 {  
  85.                     String strUrl = url.getText().toString();  
  86.                       
  87.                     Pattern p = Pattern.compile("http://([\\w-]+\\.)+[\\w-]+(/[\\w-\\./?%=]*)?");  
  88.                     Matcher m = p.matcher(strUrl);  
  89.                     if (!m.find())  
  90.                     {  
  91.                         strUrl = "http://" + strUrl;  
  92.                     }  
  93.                       
  94.                     show.loadUrl(strUrl);  
  95.                       
  96.                     return true;  
  97.                 }  
  98.                   
  99.                 return false;  
  100.             }  
  101.         });  
  102.           
  103.         // button   
  104.         final Button backBtn = (Button)findViewById(R.id.back);  
  105.         final Button forwardBtn = (Button)findViewById(R.id.forward);  
  106.         Button refreshBtn = (Button)findViewById(R.id.refresh);  
  107.         Button homeBtn = (Button)findViewById(R.id.home);  
  108.         backBtn.setEnabled(false);  
  109.         forwardBtn.setEnabled(false);  
  110.           
  111.         backBtn.setOnClickListener(new OnClickListener()  
  112.         {  
  113.             public void onClick(View v)  
  114.             {  
  115.                 show.goBack();  
  116.             }  
  117.         });  
  118.           
  119.         forwardBtn.setOnClickListener(new OnClickListener()  
  120.         {  
  121.             public void onClick(View v)  
  122.             {  
  123.                 // TODO  
  124.                 show.goForward();  
  125.             }  
  126.         });  
  127.           
  128.         refreshBtn.setOnClickListener(new OnClickListener()  
  129.         {  
  130.             public void onClick(View v)  
  131.             {  
  132.                 // TODO  
  133.                 String strUrl = url.getText().toString();  
  134.                 show.loadUrl(strUrl);  
  135.             }  
  136.         });  
  137.           
  138.         homeBtn.setOnClickListener(new OnClickListener()  
  139.         {  
  140.             public void onClick(View v)  
  141.             {  
  142.                 // TODO  
  143.                 show.loadUrl("http://maps.google.com");  
  144.             }  
  145.         });  
  146.           
  147.         final Handler handler = new Handler()  
  148.         {  
  149.             @Override  
  150.             public void handleMessage(Message msg)  
  151.             {  
  152.                 if (msg.what == 0x1111)  
  153.                 {  
  154.                     // whether can go back    
  155.                     if (show.canGoBack())  
  156.                     {  
  157.                         backBtn.setEnabled(true);  
  158.                     }  
  159.                     else  
  160.                     {  
  161.                         backBtn.setEnabled(false);  
  162.                     }  
  163.                       
  164.                     // whether can go forward  
  165.                     if (show.canGoForward())  
  166.                     {  
  167.                         forwardBtn.setEnabled(true);  
  168.                     }  
  169.                     else  
  170.                     {  
  171.                         forwardBtn.setEnabled(false);  
  172.                     }  
  173.                 }  
  174.                   
  175.                 super.handleMessage(msg);  
  176.             }  
  177.         };  
  178.           
  179.         // create thread to change button states   
  180.         new Timer().schedule(new TimerTask()  
  181.         {  
  182.             public void run()  
  183.             {  
  184.                 Message msg = new Message();  
  185.                 msg.what = 0x1111;  
  186.                 handler.sendMessage(msg);  
  187.             }  
  188.         }, 0, 100);  
  189.     }  
  190.       
  191.     @Override  
  192.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  193.         // Check if the key event was the Back button and if there's history  
  194.         if ((keyCode == KeyEvent.KEYCODE_BACK) && show.canGoBack())  
  195.         {  
  196.             show.goBack();  
  197.             return true;  
  198.         }  
  199.         // If it wasn't the Back key or there's no web page history, bubble up to the default  
  200.         // system behavior (probably exit the activity)  
  201.         return super.onKeyDown(keyCode, event);  
  202.     }  
  203.   
  204.     @Override  
  205.     public boolean onCreateOptionsMenu(Menu menu) {  
  206.         getMenuInflater().inflate(R.menu.activity_web_browser, menu);  
  207.         return true;  
  208.     }  
  209. }  



 

除了AutoCompleteTextView输入URL和WebView显示网页内容外,应用底部有四个Button分别实现后退、前进、刷新、主页(暂未实现)等功能,到此就可以在android手机上使用自己的浏览器了。

 

4,应用截图:

posted @ 2014-12-21 13:13  net5x  阅读(352)  评论(0编辑  收藏  举报