首页 > 技术文章 > 一个简易的android浏览器。求指教!

jiehong 2017-05-18 16:15 原文

开发android的浏览器很简单吧,不过这浏览器倒是很简易。下面每一处代码都备注上注解了!废话不多说,下面直接上代码!

运行后界面

 

 

主界面的代码

activity_main.xml布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="140dp" >
<ImageView
android:id="@+id/imageBanner"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/ic_launcher" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp">

<Button
android:id="@+id/btn_so"
android:layout_width="55dp"
android:layout_height="50dp"
android:background="@drawable/sou"/>

<EditText
android:id="@+id/ed_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:hint="请输入网址">

<requestFocus />
</EditText>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp" >

<ImageButton
android:id="@+id/img_baidu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/bd" />

<ImageButton
android:id="@+id/img_huohu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/sh" />

<ImageButton
android:id="@+id/img_qq"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/qq" />

<ImageButton
android:id="@+id/img_slo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/slo" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp">

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginLeft="15dp"
android:orientation="vertical" >

<TextView
android:id="@+id/text_news"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="新闻"
android:textSize="20dp" />

<TextView
android:id="@+id/text_jingdong"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="京东" />

</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >

<TextView
android:id="@+id/text_jiaju"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="家居"
android:textSize="20dp" />

<TextView
android:id="@+id/text_junshi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="军事" />

</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >

<TextView
android:id="@+id/text_music"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="音乐" />

<TextView
android:id="@+id/text_sport"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="运动" />

</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >

<TextView
android:id="@+id/text_dianying"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="电影" />

<TextView
android:id="@+id/text_live"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="生活" />

</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >

<TextView
android:id="@+id/text_more1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="更多》" />

<TextView
android:id="@+id/text_more2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="更多》" />

</LinearLayout>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:orientation="horizontal" >

<ImageView
android:id="@+id/img_img"
android:layout_width="91dp"
android:layout_height="wrap_content"
android:layout_weight="0.77"
android:src="@drawable/shenghuo" />
</LinearLayout>

</LinearLayout>

主MainActivity.java

public class MainActivity extends Activity implements OnClickListener {
//定义TextView
private TextView text_news,text_music;
//定义图片按钮
private ImageButton img_baidu,img_huohu,img_qq,img_sh;
//定义搜索按钮
private Button btn_sou=null;
//定义输入框
private EditText ed_text=null;
//定义一个图片
private ImageView img,img_img;
//定义一个图片数组
private int[] images=new int[]{
R.drawable.a,
R.drawable.b,
R.drawable.bb,
R.drawable.c,
R.drawable.ff,

};
//创建Handler对象 用于接收消息
private Handler handler=new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case 1:
Bundle b=msg.getData(); //获取接收到的数据
int i=b.getInt("index"); //获取index
img.setImageResource(images[i]);//设置图片来源
break;

}
}
};
//创建定时器线程
private Timer timer=new Timer();
private TimerTask timeTask=new TimerTask(){
public void run(){
Random t=new Random(); //创建一个随机函数
int index=t.nextInt(5); //产生5以内的一个随机数
Bundle bundle=new Bundle(); //创建一个bundle对象,作用是捆绑数据
bundle.putInt("index", index); //将index放入bundle对象把随机数放消息里面
Message msg=new Message();
msg.what=1;
msg.setData(bundle); //将bundle作为书记放入消息
handler.sendMessage(msg); //将消息发送出去

}

};

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到图片的组件,textView控件
img=(ImageView)findViewById(R.id.imageBanner);
img_img=(ImageView)findViewById(R.id.img_img);
text_news=(TextView)findViewById(R.id.text_news);
text_music=(TextView)findViewById(R.id.text_music);

//找到各浏览器图标组件
img_baidu=(ImageButton)findViewById(R.id.img_baidu);
img_huohu=(ImageButton)findViewById(R.id.img_huohu);
img_qq=(ImageButton)findViewById(R.id.img_qq);
img_sh=(ImageButton)findViewById(R.id.img_slo);
//搜索按钮,输入框组件
btn_sou=(Button)findViewById(R.id.btn_so);
ed_text=(EditText)findViewById(R.id.ed_txt);
ed_text.requestFocus();
ed_text.setSelectAllOnFocus(true);
//设置点击监听事件
btn_sou.setOnClickListener(this);
img_baidu.setOnClickListener(this);
img_huohu.setOnClickListener(this);
img_qq.setOnClickListener(this);
img_sh.setOnClickListener(this);
text_news.setOnClickListener(this);
text_music.setOnClickListener(this);
img_img.setOnClickListener(this);
//调用timeTask
timer.schedule(timeTask, 0,3000);
}

