文章目录

  • 1. 开发第一个Hello World程序
    • 1.1 开发程序
    • 1.2 认识程序中的文件
    • 1.3 Android程序结构
    • 1.4 安卓程序打包
  • 2. Android UI开发
    • 2.1 布局的创建
    • 2.2 布局的类型
      • 2.2.1 线性布局
      • 2.2.2 相对布局
    • 2.3 控件的单位
    • 2.3 常用控件
      • 2.3.1 TextView
      • 2.3.2 EditText
      • 2.3.3 Button(含3种点击事件)
      • 2.3.4 RadioButton
      • 2.3.5 CheckBox 控件
      • 2.3.6 ImageView
    • 2.4 常见对话框
      • 2.4.1 普通对话框(Dialog)
      • 2.4.2 单选对话框
      • 2.4.3 多选对话框
      • 2.4.4 进度条对话框
      • 2.4.5 消息对话框(Toast)
    • 3.1 列表(ListView)
      • 3.1.1 ListView

1. 开发第一个Hello World程序


1.1 开发程序

  1. 进入New Project界面

  2. 选择Empty Activity即可

  3. 填写基本信息

  4. 运行项目

  5. 到这里项目就创建完成了,此时在Android Studio中会显示创建好的HelloWorld程序


1.2 认识程序中的文件

当HelloWorld项目创建成功后,Android Studio会自动生成两个默认的文件,那就是布局文件和Activity文件,布局文件主要用于展示Android项目的界面,Activity文件主要用于完成界面的交互功能。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

上述代码就是 HelloWorld 程序的布局文件,在该布局中可以添加任意的按钮和文本框或者其他组件,好的布局文件可以让程序看起来赏心悦目。

MainActivity.java

package com.tian;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}

MainActivity继承自AppCompatActivity,当Activity执行时首先会调用onCreate()方法,在该方法中通过setContentView(R.layout.activity_hello_world)将布局文件转换成View对象,显示在界面上。

每个 Android 程序创建成功后,都会自动生成一个清单文件AndroidManifest.xml(位于manifests文件夹),该文件是整个项目的配置文件,程序中定义的四大组件(Activity、Broadcast Receiver、Service、ContentProvider)都需要在该文件中进行注册。下面就来看一下清单文件中的默认内容,具体代码如下所示。
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.tian"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.HelloWorld"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

在上述代码中,<application>标签中的allowBackup属性用于设置是否允许备份应用数据;icon属性用于设置应用程序图标;label属性用来指定显示在标题栏上的名称;supportsRtl属性设置为true时,应用将支持RTL(Right-to-Left)布局;theme属性用于指定主题样式,就是能够应用于此程序中所有的Activity或者application的显示风格。

<activity android:name=".MainActivity" >标签用于注册一个Activity,<intent-filter>标签中设置的action属性表示当前Activity最先启动,category属性表示当前应用显示在桌面程序列表中。


1.3 Android程序结构

  • manifests:用于存放AndroidManifest.xml文件(又称清单文件),该文件是整个项目的配置文件。在程序中定义的四大组件都需要在这个文件中注册,另外在该文件中还可以给程序添加权限。在清单文件中配置的信息会添加到 Android 系统中,当程序运行时,系统会找到清单文件中的配置信息,然后根据配置信息打开相应组件。
  • java:用于存放所有的Java代码,在该文件夹中可以创建多个包,每个包中可以存放不同的文件或Activity。
  • res:用于存放Android程序所用到的资源,例如图片、布局文件、字符串等。drawable目录用于存放图片及XML 文件,layout 目录用于存放布局文件,mipmap 目录通常用于存放应用程序图标,系统会根据手机屏幕分辨率(hdpi/mdpi/xhdpi/xxhdpi/xxxhdpi)匹配相应大小的图标, values目录用于放置定义的字符串。
  • Gradle Scripts:用于存放项目创建的相关文件,无须修改。

