zoukankan      html  css  js  c++  java
  • Android百日程序 开篇章:Intent打开网页

    学习一下人家100日写100个网页的做法,我也用100日写100个完整的Android程序。

    这些程序的最基本要求:

    1 完整性-每一个程序都必须是独立可执行的

    2 不反复性-所用的重点知识点都不一样


    开篇章:

    --本章參考书本:Hello Android

    编写一个简单的页面。例如以下,图1:


    在文本框输入网址,图2:


    点击按钮GO,然后就能够打开这个站点了, 图3:



    步骤:

    一  首先,新建一个项目,详细參数设置能够參照我的项目设置。例如以下:


    主要看

    1 src下的Browser.java:基本的java逻辑代码

    2 layout下的activity_browser.xml。xml写的布局

    3 values的strings.xml会须要定义一些字符

    4 AndroidManifest.xml是软件的定义文件了


    二 设置布局layout。打开activity_broswser.xml

    加入代码:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        tools:context="su.bi.browerserintent.Browser" >
    
        <EditText
            android:id="@+id/url_field"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:imeOptions="actionGo"
            android:inputType="textUri"
            android:lines="1" />
    
        <Button
            android:id="@+id/go_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/go_button" />
    
    </LinearLayout>


    知识点:
    1 使用LinearLayout布局,加入一个EditText就是图片的第一有一个下横线的框。接受网址的输入注意当中的layout_width的设置,为零。那么后面的layout_weight="1.0"就使得框格扩展全部该行余下的空间了,故此直接设置layout_width为零就能够了。

    2 当中的參数imeOptions="actionGo"和imputType="textUri"是告诉Android使用的软键盘应该是带".com"和"/"和有Go按键的。按下这个按键就能够直接跳转到指定网页。

    就这样就做出如图1的界面了


    二 逻辑代码 Browser.java

    接下来就是驱动界面工作的逻辑代码

    1 设置优点理输入和按键功能

        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_browser);
            
            //Get a handle to all user interface elements
            urlText = (EditText)findViewById(R.id.url_field);
            goButton = (Button)findViewById(R.id.go_button);
            
            //Set up Handlers
            goButton.setOnClickListener(new OnClickListener() {
            	public void onClick(View v) {
            		openBrowser();
            	}
            });
            
            urlText.setOnKeyListener(new OnKeyListener() {
            	public boolean onKey(View v, int keyCode, KeyEvent event) {
            		if (equ(keyCode, KeyEvent.KEYCODE_ENTER)) {
            			openBrowser();
            			return true;
            		}
            		return false;
            	}
            });
        }
    当中的openBrowser函数是以下自己定义的。

    goButton这个按键响应点击事件。故此使用setOnClickListener(new OnClickListener())设置好OnClickListener对象监听这个按键。这里是Java独有的机制了,直接在new 后面写一个OnClickListener的继承类,重写onClick函数。 C++就不能这么写了。

    urlText是EditText的id。使用setOnKeyListener设置好对象监听。假设按下ENTER的时候就响应openBrowser函数,当然如今的触屏手机一般都没有按键了。只是有软键盘。


    openBroser函数定义:

    private void openBrowser() {
    <span style="white-space:pre">	</span>Uri uri = Uri.parse(urlText.getText().toString());
    <span style="white-space:pre">	</span>Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    <span style="white-space:pre">	</span>startActivity(intent);
    }
    新建一个Intent,使用浏览器打开这个网址。


    到此为止,整个程序就能够执行了。


    可是如今问题来了:

    假设输入blog.csdn.net/kenden23。那么就会程序崩溃的。这是为什么呢?


    又一次输入:http://blog.csdn.net/kenden23就能够正常工作了。

    哦,原来必须是以http://开头的文本才干够正常工作,

    这就须要小小处理一下了。这就是算法排上用场的时候啦,字符串处理问题--有点牛刀宰鸡的感觉了。

    又一次定义openBrwoser函数:

    	private static final String HTTPHEAD = "http://";
    	
    	public static<T> boolean equ(T a, T b) {
    		return a == b;
    	}
    
        private void openBrowser() {
        	String address = urlText.getText().toString();
        	address = checkHttpAddress(address);
        	Uri uri = Uri.parse(address);
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
        }
        
        private String checkHttpAddress(String address) {
        	int len = HTTPHEAD.length();
        	len = len < address.length()? len : address.length();
        	String str = address.substring(0, len);
        	if (equ(str, HTTPHEAD)) {
        		return address;
        	}
        	return HTTPHEAD + address;	
        }
    小技巧:自己定义equ的优点是不会把==错写成=了。坏处?多写点代码。

    哈哈。

    主要是checkHttpAddress这个函数起作用,就是推断当前用户的输入是否带"http://",假设没带。那么就自己主动加上,假设带了,就不用管了。

    注意算法的功力,达到无bug。不管用户输入什么字符串。都不会程序崩溃了,只是或许会找不到站点,例如以下图:


    这样工作是正常的。

    故此大功告成!



  • 相关阅读:
    随机数
    ASP .NET下的301重定向如何做
    网站外部链接建设方案
    解析ASP.NET WebForm和Mvc开发的区别
    委托、匿名委托和lambda表达式
    图片垂直居中
    jquery函数写法
    [转]函数方法常用的动词
    CSS Hack
    富文本编辑器
  • 原文地址:https://www.cnblogs.com/llguanli/p/8898124.html
Copyright © 2011-2022 走看看