Android Webview example-part 1
【翻译】Android WebView 实例(一)
原文:http://www.androidpeople.com/android-webview-example-part-1/
Webview主要用于在我们的程序中加载一段html内容。我们将分几个部分来讨论。在第一部分我们在程序中使用webview来加载一个普通的网页。LoadUrl是把网页加载到webview控件中的主要方法,所以我们使用下面的代码片段来加载一个网页
1 2 3 4 5 6 7 8 9 10 11 12 | // WebViewExample.java public class WebViewExample extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); WebView webView = (WebView) findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl("http://www.androidpeople.com"); webView.setWebViewClient(new HelloWebViewClient()); } } |
可是使用上面的方法,在程序中点击网页链接的时候,会使用android系统默认的浏览器来打开。为了解决这个问题,我们可以使用 shouldOverrideUrlLoading()方法和它的两个参数:webview和url。现在就可以在程序中打开网页链接了。
1 2 3 4 5 6 7 8 9 10 | /** * 通过实现一个轻便的WebViewClient,就可以实现在程序中打开网络链接而不使用系统自带的浏览器 */ public class HelloWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } } |
AsyncTask in Android
在Android中使用AsyncTask
android中有两种实现异步的途径,AsyncTask和线程。本篇日志记录AsyncTask的使用。
实现AsyncTask基本结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | private class YourTask extends AsyncTask<Object, String, Boolean> { /** * callback onPreExecute() * 执行 AsyncTask 前的逻辑 * 在UI线程中 */ @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); } /** * callback doInBackground() * 真正需要实现的后台逻辑 */ @Override protected Boolean doInBackground(Object... params) { // params参数与在UI线程中调用 execute时的参数对应 return null; } /** * callback onProgressUpdate() * 调用publishProgreess()时运行 * 用于接收信息 * 在UI线程中 */ @Override protected void onProgressUpdate(String... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); } /** * callback onPostExecute() * 在UI线程中 */ @Override protected void onPostExecute(Boolean result) { // TODO Auto-generated method stub super.onPostExecute(result); } } |
执行任务,当执行AsyncTask的execute方法后,会调用AsyncTask对应的各个回调函数:
1 2 3 | YourTask task = new YourTask(); // 向AsyncTask传递参数 task.execute(/* 任意数量、类型的参数*/); |
补充记录
1. 在程序的title bar 中显示进度条:
1 | requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); |
必须在setContentView之前调用。
2. 在UI线程中获取AsyncTask的状态:
task.getStatus() != AsyncTask.Status.FINISHED //如果没有完成
task.cancel(true); // 停止该任务
Using Animation in your application
PS:这个主题的日志标题居然不支持中文,懒得花时间去该,就用英文标题了
android大概有四种实现动画的方式:
1. GIF图片实现
2. Frame-by-frame (好像是通过AnimationDrawable类来实现,目前还没研究)
3. OpenGL ES (说到动画怎么能不提到OpenGL呢)
4. Tweened animation (通过xml文件配置动画效果,绑定到指定控件上,这篇日志所记录的方式)
添加动画资源
在res->anim目录下建立 anim.xml
这段xml代码定义了一个动画效果,alpha值从0到1,时间花费1000毫秒(即1秒)
将动画绑定到指定控件上
Animation fadeIn = AnimationUtils.loadAnimaition(R.anim.anim); // 比如有个TextView的控件,id为 title TextView title = (TextView)findViewById(R.id.title); // 指定控件的动画效果 title.setAnimation(fadeIn);
这样就简单得实现动画效果与控件的绑定。
取消动画效果与控件的绑定
title.clearAnimation();
指定动画效果的事件监听
动画的生命周期有三个: start, end, repeat
示例代码如下:
title.setAnimaitionListener(new AnimationListener(){ public void onAnimationEnd(Animation animation) { Intent intent = new Intent(mainActivity.this, ToActivity.class); startActivity(intent); mainActivity.this.finish(); } public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } });
利用LayoutAnimationController指定一组控件的动画效果
LayoutAnimationController controller = new LayoutAnimationController(fadeIn); // 假设有个TableRow控件的ID为 row TableRow row = (TableRow)findViewById(R.id.row); row.setLayoutAnimation(controller);
通过setLayoutAnimation方法,我们就可以给TableRow下的所有元素设定同一个动画效果。有一个需要注意的地方,TableRow下的元素的效果并不是同一时间开始运行的。比如本日志的这个例子,定义动画的xml文件中,alpha节点的android:duration属性,指定整个动画效果执行所需要的时间,在这里我们设定了1000,那么,TableRow下的元素将会一个一个运行,间隔时间为android:duration的1/2(无论TableRow下有多少个空间,都是1/2),在这里就是0.5秒。比如TableRow下有两个控件,那么当第一个控件动画效果执行到0.5秒时,第二个控件才开始执行。所以,当所有控件的效果都运行完了之后,总共花时1.5秒。
其它
xml文件中的alpha节点还有一个经常会用到的属性android:startOffset,这个属性设定动画开始的时间,例如将这个属性值设为2000,动画将会在2秒之后执行。
创建android应用程序的偏好设定
创建应用程序设定
一款应用程序通常都需要存储一些基本的状态信息和用户数据,我们可以使用Android的Shared Preferences来实现这个功能。
在一个应用程序的所有activity中,我们都可以通过一个名称来访问Shared Preferences。因为这些设定信息是整个程序公用的,所以我们可以创建一个activity的子类(在这里举例为AppActivity),让程序中所有其他的activity继承AppActivity,我们在AppActivity中声明一个成员变量,用于标记Shared Preferencess的名称,这样一来在所有的activity中我们都可以统一地访问我们的Shared Preferencess。
// 在AppActivity中声明一个成员变量 public static final String APP_PREFERENCES = “APP_PREF”;
创建Shared preferences是没有数量限制的,所以你可以使用不同命名对应不同的类别,例如你可以分为应用设定(APP_PREFERENCES)和用户设定(USER_PREFERENCES),怎么组织Shared Preferences取决于你自己。
添加Shared Preferences到应用程序中,需要以下几个步骤:
1. 使用getSharedPreferences()方法获取一个SharedPreferences的实例
2. 创建一个SharedPreferences.Editor对象
3. 使用editor对象修改设定
4. 使用editor的commit()方法提交修改
存储特定的设定
Shared Preferences中的每个设定都是以键值对的形式存储的,值可以是以下这些类型:
. Boolean
. Float
. Integer
. Long
. String
当你决定好了要存储那些设定信息之后,你需要取得一个SharedPreferences实例并且使用Editior对象更新设定并提交修改。下面的例子中,存储了两个设定(用户名和年龄):
SharedPreferences settings = getSharedPreferences(APP_PREFERENCES , MODE_PRIVATE); SharedPreferences.Editor prefEditor = settings.edit(); prefEditor.putString(“UserName”, “JaneDoe”); prefEditor.putInt(“UserAge”, 22); prefEditor.commit();
我们还可以通过editor的clear()方法把设定清空,或者使用remove()方法,根据名称删除指定的设定。
获取应用的设定
获取Shared Preference的设定值比创建还要简单,你不需要editor对象。下面的示例展示了怎么样获取Shared Preference的设定:
SharedPreferences settings = getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE); if (settings.contains(“UserName”) == true) { // 这样就可以获取key为 UserName的值了, getString()的第二个参数是当UserName没有值的时候作为默认值 String user = Settings.getString(“UserName”, “Default”); }
你可以使用SharedPreferences对象根据名称检测一个设定,获取一个强类型的设定或者 获取所有设定,通过使用map来存储他们。
Android开发中的单元测试
java开发好像大多都是以xml作为配置文件(php大多使用ini格式的文件),一开始真是有点不习惯,而且很多配置项给人糊里糊涂的感觉,目前只是处于复制粘贴,不知其所以然的水平。以下是在android开发中使用单元测试的配置项要点:
1.在AndroidManifest.xml中的application节点下添加如下节点:
<uses-library android:name="android.test.runner" />
2.在AndroidManifest.xml中的根节点(mainfest)下添加如下节点:
<instrucmentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.sharp.action" //这个属性必须与单元测试用例class所在的package一致
android:label="Test for My App"/>
杂碎记录
1.限制输出格式为数字(整数或浮点数)的属性
android:numeric="integer|decimal"
2.字符串转浮点型
String s = "1.2";
float f = float.parseFloat(s);
3.java中浮点型转字符串
String str = ""+f;
结束语
终于开始认真学android开发了,入门还是不难的,加油!