1.4 安卓程序打包

示例:


2. Android UI开发

UI(User Interface)界面是人与手机之间数据传递、信息交互的重要媒介和对话窗口,是Android系统的重要组成部分。界面的美观度直接影响用户的第一印象,因此,开发一个整齐、美观的界面至关重要。

下面演示的案例基于上面的 Hello World 程序


2.1 布局的创建

添加布局的过程非常简单,首先选中layout文件夹并单击右键,依次选中【New】→【XML】→【Layout XML File】选项

单击该选项后会弹出New Android Activity界面

  • Layout File Name:文件的名称,该名称只能包含小写字母a~z,数字0~9或下划线“_”,若命名不符合要求,则下方会出现错误提示。
  • Root Tag:表示根元素标签,默认为LinearLayout(线性布局)。单击【Finish】按钮,新布局就创建完成了。

2.2 布局的类型

为了适应不同的界面风格,Android 系统为开发人员提供了5种常用布局,分别是

  • Linear Layout(线性布局)
  • RelativeLayout(相对布局)
  • FrameLayout(帧布局)
  • TableLayout(表格布局)
  • AbsoluteLayout(绝对布局)

下面介绍2种最常用的布局。


2.2.1 线性布局

线性布局(LinearLayout)在实际开发中比较常用,它主要以水平和垂直方式来显示界面中的控件。当控件水平排列时,显示顺序依次为从左到右;当控件垂直排列时,显示顺序依次为从上到下。

在线性布局中,有一个非常重要的属性 orientation,用于控制控件的排列方向,该属性有vertical和horizontal(默认)两个值,其中,vertical表示线性布局垂直显示,horizontal表示线性布局水平显示。接下来通过orientation属性,设置3个按钮垂直排列,具体代码如下所示。


linearlayout1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/btn_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮1" /><Buttonandroid:id="@+id/btn_2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮2" /><Buttonandroid:id="@+id/btn_3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮3" />
</LinearLayout>

在上述代码中,将 orientation 属性值设置为 vertical,控件垂直显示。若将该值修改为horizontal(默认),则控件会水平显示,预览效果如图所示。

需要注意的是,当控件水平排列时,控件属性 layout_width 只能设置为 wrap_content(包裹内容让当前控件根据控件内容大小自动伸缩),不能设置为match_parent(填充父窗体由父容器大小决定控件大小),否则其余控件会被挤出屏幕右侧不显示。同理,如果控件垂直排列也会出现同样情况。

如上图所示:当控件水平排列时,3个Button未占满一行,右侧留有空白区域,这样既不美观又浪费空间。此时,利用layout_weight属性可完美解决这个问题,该属性被称为权重,通过比例调整布局中所有控件的大小,在进行屏幕适配时起到关键作用,示例代码如下


linearlayout1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_1"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="按钮1" /><Buttonandroid:id="@+id/btn_2"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="按钮2" /><Buttonandroid:id="@+id/btn_3"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="2"android:text="按钮3" />
</LinearLayout>

在上述代码中,需将父控件的 layout_width 的属性值设置为“match_parent”,Button 中 layout_weight 的属性值可直接填写数字,1表示在整个控件中占据权重值为1。原理是Android先会把布局内所有控件 layout_weight 属性值相加得到总值,然后用该控件layout_weight属性值除以总值,得到每个控件的占比,根据占比分配控件所占大小。以上述代码为例,“按钮1”和“按钮2”权重值是1,“按钮3”权重值是2。

“按钮1”的计算方式是:1 / (1 + 1 + 2) = 1 / 4 ,因此占用1 / 4 的位置。

需要注意的是,在上述代码中线性布局 layout_width 的属性值不可设为wrap_content,因为LinearLayout的优先级比Button高,所以Button标签中layout_weight属性会失去作用。当Button标签中使用layout_weight时,控件宽度不再由layout_width来决定,所以指定为0dp不会影响效果,这样写也是一种规范。


