开发者社区> 华章计算机> 正文

《Android和PHP开发最佳实践》一2.7 Android应用界面

简介: 本节书摘来自华章出版社《Android和PHP开发最佳实践》一书中的第2章,第2.7节,作者 黄隽实,更多章节内容可以访问云栖社区“华章计算机”公众号查看
+关注继续查看

2.7 Android应用界面

Android应用界面系统,即Android UI(User Interface)系统是Android应用框架最核心的内容之一,也是开发者们需要重点掌握的内容。如果我们把Android应用也分为前后端两部分的话,那么之前介绍的核心要点和四大组件等都属于后端,而Android UI系统则属于前端。后端保证应用的稳定运行,而前端则决定应用的外观和体验。对于一个优秀的Android应用来说,漂亮的外观和流畅的体验是必不可少的。接下来,我们便来学习Android外观系统的知识。
在2.3.3节中我们已经简单介绍了Android应用框架中的外观系统(View System),也就是Android UI系统的基础知识。我们知道了对于Android应用来说,最重要的两个基础类就是View和ViewGroup:View是绝大部分UI组件的基础类,而ViewGroup则是所有Layout布局组件的基类。当然,ViewGroup也是View的子类。相关类库的树形结构如下。

java.lang.Object
|- android.view.View
   |- android.view.ViewGroup
      |- android.widget.FrameLayout
      |- android.widget.LinearLayout
         |- android.widget.TableLayout
      |- android.widget.RelativeLayout
      |- android.widget.AbsoluteLayout

本节将重点介绍Android应用(非游戏)使用的UI系统。一般来说,我们都使用XML格式的模板文件来书写对应的UI界面,当然,这种做法也比较符合MVC的设计思想。另外,由于UI模板独立于逻辑之外,界面设计师们就可以更加专注于他们自己的事情。在模板文件中,每个UI控件都由对应的XML标签来表示,具体的控件标签见表2-3,大家可以回顾一下。

2.7.1 控件属性

我们知道Android UI系统给我们提供了丰富多彩的控件,比如TextView、Button、TextView、EditText、ListView、CheckBox、RadioButton等,具体如表2-3所示。我们可以使用这些不同功能的控件来完成各种各样用户界面的需求。那么控件本身的属性应该如何设置呢?实际上,每个UI控件都有很多的属性可供我们选择,我们一般都是通过设置这些属性来设置UI控件的外观、位置等。代码清单2-17中就是使用XML来表示文本框控件(TextView)的示例,实际的显示效果是在整个UI界面的左上方打印一段文字“I am a TextView”。
代码清单 2-17

<TextView android:id="@+id/text"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="I am a TextView" />

Android UI控件使用android:layout_width和android:layout_height属性控制其宽度和高度,属性值为wrap_content表示元素的外观由内容大小决定,而fill_parent则表示元素大小由外层的元素决定。我们经常使用fill_parent来实现自适应的界面布局,因为最外层的元素必然就是手机屏幕。此外我们需要注意的是,这两个属性是每个UI控件必须指定的。
另外,Android UI控件的外观采用类似于CSS标准的“盒子模型”,也有margin和padding的概念,元素内边距使用android:padding来表示,外边距则采用android:layout_margin来控制。这两个属性也是我们最常使用的“利器”之一,用其可使整个界面各个控件之间的间隔更为合理、美观。Android UI控件“盒子模型”如图2-7所示,大家可以结合示意图理解一下。
image