public void onClick(View v) {
switch(v.getId()){
case R.id.btn_so:
//创建Intent 用于开启新的Activity
Intent intent=new Intent(MainActivity.this,SendActivity.class);
//获取输入框的网址
String uri=ed_text.getText().toString();
//判断输入框输入的网址 toLowerCase把输入字符串中的大写字母全部变成小写字符。
//判断是否输入字符串,则提示消息
if("".equals(ed_text.getText().toString())){
Toast.makeText(MainActivity.this, "输入框不能为空", 0).show();
}
if(uri.length()>0)
{
if(!(uri.toLowerCase().startsWith("http://"))||(uri.toLowerCase().startsWith("http://")))
{
uri="http://"+uri;
}
//封装输入的网址
intent.putExtra("uri",uri);

//开启新的Activity
startActivity(intent);
}

break;

case R.id.img_baidu:
//创建Intent 用于开启新的Activity
Intent inten=new Intent(MainActivity.this,SendActivity.class);
//定义一个String 用于放置网址
String urq="http://www.baidu.com";
//封装网址
inten.putExtra("uri",urq);
//开启新的Activity SendActivity
startActivity(inten);
break;

//同上
case R.id.img_slo:
Intent slo=new Intent(MainActivity.this,SendActivity.class);
String sl="http://www.so.com/s?q=";
slo.putExtra("uri",sl);
startActivity(slo);
break;
case R.id.img_qq:
Intent sqq=new Intent(MainActivity.this,SendActivity.class);
String ql="http://www.qq.com";
sqq.putExtra("uri",ql);
startActivity(sqq);
break;
case R.id.img_huohu:
Intent shh=new Intent(MainActivity.this,SendActivity.class);
String hh="http://www.soso.com/q?w=";
shh.putExtra("uri",hh);
startActivity(shh);
break;
case R.id.text_news:
Intent news=new Intent(MainActivity.this,SendActivity.class);
String xinwen="http://xw.qq.com/m/news";
news.putExtra("uri",xinwen);
startActivity(news);
break;
case R.id.text_music:
Intent musics=new Intent(MainActivity.this,SendActivity.class);
String music="https://y.qq.com/";
musics.putExtra("uri",music);
startActivity(musics);
break;
case R.id.img_img:
Intent live=new Intent(MainActivity.this,SendActivity.class);
String shuo="https://www.jd.com/";
live.putExtra("uri",shuo);
startActivity(live);
break;

default:
break;
}
}
}

 跳转的界面布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<Button
android:id="@+id/btn_back"
android:layout_width="45dp"
android:layout_height="43dp"
android:background="@drawable/fanhi" />

<EditText
android:id="@+id/ed_t"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1.10"
android:ems="10"
android:singleLine="true" >

<requestFocus />
</EditText>

<Button
android:id="@+id/btn_sou"
android:layout_width="45dp"
android:layout_height="43dp"
android:background="@drawable/sou" />
</LinearLayout>

<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="5dp"
android:visibility="invisible" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="380dp" >

<WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="397dp" />
</LinearLayout>

<RelativeLayout
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="22dp"
android:background="#F3F3Fa" >

<Button
android:id="@+id/btn_mian"
android:layout_width="43dp"
android:layout_height="43dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="22dp"
android:background="@drawable/mian" />

<Button
android:id="@+id/btn_backq"
android:layout_width="43dp"
android:layout_height="43dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="24dp"
android:background="@drawable/back" />

<Button
android:id="@+id/btn_shuaxin"
android:layout_width="45dp"
android:layout_height="43dp"
android:layout_alignParentTop="true"
android:layout_marginRight="18dp"
android:layout_toLeftOf="@+id/btn_mian"
android:background="@drawable/shuanxin" />

<Button
android:id="@+id/btn_qj"
android:layout_width="43dp"
android:layout_height="43dp"
android:layout_alignParentTop="true"
android:layout_marginLeft="14dp"
android:layout_toRightOf="@+id/btn_backq"
android:background="@drawable/qianjin" />

<Button
android:id="@+id/btn_jia"
android:layout_width="45dp"
android:layout_height="43dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:background="@drawable/jia" />

</RelativeLayout>

</LinearLayout>

跳转的SendActivity

public class SendActivity extends Activity implements OnClickListener {
//定义后退,前进,刷新,主页Button
private Button btn_backq,btn_qianjin,btn_shuanxin,btn_mian;
//定义一个EditText
private EditText ed_t;
//定义搜索按钮和返回按钮
private Button btn_back,btn_sou;
//定义WebView对象
private WebView webview;
//定义一个进度条对象
private ProgressBar bar;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view);
//找到WebView的控件
webview=(WebView)findViewById(R.id.webView1);