2.2.2 相对布局

在Android程序创建时,默认采用的就是相对布局(RelativeLayout)。相对布局是通过相对定位的方式指定控件位置,即以其他控件或父容器为参照物,摆放控件位置。在设计相对布局时要遵循控件之间的依赖关系,后放入控件的位置依赖于先放入的控件。

相对布局属性较多,但都是有规律的,所以不难理解,下面先来介绍在布局内控件摆放位置的属性:

再来看一下相对于某控件间距的属性:
最后介绍在布局中设置内边距的属性:
下面通过上述属性设置3个按钮的位置,通过效果图对比更好地理解其作用,代码如下:

relativelayout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="20dp"><Buttonandroid:id="@+id/btn_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:text="按钮1" /><Buttonandroid:id="@+id/btn_2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_marginTop="260dp"android:text="按钮2" /><Buttonandroid:id="@+id/btn_3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBottom="@+id/btn_2"android:layout_marginBottom="100dp"android:layout_toRightOf="@+id/btn_2"android:text="按钮3" />
</RelativeLayout>

在上述代码中,使用 RelativeLayout 标签定义了一个相对布局,并在该布局中添加3个按钮,通过设置属性控制每个控件位置,预览效果如图所示:


2.3 控件的单位

为了让程序拥有更好的屏幕适配能力,在指定控件和布局宽高时最好使用“match_parent”或“wrap_content”,尽量避免将控件宽高设置固定值。因为在控件很多的情况下会相互挤压,使控件变形。但特殊情况下需要使用指定宽高值时,可以选择使用px、pt、dp、sp四种单位。

  • px:代表像素,即在屏幕中可以显示的最小元素单位,应用程序中任何控件都是由一个个像素点组成的。分辨率越高的手机,屏幕的像素点就越多。因此,如果使用 px 控制控件的大小,在分辨率不同的手机上控件显示的大小也会不同。
  • pt:代表磅数,一磅等于1/72英寸,一般pt都会作为字体的单位来显示。pt和px的情况类似,在不同分辨率的手机上,用pt控件的字体大小也会不同。
  • dp:一种基于屏幕密度的抽象单位。不同设备有不同的显示效果,它是根据设备分辨率的不同来确定控件的尺寸。
  • sp:代表可伸缩像素,采用与dp相同的设计理念,推荐设置文字大小时使用。

2.3 常用控件

控件是界面组成的主要元素,例如TextView(文本框)、EditText(编辑框)和Button(按钮)等,这些控件与用户进行直接交互,因此掌握这些控件的使用对日后开发工作至关重要。


2.3.1 TextView

使用手机时,经常会看见一些文本信息(字符串),这些文本信息通常是由TextView控件显示的。下面列举TextView常用属性:

TextView控件其实还有很多属性,这里就不一一列举了。下面看一下如何为TextView控件设置宽、高、文本颜色(黑色)、字体大小等属性,具体代码如下所示:

relativelayout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="20dp"><!--    下面是TextView和它的常用属性示例 --><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World!"android:textColor="#000"android:textStyle="italic"android:textSize="25sp"android:gravity="center" />
</RelativeLayout>

效果图:

layout_width、layout_height和width、height属性的区别:

在Android系统中,layout_width、layout_height属性和width、height属性的功能是相同的,都用于设置控件的宽、高,只不过带“layout”前缀的属性通常是相对父控件而言的,而width、height属性是相对于控件本身而言的。下面对比一下它们在使用时的区别。

  • layout_width和layout_height属性可以单独使用,而width和height属性不能,如果单独使用width和height属性,此时的控件是不显示的。
  • layout_width 和 layout_height 可以设置为 wrap_content 或者match_parent,而 width和height只能设置固定值,否则会产生编译错误。
  • 如果要使用 width和 height,就必须同时设置 layout_width和layout_height属性,把width和height作为组件的微调使用。综上所述,在设置TextView控件宽、高时,通常直接使用layout_width和layout_height,简单方便。

