安卓成长记(四)
那个…这个成长记就是我个人做的一个笔记,大家随便看看就行了
来讲讲toast
首先这个组件不会获得焦点,就是一个起提示作用的东西。而且是那种小的提示,因为会自动消失。
如果要复杂一点,加个图片什么的,要用到对话框。那这就简单了么。
但是Toast也是可以加图片的提示框的。但是问题是这种提示框最后还是会消失。
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button simple = (Button) findViewById(R.id.simple);
// 为按钮的单击事件绑定事件监听器
simple.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// 创建一个Toast提示信息
Toast toast = Toast.makeText(MainActivity.this
, "简单的提示信息"
// 设置该Toast提示信息的持续时间
, Toast.LENGTH_SHORT);
toast.show();
}
});
Button bn = (Button) findViewById(R.id.bn);
// 为按钮的单击事件绑定事件监听器
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// 创建一个Toast提示信息
//Toast的一个构造函数,应该是选择Toast的界面。
Toast toast = new Toast(MainActivity.this);
// 设置Toast的显示位置
toast.setGravity(Gravity.CENTER, 0, 0);
// 创建一个ImageView
ImageView image = new ImageView(MainActivity.this);
image.setImageResource(R.drawable.tools);
// 创建一个LinearLayout容器
LinearLayout ll = new LinearLayout(MainActivity.this);
// 向LinearLayout中添加图片、原有的View
ll.addView(image);
// 创建一个TextView
TextView textView = new TextView(MainActivity.this);
textView.setText("带图片的提示信息");
// 设置文本框内字号的大小和字体颜色
textView.setTextSize(24);
textView.setTextColor(Color.MAGENTA);
ll.addView(textView);
// 设置Toast显示自定义View
//注意这里和之前一样,也是一个layout就完事儿了的。
//这个layout里面包含了一点儿东西。
toast.setView(ll);
// 设置Toast的显示时间
toast.setDuration(Toast.LENGTH_LONG);
toast.show();
}
});
}
toast.setView(ll);
上面这个方法比较重要。
notification
这个的用法不难,麻烦一点儿
public class MainActivity extends Activity
{
static final int NOTIFICATION_ID = 0x123;
//这大概是接触的第一个管理器了,就是manager
//第一步,首先获取系统的NotificationManager
NotificationManager nm;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取系统的NotificationManager服务
//getSystemService()这个方法记住
nm = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
}
// 为发送通知的按钮的点击事件定义事件处理方法
public void send(View source)
{
// 创建一个启动其他Activity的Intent
Intent intent = new Intent(MainActivity.this
, OtherActivity.class);
//其实我也不太懂这个pendingIntent这个东西是什么意思,是要有这一层包装的
//不然那activity就直接启动了啊
//参数第二个是requsestCode,第四个是flag
PendingIntent pi = PendingIntent.getActivity(
MainActivity.this, 0, intent, 0);
//第二步,新建一个Notification对象。
//第三步,为其添加各种属性
//这获取Notification是直接用的Builder啊,居然没有用到manager什么事儿
Notification notify = new Notification.Builder(this)
// 设置打开该通知,该通知自动消失
.setAutoCancel(true)
// 设置显示在状态栏的通知提示信息
.setTicker("有新消息")
// 设置通知的图标
.setSmallIcon(R.drawable.notify)
// 设置通知内容的标题
.setContentTitle("一条新通知")
// 设置通知内容
.setContentText("恭喜你,您加薪了,工资增加20%!")
// 设置使用系统默认的声音、默认LED灯
// .setDefaults(Notification.DEFAULT_SOUND
// |Notification.DEFAULT_LIGHTS)
// 设置通知的自定义声音
.setSound(Uri.parse("android.resource://org.crazyit.ui/"
+ R.raw.msg))
.setWhen(System.currentTimeMillis())
// 设改通知将要启动程序的Intent
//那个PI这里派上用场了
.setContentIntent(pi) // ①
.build();
// 发送通知,尼玛一个管理器就这个用啊……
nm.notify(NOTIFICATION_ID, notify);
}
// 为删除通知的按钮的点击事件定义事件处理方法
public void del(View v)
{
// 取消通知
nm.cancel(NOTIFICATION_ID);
}
}
注意添加这两个权限的:
< uses-permission android:name=”android.permission.VIBRATE”/>
< uses-permission android:name=”android.permission.FLASHLIGHT”/>
一个是闪光灯的权限,一个是震动的权限。
这个怎么用呢?一般是放在service里面的,当来了通知,去boardcast一下?
还有这个intent里面是启动了一个OtherActivity,但是如果是正常的应用的时候启动一个应用程序呢?
对话框家族
一共六部:
首先创建AlertDialog.Builder对象。为什么不是AlertDialog对象呢?
我觉得是创建了一个模子一样的东西吧。管他呢。
第二部:利用AlertDialog.Builder的方法设置标题,图标等
第三部:设置AlertDialog的内容。
第四步,因为对话框一般有确定和取消按钮,所以添加setPositiveButton设置确定按钮,
调用setNegavitiveButton()按钮。
最后一步才是真真儿的将这个AlertDialog创建出来了,
调用AlertDialog.Builder的create()方法创建AlertDialog对象并调用show()方法显示
这里注意这样一个方法:setView()
这个方法一般的用途是将自定义的View对象显示出来
public void simple(View source)
{
//这里是第一步,获取Builder
//我的理解是先做好一个模子
AlertDialog.Builder builder = new AlertDialog.Builder(this)
// 设置对话框标题
.setTitle("简单对话框")
// 设置图标
.setIcon(R.drawable.tools)
.setMessage("对话框的测试内容\n第二行内容");
// 为AlertDialog.Builder添加“确定”按钮
setPositiveButton(builder);
// 为AlertDialog.Builder添加“取消”按钮
setNegativeButton(builder)
.create()
.show();
//这里都是一气呵成了。
//构造出来一个Builder之后
//创建题目,内容
//之后顺手create出来一个Dialog对象,
//并且最后调用了show()将Dialog显示出来。
}
下面这个也是一样的:
public void simpleList(View source)
{
//这里的是新建一个AlertDialog.Builder。
//都是新建一个builder的,而不是直接去弄一个实体。
AlertDialog.Builder builder = new AlertDialog.Builder(this)
// 设置对话框标题
.setTitle("简单列表对话框")
// 设置图标
.setIcon(R.drawable.tools)
// 设置简单的列表项内容
.setItems(items, new OnClickListener()
{
//setItem是……我不知道这是在干嘛,只弄了一个监听器?
//但是这个方法的功能应该是很强大的,不止这些
//在item里面设置监听器算啥啊……
//而且这个居然可以修改组件。为什么呢?
//你可以理解为,只有UI可以修改UI组件。
//这里新建出来不是线程而是一个组件,于是是可以的,
//只有UI组件可以修改UI组件。
@Override
public void onClick(DialogInterface dialog, int which)
{
show.setText("你选中了《" + items[which] + "》");
}
});
// 为AlertDialog.Builder添加“确定”按钮
setPositiveButton(builder);
// 为AlertDialog.Builder添加“取消”按钮
setNegativeButton(builder)
.create()
.show();
}
下面这个:
public void singleChoice(View source)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this)
// 设置对话框标题
.setTitle("单选列表项对话框")
// 设置图标
.setIcon(R.drawable.tools)
// 设置单选列表项,默认选中第二项(索引为1)
//我其实就可不理解了,这算啥啊,只在这里不一样?singleChoiceItems。
//setitem这一类的方法都理解为是给列表项设置样式吧。
.setSingleChoiceItems(items, 1, new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
show.setText("你选中了《" + items[which] + "》");
}
});
// 为AlertDialog.Builder添加“确定”按钮
setPositiveButton(builder);
// 为AlertDialog.Builder添加“取消”按钮
setNegativeButton(builder)
.create()
.show();
}
public void multiChoice(View source)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this)
// 设置对话框标题
.setTitle("多选列表项对话框")
// 设置图标
.setIcon(R.drawable.tools)
// 设置多选列表项,设置勾选第2项、第4项
//还真是的,都是列表项的样式
.setMultiChoiceItems(items
, new boolean[]{false , true ,false ,true}, null);
// 为AlertDialog.Builder添加“确定”按钮
setPositiveButton(builder);
// 为AlertDialog.Builder添加“取消”按钮
setNegativeButton(builder)
.create()
.show();
}
public void customList(View source)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this)
// 设置对话框标题
.setTitle("自定义列表项对话框")
// 设置图标
.setIcon(R.drawable.tools)
// 设置自定义列表项
//原来不是setItem完成这件事啊
//需要Adapter的是setAdapter()方法。
//里面就是一个Adapter参数啊。
.setAdapter(new ArrayAdapter<String>(this
, R.layout.array_item
, items), null);
// 为AlertDialog.Builder添加“确定”按钮
//都是给Builder去设置的。
setPositiveButton(builder);
// 为AlertDialog.Builder添加“取消”按钮
setNegativeButton(builder)
.create()
.show();
}
public void customView(View source)
{
// 装载app\src\main\res\layout\login.xml界面布局文件
//这里其实是饶了一个圈子。
//这里同样使用打气筒将一个xml文件弄成一个View对象了。
//这里不过是弄成了利用getLayoutInflater()填充成了一个layout的对象
//加了料的layout的是一个可以直接显示的View对象。
TableLayout loginForm = (TableLayout)getLayoutInflater()
.inflate( R.layout.login, null);
new AlertDialog.Builder(this)
// 设置对话框的图标
.setIcon(R.drawable.tools)
// 设置对话框的标题
.setTitle("自定义View对话框")
// 设置对话框显示的View对象
//这里就用的是setView()方法了。
//如果用的是一个adapter就是setAdapter了。
//setAdapter是newADAPTER 对象的。
.setView(loginForm)
// 为对话框设置一个“确定”按钮
//给按钮添加时间监听器
.setPositiveButton("登录", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// 此处可执行登录处理
}
})
// 为对话框设置一个“取消”按钮
.setNegativeButton("取消", new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog,
int which)
{
// 取消登录,不做任何事情
}
})
// 创建并显示对话框
.create()
.show();
}
datePickerDialog和TimePickerDialog
这两个选取东西的对话框正是比较有用的。
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button dateBn = (Button)findViewById(R.id.dateBn);
Button timeBn = (Button)findViewById(R.id.timeBn);
//为“设置日期”按钮绑定监听器
dateBn.setOnClickListener(new OnClickListener()
{
//注意是在点击事件里面弄得新的对话框。
@Override
public void onClick(View source)
{
//下面,你要获取当前的时间都是要先获取这个Calendar对象的。
Calendar c = Calendar.getInstance();
// 直接创建一个DatePickerDialog对话框实例,并将它显示出来
//下面新建了一个对象,并调用了show()方法。
//是不是自己有show()方法的组件自己调用一下show()方法就能显示出来?
//android.app.DatePickerDialog.DatePickerDialog
//(Context context, OnDateSetListener callBack,
//int year, int monthOfYear, int dayOfMonth)
//上面是函数的原型,里面的第二个参数是DateSetListener。
//就是用户选定了日期的时候(set的时候)激发的一个东西。
//里面看的也听清楚,就是一个onDateSet()的方法。
new DatePickerDialog(MainActivity.this,
// 绑定监听器
new DatePickerDialog.OnDateSetListener()
{
@Override
public void onDateSet(DatePicker dp, int year,
int month, int dayOfMonth)
{
EditText show = (EditText) findViewById(R.id.show);
show.setText("您选择了:" + year + "年" + (month + 1)
+ "月" + dayOfMonth + "日");
}
}
//设置初始日期
//这就是系统当前的日期,获取Calendar的作用就是这样了。
, c.get(Calendar.YEAR)
, c.get(Calendar.MONTH)
, c.get(Calendar.DAY_OF_MONTH)).show();
}
});
//为“设置时间”按钮绑定监听器
timeBn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
Calendar c = Calendar.getInstance();
// 创建一个TimePickerDialog实例,并把它显示出来
//new TimePickerDialog.OnTimeSetListener()
//你不要被这个迷惑,直接的new OnTimeSetListener()就完了
//很正常的就是叫你设定一个日期选定监听器么
new TimePickerDialog(MainActivity.this,
// 绑定监听器
new TimePickerDialog.OnTimeSetListener()
{
@Override
public void onTimeSet(TimePicker tp, int hourOfDay,
int minute)
{
//同样的道理,这里也不是新的线程
//UI修改UI应该是个安全的。
EditText show = (EditText) findViewById(R.id.show);
show.setText("您选择了:" + hourOfDay + "时"
+ minute + "分");
}
}
//设置初始时间
//这里Calendar.HOUR_OF_DAY里面是个常量。今天的日期常数
, c.get(Calendar.HOUR_OF_DAY)
, c.get(Calendar.MINUTE)
//true表示采用24小时制
, true).show();
}
});
}