//获取Intent传过来的数据,webView加载数据
Intent intent=getIntent();
String url=intent.getStringExtra("uri");
webview.loadUrl(url);

//获取Intent传过来的数据,webView加载数据
Intent in=getIntent();
String urq=in.getStringExtra("urq");
webview.loadUrl(urq);

//获取Intent传过来的数据,webView加载数据
Intent slo=getIntent();
String ue=slo.getStringExtra("sl");
webview.loadUrl(ue);

//获取Intent传过来的数据,webView加载数据
Intent qq=getIntent();
String iqq=qq.getStringExtra("ql");
webview.loadUrl(iqq);

//获取Intent传过来的数据,webView加载数据
Intent hu=getIntent();
String ihu=hu.getStringExtra("hh");
webview.loadUrl(ihu);

//获取Intent传过来的数据,webView加载数据
Intent news=getIntent();
String newss=news.getStringExtra("xinwen");
webview.loadUrl(newss);

//获取Intent传过来的数据,webView加载数据
Intent music=getIntent();
String musics=music.getStringExtra("music");
webview.loadUrl(musics);

//获取Intent传过来的数据,webView加载数据
Intent live=getIntent();
String lives=live.getStringExtra("shuo");
webview.loadUrl(lives);

//找到输入框,返回按钮,搜索按钮,后退,前进,刷新等控件
ed_t=(EditText)findViewById(R.id.ed_t);
btn_back=(Button)findViewById(R.id.btn_back);
btn_sou=(Button)findViewById(R.id.btn_sou);
btn_backq=(Button)findViewById(R.id.btn_backq);
btn_qianjin=(Button)findViewById(R.id.btn_qj);
btn_shuanxin=(Button)findViewById(R.id.btn_shuaxin);
btn_mian=(Button)findViewById(R.id.btn_mian);
bar=(ProgressBar)findViewById(R.id.progressBar1);
//设置点击事件
btn_back.setOnClickListener(this);
btn_sou.setOnClickListener(this);
btn_backq.setOnClickListener(this);
btn_qianjin.setOnClickListener(this);
btn_shuanxin.setOnClickListener(this);
btn_mian.setOnClickListener(this);

//设置webview监听事件
webview.getSettings().setJavaScriptEnabled(true);//开启javascript支持
webview.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url){
view.loadUrl(url);//加载网址
ed_t.setText(url);
//true 是设置在webView中打开网页
return true;
}

public void onPageFinished(WebView view, String url) {
bar.setVisibility(View.INVISIBLE);//设置进度条隐藏
super.onPageFinished(view, url);
}

public void onPageStarted(WebView view, String url, Bitmap favicon) {
bar.setVisibility(View.VISIBLE);//设置进度条隐藏
super.onPageStarted(view, url, favicon);
}

});

//进度条的处理
webview.setWebChromeClient(new WebChromeClient(){
public void onProgressChanged(WebView view, int newProgress){
bar.setProgress(newProgress);
super.onProgressChanged(view, newProgress);
}
//更改网址的标题
public void onReceivedTitle(WebView view, String title) {
SendActivity.this.setTitle(title);

super.onReceivedTitle(view, title);
}


});

}

@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn_sou:
String url=ed_t.getText().toString().trim();
//tolower转换成小写,不以http开头,判断也没有输入前缀的http
//判断是否输入字符串则提示消息
if("".equals(ed_t.getText().toString())){
Toast.makeText(SendActivity.this, "输入框不能为空", 0).show();
}
if(url.length()>0){
if(!(url.toLowerCase().startsWith("http://"))||(url.toLowerCase().startsWith("http://"))){
url="http://"+url;
}
ed_t.clearFocus();//失去焦点
webview.requestFocus();//webview获得焦点
webview.stopLoading();//让webview停止加载
webview.loadUrl(url);//加载url路径
}
break;
//后退按钮
case R.id.btn_backq:
if(webview.canGoBack()){
webview.goBack();
}
break;
//前进
case R.id.btn_qj:
if(webview.canGoForward()){
webview.goForward();
}
break;
//刷新
case R.id.btn_shuaxin:
webview.reload();
break;
//返回首页
case R.id.btn_mian:
SendActivity.this.finish();
break;
case R.id.btn_back:
//返回按钮
//关闭当前
SendActivity.this.finish();
break;

default:
break;
}
}
//按钮的点击事件

public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
if(webview.canGoBack()){
webview.goBack();
return true;
}else{
System.exit(0);//表示正常退出
}
}
return super.onKeyDown(keyCode, event);
}

}

最后不要忘记在AndroidManifest.xml给浏览器加上上网的权限

<uses-permission android:name="android.permission.INTERNET"/>

好咯,这样简易的浏览器就做好了!具备基本的上网,以后还会添加更多功能!

推荐阅读