2.3.2 EditText

使用Android程序时,用户经常会向程序中输入数据,此时就会用到文本编辑控件EditText,接收用户输入信息,该控件类似一个运输工具,将用户信息传递给Android程序。EditText继承自TextView,与TextView最大的不同就是用户可以在设备上对EditText控件进行操作,同时还可以为 EditText 控件设置监听器,用来测试用户输入的内容是否合法。EditText 除了具有TextView的一些属性外,还有自己的特有属性,具体如表所示:

具体代码如下所示:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><!--    下面是EditText和它的常用属性示例 --><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入姓名"android:maxLines="2"android:textColor="#000"android:textSize="20sp"android:textStyle="bold" /></RelativeLayout>

运行结果:

在上述代码中,EditText控件有一个特有属性hint,其作用是在EditText没有输入内容时,显示提示信息,当单击EditText输入内容时,提示文本消失。

需要注意的是,上述代码中将EditText高度设置为wrap_content(包裹内容),如果输入内容过多,EditText会被拉伸,影响界面美观。此时,使用maxLines属性就可以解决这个问题,代码中设置的android:maxLines="2"表示EditText这个空间最大行数是两行,如果输入的内容超过了两行,文本就会出现上下滚动的效果,EditText不会被拉伸。


2.3.3 Button(含3种点击事件)

Button(按钮)是程序开发中必不可少的一个控件,其作用是用于响应用户的一系列点击事件,使程序更加流畅和完整。Button控件常用的点击方式有3种,分别是在布局中指定onClick属性、使用匿名内部类、在当前Activity中实现OnClickListener接口。接下来针对这前种点击事件进行讲解。第三种方式在CheckBox控件中展示。

首先创建一个布局,放置2个按钮:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_one"android:text="按钮1"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="click"/><Buttonandroid:id="@+id/btn_two"android:text="按钮2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/btn_one"/>
</RelativeLayout>

效果图:

在上述代码中,两个按钮都设置了id属性,方便对按钮进行查找以及设置相关事件,其中“按钮1”是在布局中指定onClick属性的方式来实现点击事件,“按钮2”是通过匿名内部类的方式来实现点击事件。接下来在MainActivity中实现逻辑代码,具体代码如下所示。

MainActivity.java

package com.tian;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity {private Button myBtn_one;private Button myBtn_two;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//通过findViewById()初始化控件myBtn_one = (Button) findViewById(R.id.btn_one);myBtn_two = (Button) findViewById(R.id.btn_two);//匿名内部类的方法实现按钮2的点击事件myBtn_two.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {myBtn_two.setText("按钮2已被点击");}});}//通过实现onClick()方法,实现按钮1的点击事件public void click(View view) {myBtn_one.setText("按钮1已被点击");}
}
  • 在上述代码中,通过 findViewById()方法初始化控件,然后为“按钮1”添加click()方法触发点击事件,并通过 setText()方法修改按钮的文本信息。需要注意的是,布局代码中onClick属性的值(click)必须与Activity代码中定义的方法名保持一致,否则Android系统找不到绑定的点击事件。
  • “按钮2”是用匿名内部类作为监听器对点击事件进行监听,首先使用setOnClickListener()方法对“按钮2”进行绑定,然后实现onClick()方法,在此方法中编写逻辑运行程序即可。

运行效果:


2.3.4 RadioButton

RadioButton为单选按钮,它需要与RadioGroup配合使用,提供两个或多个互斥的选项集。RadioGroup 是单选组合框,可容纳多个RadioButton,并把它们组合在一起,实现单选状态。在RadioGroup中可以利用android:orientation控制RadioButton排列方向。

