《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

相关文章
|
1天前
|
安全 编译器 PHP
PHP 8.1版本发布:引领Web开发新潮流
PHP编程语言一直是Web开发的主力军,而最新发布的PHP 8.1版本则为开发者们带来了更多创新和便利。本文将介绍PHP 8.1版本的主要特性,包括更快的性能、新的语言功能和增强的安全性,以及如何利用这些功能来提升Web应用程序的质量和效率。
|
2天前
|
缓存 移动开发 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第18天】 在移动开发的世界中,打造一个既快速又流畅的Android应用并非易事。本文深入探讨了如何通过一系列创新的技术策略来提升应用性能和用户体验。我们将从用户界面(UI)设计的简约性原则出发,探索响应式布局和Material Design的实践,再深入剖析后台任务处理、内存管理和电池寿命优化的技巧。此外,文中还将讨论最新的Android Jetpack组件如何帮助开发者更高效地构建高质量的应用。此内容不仅适合经验丰富的开发者深化理解,也适合初学者构建起对Android高效开发的基础认识。
2 0
|
2天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
5 0
|
3天前
|
缓存 移动开发 Java
构建高效的Android应用:内存优化策略
【4月更文挑战第16天】 在移动开发领域,尤其是针对资源有限的Android设备,内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨Android应用的内存管理机制,分析常见的内存泄漏问题,并提出一系列实用的内存优化技巧。通过这些策略的实施,开发者可以显著减少应用的内存占用,避免不必要的后台服务,以及提高垃圾回收效率,从而延长设备的电池寿命并确保应用的流畅运行。
|
4天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
5天前
|
搜索推荐 开发工具 Android开发
安卓即时应用(Instant Apps)开发指南
【4月更文挑战第14天】Android Instant Apps让用户体验部分应用功能而无需完整下载。开发者需将应用拆分成模块,基于已上线的基础应用构建。使用Android Studio的Instant Apps Feature Library定义模块特性,优化代码与资源以减小模块大小,同步管理即时应用和基础应用的版本。经过测试,可发布至Google Play Console,提升用户便利性,创造新获客机会。
|
6天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。
|
6天前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
|
12天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。
|
12天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。