最后,我们来学习一些基础的Android UI控件属性,这些属性在UI组件基础类View类中定义,具备很强的通用性,可被绝大部分的UI控件所使用,因此也被称作“通用属性”。对于我们来说,只有掌握了这些通用属性的用法,才能够更好地控制UI组件并运用它们组装出各种各样的UI界面。
android:id:每个UI控件的代表性id。我们经常在程序中使用findViewById方法来选取对应id的控件,然后再对该控件进行属性控制或者事件处理,用法和HTML元素标签属性中的id类似。
android:background:控件背景,可以是颜色值,也可以是图像或者Drawable资源等,如果值为@null,则表示透明背景。
android:layout_width:UI控件的宽度,常见属性有fill_parent、wrap_parent等。前面我们已经简单介绍过这个属性的用法,它是每个控件必须具备的属性之一。
android:layout_height:UI控件的高度,常见属性和用法和宽度一样,也是每个控件必须具备的属性之一。
android:layout_gravity:用于控制UI控件相对于其外层控件的位置,其属性值就代表其位置,如顶部(top)、底部(bottom)、左边(left)、右侧(right)、垂直居中(center_vertical)、水平居中(center_horizontal)、绝对居中(center)、垂直填满(fill_vertical)、水平填满(fill_horizontal)、完全填满(fill)等。另外,这些属性可以并列存在,我们常使用“|”符号隔开,如“center_vertical|center_horizontal”表示垂直水平居中。
android:layout_margin:UI控件的外边距,使用方式见图2-7 所示的“盒子模型”。
android:padding:UI控件的内边距,使用方式见图2-7 所示的“盒子模型”。
android:gravity:控件内部的元素相对于控件本身的位置,其属性值和使用方法与android:layout_gravity基本一致。
android:visibility:显示或隐藏控件,控件默认是显示状态的。
通用属性常用于操控UI控件的外观和位置,通常能对UI界面的构建起到很大的作用。当然,除了通用属性之外,不同的UI控件还会有各自专属的“控件属性”,这些属性我们将在后面讲到各种UI控件的概念和用法时详细介绍,具体内容可参考第7章中与界面控件相关的章节内容。

2.7.2 布局(Layout)

Android UI系统中的布局文件其实和HTML有点类似,都是用XML标签所代表的各种UI控件组合或者嵌套而成的,只不过,Android模板文件的格式比HTML更严谨些,属性也更复杂些。在Android UI界面设计中,Layout布局控件就像“建筑师”一样,帮助我们把整个界面的框架布局搭建起来,并把每个控件都放到合适的位置上。我们最经常使用的布局有以下几种,我们来逐个介绍一下。

  1. 基本布局(FrameLayout)
    基本布局(FrameLayout)是所有Android 布局中最基本的,此布局实际上只能算是一个“容器”,里面所有的元素都不能被指定位置,默认会被堆放到此布局的左上角。此布局在普通的应用中用得不是很多,但是因为简单高效,所以在一些游戏应用中还是经常被用到。
  2. 线性布局(LinearLayout)
    线性布局(LinearLayout)是应用开发中最常用的布局之一,分为横向和纵向两种,由android:orientation属性来控制。当属性值为“horizontal”时表示横向的线性布局,常用于并排元素的界面;而“vertical”则表示纵向也就是垂直的线性布局,它的用处更广,普通应用中的大部分界面都是垂直排列的,比如列表界面、配置界面等。

线性布局的用法很简单,就拿垂直的线性布局来说,我们只要把所需的控件按照顺序放到布局标签中间就可以了,Android UI系统会自动按照从上到下的顺序展示出来。代码清单2-18就是一个简单的代码示例,其功能很简单,就是把一个TextView和Button垂直并排在这个线性布局中。大家在阅读示例代码的同时可以顺便复习一下UI控件属性的用法。
代码清单 2-18

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView android:id="@+id/text_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="I am a TextView" />
    <Button android:id="@+id/button_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="I am a Button" />
</LinearLayout>
  1. 相对布局(RelativeLayout)
    相对布局(RelativeLayout)也是最常使用的布局之一,由于其内部的所有元素都是按照相对位置来排列的,所以不需要嵌套其他的布局,它可以使UI模板布局更加地简洁和高效。该布局中的控件元素都是以“参照控件”为准来排布的,比如控件属性设置为“android:layout_toRightOf="@+id/referBox"”,则表示该控件位于id为referBox的参照控件的右边。以下是相对布局中其他常用属性的列表,供大家参考。

android:layout_toLeftOf:该控件位于参照控件的左方。
android:layout_toRightOf:该控件位于参照控件的右方。
android:layout_above:该控件位于参照控件的上方。
android:layout_below:该控件位于参照控件的下方。
android:layout_alignParentLeft:该控件是否与父组件的左端对齐。
android:layout_alignParentRight:该控件是否与父组件的右端对齐。
android:layout_alignParentTop:该控件是否与父组件的顶部对齐。
android:layout_alignParentBottom:该控件是否与父组件的底部对齐。
android:layout_centerInParent:该控件是否与父组件居中对齐。
android:layout_centerHorizontal:该控件是否与父组件横向居中对齐。
android:layout_centerVertical:该控件是否与父组件垂直居中对齐。

  1. 绝对布局(AbsoluteLayout)
    绝对布局(AbsoluteLayout)的用法类似于HTML中的层属性“position=absolute”,该布局内部的控件可以使用android:layout_x和android:layout_y两个属性来指定它相对于布局坐标轴原点的X轴和Y轴方向的距离。图2-8就是绝对布局的示意图。