示例代码如下:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><RadioGroupandroid:id="@+id/rdg"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><RadioButtonandroid:id="@+id/rbtn_one"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="25dp"android:text="男"android:checked="true" /><RadioButtonandroid:id="@+id/rbtn_two"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="25dp"android:text="女" /></RadioGroup><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/rdg"android:textSize="30sp"android:textColor="#FFD700" />
</RelativeLayout>

通过上述代码可以发现,RadioButton属性和其他控件属性都是通用的,但RadioButton有个特有属性checked,该属性值如果设置为true,按钮会默认选中,设置为false则按钮未选中。将值设置成false通常是没有意义的,如果想让按钮处于未选中状态,可以不添加该属性。下方TextView标签中没有设置text属性,所以不显示文本。

接下来在Activity中编写逻辑代码,为RadioButton设置监听事件,具体代码如下所示。

MainActivity.java

package com.tian;import android.os.Bundle;
import android.widget.RadioGroup;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private RadioGroup radioGroup;private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);radioGroup = findViewById(R.id.rdg);textView = findViewById(R.id.tv);// 建立监听事件radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int radioId) {// 判断是哪一个radioButton被点击了if (radioId == R.id.rbtn_one) {textView.setText("你的性别是: 男");} else {textView.setText("你的性别是: 女");}}});}
}

在上述代码中,利用setOnCheckedChangeListener()监听Radio Group 控件状态,通过 if 语句判断被选中 RadioButton 的 id,通过textView.setText()方法设置显示对应的性别信息,运行结果如图:


2.3.5 CheckBox 控件

CheckBox 控件表示复选框,他是Button控件的子类,用于实现多选功能。每个复选框都有 选中 和 未选中 状态,这2种状态是通过android:checked属性指定的,当该属性为true,表示选中,false表示未选中。

示例代码如下:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="请选择兴趣爱好"android:textColor="#6495ED"android:textSize="25sp" /><CheckBoxandroid:id="@+id/ck_one"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="羽毛球"android:textSize="18sp" /><CheckBoxandroid:id="@+id/ck_two"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="乒乓球"android:textSize="18sp" /><CheckBoxandroid:id="@+id/ck_three"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="篮球"android:textSize="18sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="你选择的兴趣爱好为: "android:textColor="#FF8000"android:textSize="22sp" /><TextViewandroid:id="@+id/hobby"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp" /></LinearLayout>

接下来在Activity中编写逻辑代码,具体代码如下所示。

MainActivity.java

package com.tian;import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {private TextView hobby;private String hobbys;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化CheckBox控件CheckBox box1 = findViewById(R.id.ck_one);CheckBox box2 = findViewById(R.id.ck_two);CheckBox box3 = findViewById(R.id.ck_three);// 设置点击事件box1.setOnCheckedChangeListener(this);box2.setOnCheckedChangeListener(this);box3.setOnCheckedChangeListener(this);hobby = findViewById(R.id.hobby);hobbys = new String();// 存放选中的CheckBox的信息}@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {String motion = compoundButton.getText().toString();if (isChecked) {if (!hobbys.contains(motion)) {hobbys += motion+ " ";hobby.setText(hobbys);}}}
}

运行结果:


2.3.6 ImageView

ImageView是视图控件,它继承自View,其功能是在屏幕中显示图像。ImageView类可以从各种来源加载图像(如资源库或网络),并提供缩放、裁剪、着色(渲染)等功能。

他的常用属性如下所示:

属性名称 功能描述
android:layout_width 设置控件宽度
android:layout_height 设置控件高度
android:id 设置控件id
android:background 设置控件背景
android:layout_margin 设置控件与屏幕编辑或周围控件的边距
android:src 设置要显示的图片资源
android:scaleType 将图片缩放或移动,以适应ImageView控件的宽高
android:tint=“” 将图片渲染为指定的颜色

接下来创建一个 ImageView控件并在界面中显示出图片,具体代码如下所示:


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="#FFD700" /><ImageViewandroid:layout_width="100dp"android:layout_height="100dp"android:src="#000" />
</RelativeLayout>

