• (原创)《Android编程权威指南》学习笔记01-- Android应用初体验--006


    组件的实际应用

      既然按钮有了资源ID,就可以在QuizActivity中直接获取它们。首先,在QuizActivity.java文件中增加两个成员变量,如下所示:

    public class QuizActivity extends Activity {
        
        private Button mTrueButton;
        private Button mFalseButton;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_quiz);
        }
    ...
    }

            代码清单1-8:添加成员变量(QuizActivity.java)

      文件保存后,可看到两个错误提示。请注意新增的两个成员(实例)变量名称的m前缀。该前缀是Android编程所遵循的命名约定,本书将始终遵循该约定。

      现在,请将鼠标移至代码左边的错误提示处,可看到两条同样的错误:Button cannot be resolved to a type。

      该错误提示告诉我们需要在QuizActivity.java文件中导入android.widget.Button类包。可在文件头部手动输入以下代码:

    import android.widget.Button

      或者采用虾米那介绍的便捷方式自动导入。

    类包组织导入

      用类包组织导入,就是让Eclipse依据代码来决定应该导入哪些Java或Android SDK类包。如果之前导入的类包不再需要了,Eclipse也会自动删除它们。

      通过以下组合键命令,进行类包组织导入:

         Command+Shift+O(Mac系统);

             Ctrl+Shift+O(Windows和Linux系统)。

      类包导入完成后,刚才的错误提示应该就会消失了。(如果错误提示仍然存在,请检查Java代码以及XML文件,确认是否存在输入或拼写错误。)

         接下来,我们来编码使用按钮组件,这需要以下两个步骤:

        引用生成的视图对象;

        为对象设置监听器,以响应用户操作。

    应用组件

      在activity中,可通过以下Activity方法引用已生成的组件:

    public View findViewById( int id )

      该方法接受组件的资源ID作为参数,返回一个视图对象。

      在QuizActivity.java文件中,使用按钮的资源ID获取生成的对象后,赋值给对应的成员变量,如代码清单1-9所示。注意,赋值前,必须先将返回的View转型(cast)为Button。

    public class QuizActivity extends Activity {
        
        private Button mTrueButton;
        private Button mFalseButton;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_quiz);
            
            mTrueButton = (Button)findViewById( R.id.true_button );
            mFalseButton = (Button)findViewById( R.id.false_button );
        }

                代码清单1-9:引用组件(QuizActivity.java)

    设置监听器

      Android应用属于典型的事件驱动类型。不同于命令行或脚本程序,事件驱动型应用启动后,即开始等待行为事件的发生,如用户单击某个按钮。(事件也可以由操作系统或其他应用触发,但用户触发的事件更显而易见。) 

      应用等待某个特定事件的发生,也可以说该应用正在“监听”特定事件。为响应某个事件而创建的对象叫做监听器(listener)。监听器是实现特定监听器接口的对象,用来监听某类事件的发生。

      Android SDK已经为各种事件内置开发了很多监听器接口。当前应用需要监听用户的按钮“单击”事件,因此监听器需实现View.OnClickListener接口。

      首先处理True按钮,如下代码所示:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_quiz);
            
            mTrueButton = (Button)findViewById( R.id.true_button );
            mTrueButton.setOnClickListener( new View.OnClickListener() {
                @Override
                public void onClick( View v ) {
                    // Does nothing yet, but soon!
                }
            } );
            
            mFalseButton = (Button)findViewById( R.id.false_button );
        }

                代码清单1-10:为True按钮设置监听器(QuizActivity.java)

      (如果遇到View cannot be resolved to a type的错误提示,请使用Mac的Command+Shift+O或Windows的Ctrl+Shift+O快捷键导入View类。)

      在代码清单1-10中,我们设置了一个监听器。当按钮mTrueButton被点击后,监听器会立即通知我们。setOnClickListener(OnClickListener)方法以监听器作为参数被调用。在特殊情况下,该方法以一个实现了OnClickListener接口的对象作为参数被调用


      使用匿名内部类

      SetOnClickListener(OnClickListener)方法传入的监听器参数是一个匿名内部类 (anon-ymous inner class)实现,语法看上去稍显复杂,不过,只需记住最外层括号内的全部实现代码是作为整体参数传入SetOnClickListener(OnClickListener)方法内的即

    可。该传入的参数就是新建的一个匿名内部类的实现代码。

    mTrueButton.setOnClickListener( new View.OnClickListener() {
                @Override
                public void onClick( View v ) {
                    // Does nothing yet, but soon!
                }
            } );

      监听器作为匿名内部类来实现。这样做的好处有二。其一,在大量代码块中,监听器方法的实现一目了然;其二,匿名内部类的使用只出现在一个地方,因此可以减少一些命名类的使用

      匿名内部类实现了OnClickListener接口,因此它也必须实现该接口唯一的onClick(View)方法。onClick(View)方法的代码暂时是一个空结构。实现监听器接口需要实现onClick(View)方法,但具体如何实现由使用者决定,因此即使是空的实现方法,编译器也可以

    编译通过。

      我们为False按钮设置类似的时间监听器。

        mFalseButton = (Button)findViewById( R.id.false_button );
        mFalseButton.setOnClickListener( new View.OnClickListener() {
              @Override
               public void onClick( View v ) {
                   // Does nothing yet, but soon!
               }
        } );

                代码清单1-11:为False按钮设置监听器(QuizActivity.java)

      创建提示消息

      接下来要实现的就是,分别单击两个按钮,弹出我们称为toast的提示消息。Android的toast指用来通知用户的简短弹出消息,但无需用户输入或做出任何操作。这里,我们要做的就是使用toast来告知用户其答案正确与否。

      首先回到strings.xml文件,如代码清单1-12所示,为toast添加消息显示用的字符串资源。

    <?xml version = "1.0" encoding = "utf-8" ?>
    <resources>
        <string name = "app_name" > GeoQuiz </string>
        <string name = "question_text" > Constantinople is the largest city in Turkey. </string>
        <string name = "true_button" > True </string>
        <string name = "false_button" > False </string>
        <string name = "correct_toast" > Correct! </string>
        <string name = "incorrect_toast" > Incorrect! </string>
        <string name = "action_settings" > Settings </string>  <!-- 每个人版本不一样,星月这里跟书上不同。书上是:name = "menu_settings" -->
    </resources>

                代码清单1-12:增加toast字符串(strings.xml)

      通过调用来自Toast类的以下方法,可创建一个toast:

    public static Toast makeText( Context context, int resId, int duration )

      该方法的Context参数通常是Activity的一个实例(Activity本身就是Context的子类) 。第二个参数是toast待显示字符串消息的资源ID。Toast类必须利用context才能找到并使用字符串的资源ID。第三个参数通常是两个Toast常量中的一个,用来指定toast消息

    显示的持续时间。

      创建Toast后,可通过调用Toast.show()方法使toast消息显示在屏幕上。

      在QuizActivity代码里, 分别对两个按钮的监听器调用makeText(...)方法, 如代码清单1-13所示。在添加makeText(...)时,可利用Eclipse的代码自动补全功能,让代码输入工作更加轻松

     mTrueButton.setOnClickListener( new View.OnClickListener() {
           @Override
           public void onClick( View v ) {
               Toast.makeText( QuizActivity.this
                , R.string.incorrect_toast
                , Toast.LENGTH_SHORT ).show();
           }
    } );
            
    mFalseButton.setOnClickListener( new View.OnClickListener() {
           @Override
           public void onClick( View v ) {
               Toast.makeText( QuizActivity.this
                , R.string.correct_toast
                , Toast.LENGTH_SHORT ).show();
           }
    } );

                代码清单1-13:创建提示消息(QuizActivity.java)

      使用代码自动补全

      代码自动补全功能可以节约大量开发时间,越早掌握受益越多。 参照代码清单1-13,依次输入代码。当输入到Toast类后的点号时,Eclipse会弹出一个窗口,窗口内显示了建议使用的Toast类的常量与方法。

      为便于选择所需的建议方法,可按Tab键移焦至自动补全弹出窗口上。(如果想忽略Eclipse的代码自动补全功能,请不要按Tab键或使用鼠标点击弹出窗口,只管继续输入代码直至完成。) 

      在列表建议清单里,选择makeText(Context, int, int)方法,代码自动补全功能会自动添加完成方法调用,包括参数的占位符值。

      第一个占位符号默认加亮,直接输入实际参数值QuizActivity.this。然后按Tab键转至下一个占位符,输入实际参数值,依次类推,直至参照代码清单1-13完成全部参数的输入。

      

      在makeText(...)里,传入QuizActivity实例作为Context的参数值。注意此处应输入的参数是QuizActivit.this,不要想当然地直接输入this作为参数因为匿名类的使用,这里的this指的是监听器View.OnClickListener。    

  • 相关阅读:
    java Concurrent包学习笔记(二):CountDownLatch和CyclicBarrier
    java Concurrent包学习笔记(四):BlockingQueue
    Linux Linux程序练习十五(进程间的通信共享内存版)
    Linux shell中的符号
    Linux shell程序一
    Linux Linux程序练习十四(多进程压力测试)
    Linux Linux程序练习十三(信号阻塞,捕获)
    Linux 网络编程详解二(socket创建流程、多进程版)
    Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)
    Linux shell实战(ipcs工具)
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/4605615.html
Copyright © 2020-2023  润新知