image

  1. 表格布局(TableLayout)
    大家如果熟悉HTML的话,应该非常熟悉表格布局(TableLayout),像一些表格型的信息列表都是使用表格布局来展示的。表格型布局的标签有两个—和,前者是表格布局的主要标签,整个表格布局的框架,类似于HTML标签中的;后者是表格行,类似于HTML标签中的或者。表格布局的使用范例如代码清单2-19所示。

代码清单 2-19

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:stretchColumns="0,1,2">
    <TableRow>
        <TextView android:gravity="center" android:text="ID"/>
        <TextView android:gravity="center" android:text="NAME"/>
    </TableRow>
    <TableRow>
        <TextView android:gravity="center" android:text="1"/>
        <TextView android:gravity="center" android:text="james"/>
        <Button android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:gravity="center" 
            android:text="Edit"/>
    </TableRow>
    <TableRow>
        <TextView android:gravity="center" android:text="2"/>
        <TextView android:gravity="center" android:text="iris"/>
        <Button android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:gravity="center" 
            android:text="Edit"/>
    </TableRow>
</TableLayout>

上述XML模板的最终显示结果如图2-9所示,我们可以看到,这是一个3行3列的标准表格结构,对应到代码中就是3个标签,每个标签中包含3个控件。

image

另外,我们还要注意的是,有3个很重要的属性:android:stretchColumns、android:shrinkColumns和android:collapseColumns,分别对应的是拉伸、收缩和隐藏列行为,如代码清单2-19中我们使用“android:stretchColumns="0,1,2"”,就表示所有列都是拉伸状态,因此每列中的控件才会平分并填满整行的空间;假如我们设置“android:collapseColumns="2"”,那么最右边的列将会被隐藏。

  1. 标签布局(TabLayout)
    标签布局(TabLayout)在移动应用中是相当流行的,其用法相对比其他布局复杂一些,需要配合程序来实现。接下来我们来看一个简单的标签布局的实例,其模板文件如代码清单2-20所示。

代码清单 2-20

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost_id"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp">
        <TabWidget android:id="@android:id/tabtitle_id"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <FrameLayout android:id="@android:id/tabcontent_id"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    </LinearLayout>
</TabHost>

此界面最外面是一个标签,里面嵌套了一个垂直的线性布局,该线形布局里面又包含了一个和,这些标签都是需要在程序中设置的。紧接着,在模板对应的Activity类中设置该TabLayout的逻辑,使用范例见代码清单2-21。
代码清单 2-21

public class TabDemo extends TabActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 初始化资源对象
        Resources res = getResources();
        TabHost tabHost = getTabHost();
        TabHost.TabSpec ts;
        Intent intent;

        // 设置第1个Tab
        intent = new Intent().setClass(this, Tab1Activity.class);
        ts = tabHost
            .newTabSpec("tab1")
            .setIndicator("Tab1", res.getDrawable(R.drawable.ic_tab_1))
            .setContent(intent);
        tabHost.addTab(ts);

        // 设置第2个Tab
        intent = new Intent().setClass(this, Tab2Activity.class);
        ts = tabHost
            .newTabSpec("tab2")
            .setIndicator("Tab2", res.getDrawable(R.drawable.ic_tab_2))
            .setContent(intent);
        tabHost.addTab(ts);

        // 设置第3个Tab
        intent = new Intent().setClass(this, Tab3Activity.class);
        ts = tabHost
            .newTabSpec("tab3")
            .setIndicator("Tab3", res.getDrawable(R.drawable.ic_tab_3))
            .setContent(intent);
        tabHost.addTab(ts);

        // 设置默认选中Tab
        tabHost.setCurrentTab(0);
    }
    ...
}

我们从代码注释中可以清楚地看到,在该实例中我们添加了3个Tab标签,程序使用newTabSpec方法获取TabHost.TabSpec对象,然后使用setIndicator和setContent方法设置Tab的顶部样式和内部信息,最后再调用setCurrentTab方法设置默认选中的标签页。最后,分别实现Tab1Activity、Tab2Activity和Tab3Activity界面类的逻辑,并加入声明到Manifest应用的配置文件中。至此,整个标签布局的设置就完成了。

2.7.3 事件(Event)