运行结果,src我就懒得去找图片资源了:


2.4 常见对话框

在Android界面中,除了菜单之外,对话框也是程序与用户交互的一种方式,通常用于显示当前程序提示信息以及相关说明。对话框一般以小窗口的形式展示在Activity之上,当对话框显示时,处在下层的Activity失去焦点,对话框便可以接收用户的交互信息。


2.4.1 普通对话框(Dialog)

在普通对话框(Dialog)中,一般只会显示提示信息,并通常具有“确定”和“取消”按钮。在使用Dialog对话框时会用到几种常用的方法,具体如表所示:
接下来使用上述方法,实现一个简单的对话框,具体代码如下所示。


MainActivity.java

package com.tian;import android.app.AlertDialog;
import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//声明对象AlertDialog dialog;//绑定当前界面窗口,设置标题dialog = new AlertDialog.Builder(this).setTitle("Dialog对话框")// 设置提示信息.setMessage("是否确定退出").setIcon(R.mipmap.ic_launcher)//设置图标.setPositiveButton("确定", null)// 添加确定按钮.setNegativeButton("取消", null)// 添加取消按钮.create(); // 创建对话框dialog.show();// 显示对话框}
}

在上述代码中,通过AlertDialog生成一个对话框,用setTitle()方法设置标题,setMessage()方法设置提示信息,setIcon()用于设置对话框图标,setPositiveButton()设置“确定”按钮,第一个参数为按钮显示信息,第二个参数为是否设置监听,没有则设为“null”,setNegativeButton()设置“取消”按钮。当完成对话框属性设置之后,需调用create()方法创建对话框。在对话框创建完成后,需调用show()方法进行显示,运行结果如图所示。


2.4.2 单选对话框

单选对话框和RadioButton作用类似,只能选择一个选项,它是通过AlertDialog对象调用setSingleChoiceItems()方法创建的,示例代码如下:


MainActivity.java

package com.tian;import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//生成对话框    new AlertDialog.Builder(this).setTitle("请选择性别")//设置标题       .setIcon(R.mipmap.ic_launcher) //设置图标       .setSingleChoiceItems(new String[]{"男", "女"}, 0, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {}}).setPositiveButton("确定", null).show();}
}

在上述代码中,setSingleChoiceItems()方法需要设置3个参数,第1个参数建立数组,用于显示选项内容;第2个参数设置是否默认选中,“0”表示默认选中第一个选项,如果默认未选中,参数填写-1;第3个参数是设立监听,允许对话框被点击,运行结果如图所示:


2.4.3 多选对话框

多选对话框通常在需要勾选多种选项时使用,例如添加兴趣爱好、喜爱的电影等。创建多选对话框与创建单选对话框类似,调用setMultiChoiceItems()方法就可实现,具体代码如下所示。

MainActivity.java

package com.tian;import android.app.AlertDialog;
import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new AlertDialog.Builder(this).setTitle("请添加兴趣爱好").setIcon(R.mipmap.ic_launcher).setMultiChoiceItems(new String[]{"旅游", "美食", "汽车", "宠物"}, null, null).setPositiveButton("确定", null).show();}
}

在上述代码中,setMultiChoiceItems()同样有3个参数,第1个参数建立数组,用于显示选项内容;第2个参数是boolean数组,用来判断哪个选项需要勾选,如果没有选项选中则用“null”即可;第3个参数是建立监听,允许对话框被点击,运行结果如图所示:

需要注意的是,在setMultiChoiceItems()方法的第2个参数使用boolean数组时,定义的长度要对应第1个参数设置的选项个数,例如上图中有4个选项,那么boolean数组的长度也应该是4。同时也可通过代码实现默认勾选效果,例如第2个参数填写为new boolean[]{true, true,true,true}


2.4.4 进度条对话框

