Toast的使用详解

Android中提供一种简单的Toast消息提示框机制,可以在用户点击了某些按钮后,提示用户一些信息,提示的信息不能被用户点击,Toast的提示信息根据用户设置的显示时间后自动消失。Toast的提示信息可以在调试程序的时候方便的显示某些想显示的东西,或者给用户提供友好的界面显示效果。

有两种方式去创建并且显示Toast:

  1. Toast.makeText(Context context, int resId, int duration)

    Toast.makeText(Context context, CharSequence text, int duration)

    Context为上下文,通常为当前activity;resId是string字符串的id,CharSequence为你要显示的字符串,duration为显示的时间,可以选择Toast.LENGTH_SHORT或Toast.LENGTH_LONG,也可自定义时间。
    使用方法:

    Toast.makeText(this, "this is string", Toast.LENGTH_SHORT).show();

  2. 自己创建Toast,并且设置视图,即自定义

    如:

Toast toast = new Toast(this);      
// 定义一个ImageView        
ImageView imageView = new ImageView(this);      
imageView.setImageResource(R.drawable.ic_launcher);     
// 定义一个Layout,这里是Layout     
LinearLayout Layout = new LinearLayout(this);       
Layout.setOrientation(LinearLayout.HORIZONTAL);     
// 将ImageView放到Layout中      
Layout.addView(imageView);      
// 设置View       
toast.setView(Layout);      
//设置显示时间        
toast.setDuration(20);      
toast.show();       

通过上面的代码就可以自己定义一个Toast了,我们还在其中显示了图片。

如何设置Toast显示的位置

方法一:

setGravity(int gravity, int xOffset, int yOffset) 三个参数分别表示(起点位置,水平向右位移,垂直向下位移)

方法二:

setMargin(float horizontalMargin, float verticalMargin)
以横向和纵向的百分比设置显示位置,参数均为float类型(水平位移正右负左,竖直位移正上负下)

注意事项:

Toast中有一个public方法setText(),可以给toast设置resid或者string,该方式尽可以在我们的第一种方法中使用,第二种自定义toast的方式是不可以使用的,使用的话会抛出异常。

原因是使用第一种方式创建,Toast会自己创建一个view,即textview,而我们使用这个setText实际是向这个TextView设置内容,而自定义的View不会有这个控件,因此会报错。

android异步操作总结

Android中经常会有一些操作比如网络请求,文件读写,数据库操作,比较耗时,我们需要将其放在非UI线程去处理,此时,我们需要处理任务前后UI的变化和交互。我们需要通过类似js中异步请求处理,这里总结我所了解到的,方便自己记忆,也方便别人的浏览。

  1. AsyncTask

new AysncTask().execute();

AsyncTask会按照流程执行在UI线程和一个耗时的任务线程。

1.onPreExecute() 执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。

2.doInBackground(Params…) 后台进程执行的具体计算在这里实现,doInBackground(Params…)是AsyncTask的关键,此方法必须重载。在这个方法内可以使用publishProgress(Progress…)改变当前的进度值。

3.onProgressUpdate(Progress…) 运行于UI线程。如果在doInBackground(Params…) 中使用了publishProgress(Progress…),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。

4.onPostExecute(Result) 运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params…)的返回值。此方法也要经常重载,如果Result为null表明后台任务没有完成(被取消或者出现异常)。

  1. Handler
    创建Handler时需要传Lopper,默认是UI线程的。
    通过Handler发送消息(Message)到主线程或者Handler的线程,

  2. Activity.runOnUiThread(Runnable)
    Runnable即可在UI线程执行

  3. View.post(Runnable)
    Runnable运行在UI线程
    View.post(Runnable)方法。在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。

所有的异步操作原理本质都是通过Handler

基本上就这几种方法,当然也可自己使用消息循环常见类似的任务处理机制。

Android图像开源视图:SmartImageView

项目需要,开发中需要加载图片,自己要写图片从网上下载的方法,还要写缓存,等等。

在网上找到一个开源项目,smartImageVIew,支持从URL和通讯录中获取图像,可以替代Android标准的ImageView。

特征:

根据URL地址装载图像;
支持装载通讯录中的图像;
支持异步装载;
支持缓存;

这个是作者的项目主页,有使用方法。

http://loopj.com/android-smart-image-view/

下载作者的jar包导入项目后,在xml中加入控件

<com.loopj.android.image.SmartImageView android:id="@+id/my_image" />    

代码里找到该控件

SmartImageView myImage = (SmartImageView) this.findViewById(R.id.my_image); 

使用控件

通过url加载图片

myImage.setImageUrl("http://www.awesomeimages.com/myawesomeimage.jpg");   

加载通讯录的图片

myImage.setImageContact(contactAddressBookId);  

github上面有源码,需要的可以看看:

https://github.com/loopj/android-smart-image-view    

intent和intent过滤以及匹配规则

在Android系统中打开Activity,Service, BroadCast 都需要使用到Intent(意图),那么作为一个开发者就需要知道怎么使用Intent,知道怎么通过Intent的匹配规则打开其他的组件,或者给其他组件提供访问接口。因此在这里总结一下Intent和Intent的匹配规则。

Intent使用示例

显式使用Intent

Intent intent = new Intent(context, XXXActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "string text");

隐式使用

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parser("http://blog.isming.me"));

AndroidManifest定义IntentFilter规则
xml
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

以上是简单的Intent示例,下面看Intent里面有那些东西,以及Intent的解析规则.

Intent的成员

action 动作,比如上面的隐式Intent,就是传递了一个View的动作.

data 数据,通过Intent发送的数据, 上面的隐式意图就是通过Uri解析出来数据

category 标签

type 类型 上面的隐式意图就是通过Uri来解析出来类型,即MIME type.

component 组件,即要打开的组件的信息,包名+类名.上面的显式意图就是设置要打开的组件。其他隐式意图也是通过各种参数来最终获取组件。

extras 附加数据,在Intent中附加传递的数据.

IntentFilter

IntentFilter,刚刚的一个xml配置的intentFilter,同时也可以在代码中配置。通过IntentFilter可以过滤掉不需要的一些隐式意图,必须有action 和category,还可以附加data规则,包含(data type 和data scheme+authority+path),通常一个Url包含://:/,可以通过设置data规则只有在指定的格式才能打开页面。

比如:

<intent-filter>
    <data android:mimeType="image/*" />
    ...
</intent-filter>

上面这个就只有数据是图片的时候才可以打开。

<intent-filter>
    <data android:scheme="http" />
    ...
</intent-filter>

上面这个规则则只允许数据是http的网址可以。

参考资料:

http://developer.android.com/guide/components/intents-filters.html

http://developer.android.com/reference/android/content/IntentFilter.html