了解完UI控件和界面布局的基本知识之后,我们还需要知道如何控制这些界面上的控件元素。Android应用框架为我们提供了事件机制来处理用户触发的动作,常见的事件包括键盘事件KeyEvent、输入事件InputEvent、触屏事件MotionEvent等。在实际应用中,我们需要掌握如何响应当用户操作这些控件时所触发的事件。比如,用户点击某个按钮控件(Button)之后需要执行一些程序逻辑,此时我们需要使用Android系统给我们提供的事件监听器Listener来捕获按钮的点击事件来执行这些逻辑。本节中我们将会介绍Android应用框架中比较常见的监听器。

  1. View.OnClickListener事件
    View.OnClickListener是最经常使用的监听器之一,用于处理点击事件。其实,该类也是View基类中的公用接口,其接口方法为onClick(View v)。方法只有一个参数,就是点击事件触发的控件对象的本身。我们在使用过程中必须实现onClick方法,也就是把点击之后需要处理的逻辑代码放到此方法中。代码清单2-22就是相关的使用范例。

代码清单 2-22

btnObj = (Button) this.findViewById(R.id.demo_btn_id);
btnObj.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View v) {
          // 按钮点击之后的动作
          ...
    }
});

上面的代码实现的就是id为demo_btn_id的按钮控件的点击事件,我们在使用findViewById获取到按钮实例对象之后,又通过setOnClickListener方法设置View.OnClickListener监听器对象的实现,点击事件需要处理的逻辑我们会在onClick方法中实现。大家可以看到,Android UI事件的概念和用法与JavaScript语言有点类似。

  1. View.OnFocusChangeListener事件
    监听器View.OnFocusChangeListener用于处理选中事件,比如界面中有若干个UI控件,当需要根据选中不同的控件来处理不同的逻辑时,就可以使用按钮控件对象的setOnFocusChangeListener方法来设置View.OnClickListener监听器对象。选中需要处理的逻辑会在该监听器对象的onFocusChange方法中实现。

onFocusChange方法有两个参数:第一个是事件触发的控件对象,我们可以用其判断并处理不同控件的触发事件,另一个则是布尔型的值,表示改控件对象的最新状态。另外,监听器的具体用法和View.OnClickListener类似。

  1. View.OnKeyListener事件
    监听器View.OnKeyListener用于处理键盘的按键。我们可以在该监听器的onKey方法中处理用户点击不同按键时所需要处理的逻辑。在Android的键盘系统中,每个按键都有自己的代码,也就是keyCode。需要注意的是,onKey方法的第二个参数传递的就是用户点击按键的keyCode,而后我们就可以使用switch语句来处理不同的按键事件了。这个思路其实和JavaScript中的onkey系列方法非常类似,读者如果熟悉JavaScript的话,可以对照着学习一下。
  2. View.OnTouchListener事件
    监听器View.OnTouchListener用于处理Android系统的触屏事件。如果我们需要对一些触摸动作做处理,或者需要处理比点击动作此类动作更细粒度的动作的话,就要用到这个监听器了。此监听器必须实现的接口方法是onTouch(View v, MotionEvent event),我们需要注意的是第二个参数,因为这个参数表示的是用户触发的动作事件,我们可以根据这个参数的值来处理比较复杂的手势(gesture)动作。

MotionEvent事件中比较常见的动作和手势常量的说明如下,供大家参考。
ACTION_DOWN:按下手势,包含用户按下时的位置信息。
ACTION_UP:松开手势,包含用户离开时的位置信息。
ACTION_MOVE:拖动手势,包含最新的移动位置。
ACTION_CANCEL:结束手势,类似于ACTION_UP,但是不包含任何位置信息。
ACTION_OUTSIDE:离开控件元素时所触发的事件,只包含初始的位置信息。
EDGE_BOTTOM:碰触屏幕底部时所触发的事件。
EDGE_LEFT:碰触屏幕左边时所触发的事件。
EDGE_RIGHT:碰触屏幕右边时所触发的事件。
EDGE_TOP:碰触屏幕顶部时所触发的事件。
ACTION_MASK:多点触碰事件的标志,可用于处理多点触摸事件。
ACTION_POINTER_DOWN:第二点按下时的触发事件。
ACTION_POINTER_UP:第二点松开时的触发事件。
可以想象,如果缺少事件响应的支持,Android应用的界面将会变得毫无交互性。因此,学会使用UI控件的各种响应事件的用法对于Android应用开发来说是非常重要的。通常情况下,我们会使用不同的事件来让界面中的元素生动起来。比如,我们可以通过实现某个UI控件的View.OnClickListener事件来响应用户的点击动作(如代码清单2-22所示),或者还可以使用View.OnTouchListener事件来响应一些更加复杂的动作。