当应用程序在实现耗时操作时(如下载资源、获取图片等),为了与用户更友好地交互,进度条对话框(ProgressDialog)是必不可少的。在Android中提供了圆形进度条和水平进度条两种进度条样式,通过setProgressStyle()方法便可设置进度条样式,具体代码如下所示。


MainActivity.java

package com.tian;import android.app.ProgressDialog;
import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ProgressDialog prodialog; //声明对话框prodialog = new ProgressDialog(this); //构建对话框prodialog.setTitle("进度条对话框");prodialog.setIcon(R.mipmap.ic_launcher);prodialog.setMessage("正在下载请等候...");//设置水平进度条prodialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);prodialog.show();}
}

运行结果:

如果将参数更改为ProgressDialog.STYLE_SPINNER
则样式变为圆形进度条,运行结果如图所示:


2.4.5 消息对话框(Toast)

消息对话框(Toast)是Android系统提供的轻量级信息提醒机制,用于向用户提示即时消息,Toast对话框显示在应用程序界面的最上层,显示一段时间后自动消失,不会打断当前操作,也不获得焦点。由于Toast只起到提示作用,因此多用在触发事件的监听中。接下来通过一段代码更好地了解Toast对话框,具体代码如下所示。

MainActivity.java

package com.tian;import android.os.Bundle;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//创建ToastToast.makeText(this, "Hello World", Toast.LENGTH_SHORT).show();}
}

在上述代码中,通过makeText()方法实例化一个Toast对象,该方法需要接收3个参数,第1个参数为当前类的Context(上下文)对象,第2个参数为文本显示内容,第3个参数为Toast显示的时间,显示时间的长短是通过常量Toast.LENGTH_SHORT 和 Toast. LENGTH_LONG控制的,前者显示时间较短,后者显示时间较长。最后一定不要忘记调用 show()方法,否则不会弹出 Toast。运行结果如图所示:


3.1 列表(ListView)


3.1.1 ListView

ListView常用属性如下:

属性名称 功能描述
android:listSelector 条目被选中时的颜色
android:divider 分割线的颜色
android:dividerHeight 分割线的高度
android:scrollbars 是否显示滚动条
android:fadingEdge 去掉上面和下面的黑色阴影

示例代码:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>

在布局中加入ListView控件还算非常简单,先为ListView指定一个id,然后将宽度和高度都设置为match_parent,这样ListView也就占满了整个布局的空间。

接下来修改MainActivity中的代码,如下所示:

MainActivity.java

package com.tian;import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private Integer[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ArrayAdapter<Integer> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data);ListView listView = findViewById(R.id.list_view);listView.setAdapter(adapter);}
}

数组中的数据是无法直接传递给ListView的,我们还需要借助适配器来完成。

Android中提供了很多适配器的实现类,ArrayAdapter比较好用。它可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入。ArrayAdapter有多个构造函数的重载,你应该根据实际情况选择最合适的一种。这里由于我们提供的数据都是字符串,因此将ArrayAdapter的泛型指定为String,然后在ArrayAdapter的构造函数中依次传入当前上下文、ListView子项布局的id,以及要适配的数据。注意,我们使用了android.R.layout.simple_list_item_1作为ListView子项布局的id,这是一个Android内置的布局文件,里面只有一个TextView,可用于简单地显示一段文本。这样适配器对象就构建好了。最后,还需要调用ListView的setAdapter()方法,将构建好的适配器对象传递进去,这样ListView和数据之间的关联就建立完成了。

运行结果:



Android 开发 -- 开发第一个安卓程序、Android UI开发(布局的创建:相对布局和线性布局、控件单位:px pt dp sp、常用控件 、常见对话框、ListView)相关推荐

  1. Android的单位px,pt,dp,sp总结和获取屏幕分辨率

    px: pixels(像素). 是屏幕中可以显示的最小单位元素,px是设备密度有关的,不同设备显示效果不同.因为由于不同的设备密度不同,密度就是单位英寸的像素不同,在不同的手机上显示的大小就不同 pt ...

  2. 用java开发一个简单的安卓程序,Android NDK开发简单程序分享(Hello Word!)

    在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...

  3. Android px pt dp sp...

    dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素. ...

  4. 在Android Studio上编写第一个安卓程序

    文章目录 一.Android开发环境搭建 1.安卓简介: 2.安卓发展历程: 二.Android Studio开发环境 三.第一个安卓程序 出现的问题 1.找不到SDK 2.找不到安卓虚拟机 一.An ...

  5. SharePoint使用BCS开发你第一个应用程序(三)

    SharePoint使用BCS开发你第一个应用程序(三) 创建外部内容类型. 创建外部内容类型有三种不同方式: 1. 在记事本上手写XML代码(不推荐). 2. 使用SharePoint Design ...

  6. 安卓篇-我自己的第一个安卓程序(附源码链接)

    在上一期的教程中我们已经成功把安卓工作室(以下简称AS)安装到了我们的电脑上啦~那么这一期我们就要来创建属于我们自己的第一个安卓程序,并且运行到模拟器上. 上期内容传送门~~~ 如何安装Android ...

  7. 创建自己第一个安卓程序_从一天创建和发布我的第一个应用程序中学到的东西...

    创建自己第一个安卓程序 by Sarvasv Kulpati 由Sarvasv Kulpati 从一天创建和发布我的第一个应用程序中学到的东西 (What I learned from creatin ...

  8. 【Android开发】我的第一个安卓程序

    小技巧 在xml中设置控件宽度为父窗口的一半 <LinearLayoutandroid:layout_width="fill_parent"android:layout_he ...

  9. 用Kotlin开发您的第一个应用程序| Android与Kotlin

    In the previous article, we learned how to setup Kotlin in the android studio? Now moving to journey ...

最新文章

  1. 伍迷创意随想集 之 网游与旅游结合新玩法
  2. python socket thread_python 使用socket与thread进行实时通信
  3. C++中基于范围的for循环
  4. 【渝粤教育】广东开放大学 财务管理 形成性考核 (58)
  5. QT-helloworld-Qt设计师编写
  6. echart的关系图高亮_Echarts 环形图 默认高亮展示某个数据
  7. solr 6.5.1 创建core失败的原因 Can‘t find resource ‘solrconfig.xml‘
  8. 1.Spring框架入门
  9. ES6——函数参数默认值
  10. 机器学习(三)——决策树(decision tree)算法介绍
  11. 案例研究 路由器到路由器EOMPLS---基于端口
  12. 诺基亚E72_RM-530刷机包023.002版
  13. C++ 调用 python
  14. 操作系统概念 第九版 Operating System Concepts, 9th Edition 中文译稿(不定时更新)
  15. 基于改进的残差网络的指纹识别算法
  16. 一、Zstack基础知识(ZCCT云计算认证)
  17. 百度地图转换腾讯地图 php,用PHP实现腾讯地图和百度地图的相互转换范例
  18. 蒸馏论文三(Similarity-Preserving)
  19. 模拟手机定位软件有哪些,推荐几款
  20. 不必上抖音,AI Studio社区项目帮你完成简约风格迁移

热门文章

  1. ios 开发设置左滑退出_iOS 开发UITableView左滑出现删除按钮的运用方法
  2. Linux的常见操作系统
  3. 坑爹大冒险html5游戏在线玩,《史上最坑爹的大冒险》 图文全通关攻略
  4. 机器翻译和人工智能翻译,语言学与机器翻译
  5. 基于TIVA库函数的TM4C1294XL使用笔记|TI单片机
  6. EasyExcel报错空指针异常
  7. 五子棋智能算法——决策树编程实现(三)
  8. 里面可以写名字的爱心代码(html)
  9. 云计算中的存储基础知识
  10. 计算机三级考试网络技术资料,计算机三级考试2017网络技术辅导资料