安卓成长记(四)

安卓成长记(四)

那个…这个成长记就是我个人做的一个笔记,大家随便看看就行了

来讲讲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();
            }
        });
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值