2.7.4 菜单(Menu)

菜单是Android应用系统中最有特色的功能之一,也是每个Android应用必不可少的组件之一。合理地使用菜单不仅可以帮助我们节省界面空间,还可以提升用户的操作体验。一般,我们最常用的菜单有以下3种,下面我们分别来学习一下。

  1. 选项菜单(Options Menu)
    选项菜单(Options Menu)是Android应用中最经常被使用的菜单,当用户按下系统菜单键时出现。在Activity中,我们通常使用onCreateOptionsMenu方法来初始化菜单项,然后再使用onOptionsItemSelected方法处理每个菜单项选中时的逻辑。使用范例如代码清单2-23所示。

代码清单 2-23

public class MenuActivity extends Activity {
    
    ...
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        // 添加书写按钮菜单项
        menu.add(0, MENU_APP_WRITE, 0, R.string.menu_app_write).setIcon(...);
        // 添加注销按钮菜单项
        menu.add(0, MENU_APP_LOGOUT, 0, R.string.menu_app_logout).setIcon(...);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case MENU_APP_WRITE:
                // 点击书写菜单项之后的逻辑
                ...
                break;
            case MENU_APP_LOGOUT:
                // 点击注销菜单项之后的逻辑
                ...
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

当然,如果我们需要添加一些每次菜单加载时都需要执行的逻辑,则需要使用onPrepareOptionsMenu方法来处理,因为onCreateOptionsMenu只在菜单项初始化的时候执行一次。

  1. 上下文菜单(Context Menu)
    上下文菜单(Context Menu)的概念和PC上应用软件的快捷菜单有点类似,在UI控件注册了此菜单对象以后,长按视图控件(2秒以上)就可以唤醒上下文菜单。在Activity类中,我们可以使用onCreateContextMenu方法来初始化上下文菜单。和选项菜单略微不同的是,此方法在每次菜单展示的时候都会被调用。另外,处理上下文菜单点击事件的方法名为onContextItemSelected,其用法和前面介绍的选项菜单中的onOptionsItemSelected方法类似。
  2. 子菜单(Submenu)
    在Android应用中点击子菜单时会弹出悬浮窗口显示子菜单项,子菜单(Submenu)可以被添加到其他的菜单中去。使用方法也很简单,Submenu的使用范例如代码清单2-24所示。我们需要注意的是,子菜单是不可以嵌套的,即子菜单中不能再包含其他子菜单,我们在使用的时候必须注意这个问题。

代码清单 2-24

publicboolean onCreateOptionsMenu(Menu menu) {
    // 初始化变量
    int base = Menu.FIRST;
    
    // 添加子菜单
    SubMenu subMenu = menu.addSubMenu(base, base+1, Menu.NONE, "子菜单-1");
    // 设置图标
    subMenu.setIcon(R.drawable.settings);
    
    // 添加子菜单项
    subMenu.add(base, base+1, base+1, "子菜单项-1");
    subMenu.add(base, base+2, base+2, "子菜单项-2");
    subMenu.add(base, base+3, base+3, "子菜单项-3");

     return true;
}

以上我们介绍了Android系统中最常见的几种菜单的概念和基本用法,关于菜单组件实际运用的更多信息,我们将在实战篇的7.5.1节中结合实际案例做进一步的介绍。

2.7.5 主题(Theme)

为了让Android UI界面开发更加快速方便,同时具有更好的复用性,应用框架为我们提供了样式(style)和主题(theme)两个功能。这两个功能让我们可以更好地控制UI界面的外观,并可以实现一些更高级的功能,比如换肤功能等。
首先,需要了解的是,我们通常会把样式和主题的声明放在Android应用框架的资源目录res/values/下的styles.xml文件中,使用范例如代码清单2-25所示。
代码清单 2-25

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CommonText" parent="@style/Text">
        <item name="android:textSize">12px</item>
        <item name="android:textColor">#008</item>
    </style>
</resources>

我们可以看到,在这个样式文件中我们声明了一个名为“CommonText”的样式,里面包含了该样式的两个属性:字体大小“android:textSize”和字体颜色“android:textColor”属性。另外,样式是支持继承的,比如,该样式就继承自系统的基础“Text”样式,这种使用parent属性设置父样式的用法还是比较容易理解的。了解完样式和主题的写法,接下来让我们认识一下样式和主题之间的区别。

