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。无论用户输入什么字符串,都不会程序崩溃了,不过也许会找不到网站,如下图:

这样工作是正常的。故此大功告成!

时间: 2024-10-10 00:56:36

Android百日程序 开篇章:Intent打开网页的相关文章

Android百日程序:使用Intent回传结果

本章使用Intent,回传需要的结果: 流程: 启动主页->按下按键启动第二个activity->输入用户名,按下OK按键->回传用户名回主页->主页读取用户名并显示出来. 1 启动主页图: 2 启动第二个activity 3 输入用户名: 4 回传到主页,读取并显示: 新建项目,然后输入对应的代码就OK了. 1 主页界面代码(activity_main.xml): <LinearLayout xmlns:android="http://schemas.androi

Android -- 真正的 高仿微信 打开网页的进度条效果

(本博客为原创,http://home.cnblogs.com/u/linguanh/) 目录: 一,为什么说是真正的高仿? 二,为什么要搞缓慢效果? 三,我的实现思路 四,代码,内含注释 五,使用方法与截图 六,完整项目 一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果" ,你会看到有很多类似的文章,不过他们有个共同点,就是实现方法都是一样的,而且,都忽略了微信加载网页时,进度条的缓慢动画效果,它不是生硬地一

Android百日程序:GridView实现相册效果

本章使用GridView控件来做一个相册效果. 图片效果如下: 响应点击事件,点击的时候提示是当前第几章图片,从左到右,从上到下. 点击了第一张图片,显示了1. 步骤: 一 新建项目,然后把图片资源拷贝到res/drawable/文件夹中,如果没有drawable这个文件夹也不要紧,可以直接新建这个文件夹,然后在Eclipse项目中刷新,就会在项目中显示出来了 二 然后在Layout的界面xml文件activity_main.xml(当然也可以随意自己喜欢命名),输入如下代码: <?xml ve

Android百日程序:Intent传递数据

上一遍是回传数据,当热Activity之间是可以利用Intent很方便地传递很多数据的. 本章就两个Activity之间传递String和Int数据. 1 主要界面: 2 点击按钮之后,就进入第二个activity 这个时候会利用Toast机制显示第一个activity传递什么String和Int给第二个activity. 3 然后点击"return to main activity",回到第一个activity 同样会显示回传的信息 这样可以在activity之间来回传递需要的信息.

Android百日程序: Activity的生命期

到了Android 4 的activity的生命期内的函数有7个,变得十分复杂,完善.故此要掌握好Activity的各个函数,知道应该在那个函数写什么逻辑代码. 本篇博客写个小程序测试一下activity的声明周期如何运作. 首先总结一下: 1 onCreate():activyt第一次创建的时候调用,还可能在改activity在onStop或者onPauce状态下被系统自动释放,那么当用户需要继续回到改activity的时候,也会调用这个onCreate()函数 2 onStart():当改a

Android 在程序中关闭和打开屏幕

需求:在程序中(通过事件等方式)打开和关闭屏幕 思路:一般情况下,关闭屏幕不是将屏幕真的关闭,而是将屏幕的亮度调到最低.一般情况下Android设备对屏幕可             调节的最低亮度是有一个限制的.如果你的设备真的允许完全关闭屏幕,则只能考虑为这款设备的特性,在你             写程序时是要考虑到大多数设备的. 实现: //启用屏幕常亮功能 private void turnOnScreen() { WindowManager.LayoutParams params =

Android百日程序:进度条对话框实现

显示由Activity管理的dialog. 这种dialog有多种多样,其中比较常见的是loading的时候,显示的一个loading进度条. Android显示这样的进度条还是非常方便的,因为有现成的模块可以调用. 首先看看本程序的效果吧: 1 主界面: 2 点击这个按钮之后,显示: 进度条到了100的时候就会自动关闭,当然这里是模拟下载,真实的下载算法还需要继续完善,不过也是很简单的算法了,不算是难点. 点击Cancel或者OK按钮也可以调用函数,进行有需要的操作,这里直接显示一个Toast

Android百日程序: Fragment动态管理和生命期

之前写过Fragment使用的程序,Fragment可以静态,也可以动态载入内存中的,这一章进一步看看如何动态地更换Fragment和看看Fragment生命期都有什么函数. 本章利用响应菜单点击事件,轮流载入不同的Fragment,显示不同的界面,效果如下: 开始的是没有载入Fragmen为空白: 点击菜单的NEXT FRAGMENT VIEW,就进入下一个界面,载入两个: 继续点击显示Fragment 1: 继续点击,显示Fragment2: 然后就是循环了: 如此循环显示不同画面. 一 首

Android百日程序:高效载入大图片

问题:如果图片很大,全部载入内存,而显示屏又不大,那么再大的图片也不会提高视觉效果的,而且会消耗无谓的内存. 解决办法就是根据实际需要多大的图片,然后动态计算应该载入多大的图片:但是因为不太可能图片大小和实际需要的大小一致,故此需要载入图片大小为一个2的某次方的值,而大于实际需要的大小. 如图,载入一个微缩图大小为100*100 新建一个项目, 参考Google上的方法:http://developer.android.com/training/displaying-bitmaps/load-b