关于Activity的少许细节

1.  对活动应用样式和主题

2.  隐藏活动标题

3. 显示对话框窗口

4. 显示进度对话框

1.  应用样式和主题

改成

android:theme="@android:style/Theme.Dialog"

效果如下:



2. 隐藏活动的标题

比方说手机QQ登陆的时候,就会有一个全屏的QQ画面;说着微博也是,有一个全屏广告

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏标题

        setContentView(R.layout.activity_main);
        Log.i(Tag, "onCreat()");
    }

标题没有了:(我应该在这里放一幅画)


3.显示对话框窗口

(主要思想:重写Activity类中的onCreateDialog()方法)

(这里还谈到了“回调方法”目前先放一放)

现在布局文件里面加入一个button,然后在activity中绑定事件,然后在onClick()中填入代码

<Button
      android:id="@+id/btn1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="显示对话框" />

MainActivity.java中的代码是:(事件监听我知道,回调不太清楚,但是showDialog()方法被调用的时候,onCreateDialog()方法被调用了)

public class MainActivity extends Activity implements OnClickListener
{

    private Button btn;
    CharSequence[] items = {"你","我","他"};
    boolean[] checkedItems = new boolean[items.length];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button) findViewById(R.id.btn1);
        btn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v)
    {
        showDialog(0);  //坑爹啊,这方法过时了?
    }

    @Override
    @Deprecated
    protected Dialog onCreateDialog(int id)
    {
        //下面填代码
        switch (id)
        {
            case 0:
                return new AlertDialog.Builder(this)
                                .setIcon(R.drawable.ic_launcher)
                                .setTitle("这是个简单的对话框..")
                                .setPositiveButton("OK",
                                        new DialogInterface.OnClickListener()
                                        {

                                            @Override
                                            public void onClick(DialogInterface dialog, int which)
                                            {
                                                Toast.makeText(getBaseContext(),
                                                        "OK被点击了", Toast.LENGTH_LONG).show();
                                                //Toast是一种提示框,Toast.LENGTH_LONG表示它显示时间长
                                            }
                                        })
                                .setNegativeButton("Cancel",new DialogInterface.OnClickListener()
                                {

                                    @Override
                                    public void onClick(DialogInterface dialog, int which)
                                    {
                                        Toast.makeText(getBaseContext(),
                                                "Cancel被点击了", Toast.LENGTH_LONG).show();
                                        //Toast是一种提示框,Toast.LENGTH_LONG表示它显示时间长
                                    }
                                })
                                .setMultiChoiceItems(items,
                                                    checkedItems,
                                                    new DialogInterface.OnMultiChoiceClickListener()
                                                    {

                                                        @Override
                                                        public void onClick(DialogInterface dialog,
                                                                int which,
                                                                boolean isChecked)
                                                        {
                                                            Toast.makeText(getBaseContext(),
                                                                    items[which]+(isChecked?"Checked!":"unCkecked!"),
                                                                    Toast.LENGTH_LONG).show();
                                                        }
                                                     })
                                .create();
            case 1: break;
        default:
                break;
        }
        return null;
    }
}

大概玩明白咋回事儿了。

showDialog()一旦被执行,它就去调用onCreateDialog()这个由Activity管理的方法。------回调

补充:

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

Make a standard toast that just contains a text view.

Parameters:

context The context to use. Usually your android.app.Application or android.app.Activity object.

text The text to show. Can be formatted text.

duration How long to display the message. Either LENGTH_SHORT or LENGTH_LONG

实际上,再看上面的代码,

setPositiveButton(String text,new DialogInterface.OnClickListener(){})  这方法设置了一个OK按钮

setNegativeButton(String text,new DialogInterface.OnClickListener(){})  这方法设置了一个Cancel按钮

setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems,new DialogInterface.OnMultiChoiceClickListener()) 设置了一个复选框列表

而且代码一开始的

new AlertDialog.Builder(this)

实际上返回 Builder对象,完全可以写成:

Builder builder = new AlertDialog.Builder(this);

然后就是跟上面代码差不多:

builder.setPositiveButton();

builder.setNegativeButton();

….

switch代码块里面返回 builder.create()就好了

程序中多次用到Context类以及其引用,实际上,Activity是Context的子类

如果在activity中引用context对象,那么可以在外部成员变量的地方声明一个 :

private Context context = this;

之后就不用总是getBaseContext(); 而直接用context就好了。

但是上面的Toast.makeText(getBaseContext(),”ok clicked”,Toast.LENGTH_LONG)由于toast在AlertDialog中使用,所以还是应该用getBaseContext()



4. 显示进度对话框

基本上就是尝试着用代码开一个线程去做后台的事儿---假装我们在做什么,前台呢?显示模态进度条对话框,由于是模态(操作系统术语)所以阻塞了用户界面。