  1. 样式(style)
    Android的UI系统中,样式(style)的概念和CSS中样式的概念非常类似,我们可以把一些常用的样式提取出来,比如代码清单2-20中,我们就把一种常见的文字样式提取出来并保存为“CommonText”的样式。应用样式的时候,我们只需要在对应控件的声明中加上“style="@style/CommonText"”属性值即可。一般来说,样式都只会被应用于单个View控件中。
  2. 主题(theme)
    与样式不同,主题(theme)一般被用于更外层的ViewGroup控件中,比如,我们需要让Activity下所有控件的字体都用CommonText的样式,那么我们就可以在应用配置文件中的标签加上“android:theme="CommonText"”的属性。但是,如果我们把样式用在ViewGroup上,对于ViewGroup之下的其他View控件却是没有影响的。另外,Android系统还定义了几个基本的系统主题供我们使用,比如Theme.Light主题就是以亮色背景为基调的主题样式。

学会灵活使用样式和主题来渲染Android应用的UI界面是非常重要的,因为该技术不仅可以让界面设计更加容易,还可以简化模板文件的代码,减少开发成本。因此,在实践的过程中,我们要有意识地去运用这些知识和技巧,逐渐掌握Android UI系统的使用。

2.7.6 对话框(Dialog)

在Android应用界面中,经常需要弹出一些悬浮于底层UI界面之上的操作窗口。当这种窗口显示的时候,底层界面通常会被半透明层所覆盖住,焦点则会被该窗口获得,这种窗口就被称为对话框,或者是Dialog。应用中常用的Dialog有提示对话框(AlertDialog)、进度对话框(ProgressDialog)、日期选择对话框(DatePickerDialog)以及时间选择对话框(TimePickerDialog)等。在本节中,我们将重点介绍其中较常使用的两种Dialog的用法。

  1. 提示对话框(AlertDialog)
    提示对话框(AlertDialog)可以算是Android应用中最经常使用的对话框控件了,其主要用于显示提示信息,当然,可以加上确认和取消(YES和NO)按钮。创建AlertDialog需要使用AlertDialog.Builder子类,代码清单2-26演示了创建AlertDialog对话框的标准过程。

代码清单 2-26

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
    .setCancelable(false)
    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            MyActivity.this.finish();
        }
    })
    .setNegativeButton("No", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            dialog.cancel();
        }
    });
AlertDialog alert = builder.create();
alert.show();

在以上代码中,首先使用AlertDialog.Builder(Context)方法来获取Builder对象,然后使用Builder类提供的公用方法来设置AlertDialog的文字和属性,接着使用该类的create方法来创建AlertDialog对象,最后调用show方法展示该对话框。显示效果如图2-10所示。
image

  1. 进度对话框(ProgressDialog)
    进度对话框(ProgressDialog)在Android应用开发中也经常会用到,主要用于在耗时操作等待时显示。其用法比较简单,一般情况下,只需要调用ProgressDialog的show方法即可,如代码清单2-27所示。

代码清单 2-27

…
ProgressDialog dialog = ProgressDialog.show(this, "", "Loading. Please wait...", true);
…

以上代码创建了一个最基本的进度对话框,显示效果如图2-11所示。
当然,ProgressDialog类还提供了丰富的对话框属性设置方法,如设置进度条的样式、标题、提示信息,以及是否显示按钮等。更多用法示例可参考后面7.11.3节中的内容。至于其他对话框的用法由于篇幅原因,这里不做详细介绍。
image

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
转载:Futurice-Android 开发最佳实践
转载至:https://github.com/futurice/android-best-practices 从Futurice公司Android开发者中学到的经验。
1174 0
《深入理解Android:Telephony原理剖析与最佳实践》一导读
目前国内市场上针对Android的书籍很多,但这些书籍中,绝大多数是基于Android SDK在应用层的开发进行讲解的。针对Android系统级的源代码分析的书籍,主要是邓凡平著的《深入理解Android:卷Ⅰ》和《深入理解Android:卷Ⅱ》,但深入理解Android Telephony的书籍国内目前还是空白。
1134 0
Android应用开发入门五问
  1. Android是什么?   Android 是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序——移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。
687 0
【CURL】PHP的CURL开发项目最佳实践
前言 最近自己做了团队内部的http调试工具,github开源地址 https://github.com/diandianxiyu/ApiTesting ,通过这个项目又重新操作了PHP的curl函数,通过本篇博客进行记录,和大家一起学习~ Code 本代码通过PHP7环境运行。
696 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载