public class MainActivity extends Activity implements OnClickListener
{

    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button) findViewById(R.id.btn1);
        btn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v)
    {
        final ProgressDialog dialog = ProgressDialog.show(this,"我们在处理中", "拼命加载中",true);

        new Thread(new Runnable()
        {

            @Override
            public void run()
            {
//                try
//                {
//                    Thread.sleep(5000); //假装我们在做什么
//                    //好,我们已经做完了,等够5秒了
//                    dialog.dismiss();
//                }
//                catch (Exception e)
//                {
//                    e.printStackTrace();
//                }
                SystemClock.sleep(5000);//假装我们在做什么,这样写不用try catch
                dialog.dismiss();
            }

        }).start();
    }
}

然后5秒,这进度条就不见了.

dialog.dismiss()了

既然要假装做点儿什么,来做点儿实际的:

修改MainActivity .java

public class MainActivity extends Activity implements OnClickListener
{

    private Button btn;
    private ProgressDialog progressDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button) findViewById(R.id.btn1);
        btn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v)
    {
        showDialog(0);
        progressDialog.setProgress(0);

        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                for (int i = 0; i < 15; i++)
                {
                    SystemClock.sleep(5000);
                    int temp = (int)(100/15);
                    progressDialog.incrementProgressBy(temp);//更新进度条
                }
                progressDialog.dismiss();

            }

        }).start();
    }

    @Override
    @Deprecated
    protected Dialog onCreateDialog(int id)
    {
        switch (id)
        {
            case 0:
                progressDialog = new ProgressDialog(this);
                //return
                progressDialog.setIcon(R.drawable.ic_launcher);

                progressDialog.setTitle((CharSequence)"正在拼命加载中...");
                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                progressDialog.setButton(DialogInterface.BUTTON_POSITIVE,"ok",
                        new DialogInterface.OnClickListener()
                        {
                            @Override
                            public void onClick(DialogInterface dialog, int which)
                            {
                                Toast.makeText(getBaseContext(), "ok clicked", Toast.LENGTH_LONG).show();
                            }
                        });
                progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE,"cancel",
                        new DialogInterface.OnClickListener()
                        {
                            @Override
                            public void onClick(DialogInterface dialog, int which)
                            {
                                Toast.makeText(getBaseContext(), "cancel clicked", Toast.LENGTH_LONG).show();
                            }
                        });
                return progressDialog;
        default:
            break;
        }
        return null;
    }
}

在activity中显示dialog,这里一样用的showDialog(),然后重写onCreateDialog() 方法

onCreateDialog()里面显示一个进度条对话框,然后新线程就负责动态更新它。

progressDialog.dismiss()方法关闭该对话框。

时间: 2024-12-06 06:17:21

关于Activity的少许细节的相关文章

Android之Activity跳转

简述 如果把每个activity看成一个页面的话,那么activity之间的跳转和页面的之间的跳转基本上是一样的.首先需要监听一个事件,当这个事件发生的时候,就进行跳转.html中有个<a src="..."></a>的链接标签,当我们点击这个链接的时候就会发送跳转.这是因为浏览器会自动监听这个链接是否被点击,如果被点击那个浏览器自己执行跳转动作.但是在Android中就没这么简单,程序员需要自己去监听某个事件,当这个事件发生的时候,需要自己指定目的Activi

Android应用Preference相关及源码浅析(Preference组件家族篇)

1 前言 前一篇(点我阅读前一篇<Android应用Preference相关及源码浅析(SharePreferences篇)>)我们讨论分析使用了Android的SharePreferences,相信看过的朋友都有了自己的感悟与理解,这一篇我们继续乘热打铁来说说SharePreferences的衍生品--Preference组件. 其实Preference组件大家一定不陌生,因为Android系统的Setting应用及我们市面上一些符合Android设计思想的应用的设置界面一般都会用它来实现,

android Application类的详细介绍

在代码中经常看到application这个类,一直不知道这个是干什么用的,今天刚好有点时间,所以进行了详细的学习. 一.先对它的整体概念解释: 在android源码中对他的描述是; * Base class for those who need to maintain global application state. You can        * provide your own implementation by specifying its name in your        *

Android Application对象必须掌握的七点

1:Application是什么?  Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息.通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个na

深入理解Intent和IntentFiler(一)

http://blog.csdn.net/u012637501/article/details/41080891 为了比较深刻的理解并灵活使用Intent,我计划将这部分的学习分为两步:一是深入理解Intent基本概念以及其类:二是,通过实例来阐述如何灵活使用Intent来启动一个组件以及实现组件之间的传递数据. 一.什么是Intent,有什么作用? Android的应用程序包括四大组件:Activity.contentProvider.Service.BroadcastReceiver,为了方

20151008_Android Application类

1. Application类 Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息. 通常我们是不需要指定一个Application的,这时系统会自动帮我们创建:如果需要创建自己的Application,需要:创建一个类继承 Application并在manifest的application标签中进行注册. 2. Application类的特性 <1>.单

ANDROID application详解与用法

1:Application是什么? Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息.通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个nam

android application生命周期介绍

看到application这个类,一直不知道这个是干什么用的,今天刚好有点时间,所以进行了详细的学习. 一.先对它的整体概念解释: 在android源码中对他的描述是; * Base class for those who need to maintain global application state. You can * provide your own implementation by specifying its name in your * AndroidManifest.xml'

android onTerminate()方法调用需要注意的点

1:Application是什么? Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息.通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个nam