一、安卓常用控件的使用方式
1.1 TextView
TextView可以说是Android中最简单的一个控件了,你在前面其实已经和它打过一些交道了。它主要用于在界面上显示一段文本信息,比如你在第1章看到的“Hello world!”。下面我们就来看一看关于TextView的更多用法。
代码语言:javascript复制<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@ id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is TextView" />
</LinearLayout>
外面的LinearLayout先忽略不看,下面是上述XML英文组合的具体解释:
英文组合 | 中文含义 |
---|---|
android:id | 控件的唯一标识符,用于被活动以R文件属性的方式引用这个控件 |
android:layout_width | 控件的宽度 |
android:layout_height | 控件的高度 |
“match_parent” | 让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小。如果父布局是View,那么宽度就是和手机屏幕一样的宽度。 |
“wrap_content” | 让当前控件的大小能够刚好包含住里面的内容,也就是由控件内容决定当前控件的大小。 |
android:text | TexyView控件内具体显示的文本内容 |
android:gravity | 控件内文字对齐方式 |
“center” | 垂直和水平均居中,即效果等同于center_vertical:center_vertical |
android:textSize=“24sp” | 字体大小设置为24sp |
android:textColor="#00ff00" | 设置字体颜色为:"#00ff00"值 |
接下来我们通过android:text 指定TextView中显示的文本内容,现在运行程序,效果如图3.1所示。
虽然指定的文本内容正常显示了,不过我们好像没看出来TextView的宽度是和屏幕一样宽的。其实这是由于TextView中的文字默认是居左上角对齐的,虽然TextView的宽度充满了整个屏幕,可是由于文字内容不够长,所以从效果上完全看不出来。现在我们修改TextView的文字对齐方式,如下所示:
在中加入:android:gravity ="center"
语句就将字符居中了。总结一下:我们使用android:gravity
来指定文字的对齐方式,可选值有top 、bottom 、left 、right 、center 等,可以用“|”来同时指定多个值,这里我们指定的center ,效果等同于center_vertical|center_horizontal ,表示文字在垂直和水平方向都居中对齐。现在重新运行程序,效果如图3.2所示。
另外我们还可以对TextView中文字的大小和颜色进行修改,如下所示:
同样地,在中加入:android:textSize="24sp"
以及android:textColor="#00ff00"
当然TextView中还有很多其他的属性,这里就不再一一介绍了,用到的时候去查阅文档就可以了。
1.2 Buttion
Button是程序用于和用户进行交互的一个重要控件,相信你对这个控件已经非常熟悉了,因为我们在上一章用了太多次Button。它可配置的属性和TextView是差不多的,所以下标就给出一个不同的属性设置方式:
英文组合 | 中文含义 |
---|---|
android:textAllCaps=“false” | 取消字体默认大写的设置 |
我们可以在activity_main.xml中这样加入Button:
代码语言:javascript复制<Button
android:id="@ id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="button"
/>
虽然再xml配置文件中设置按键名为小写,但是最终在design中显示的却是大写的BUTTON,这是由于系统会对Button中的所有英文字母自动进行大写转换,如果这不是你想要的效果,可以使用如下配置来禁用这一默认特性:加入描述语句:android:textAllCaps="false"
接下来我们可以在MainActivity中为Button的点击事件注册一个监听器,如下所示:
代码语言:javascript复制public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 在此处添加逻辑
}
});
}
}
方式一的具体步骤:
当前活动继承AppCompatActicity类 -> 重写onCreate()方法 -> {调用引入布局方法:setContentView -> 使用findViewById方法根据R文件创建Buttion对象引用 -> Button对象调用setclickListener()方法,参数为重写了Onclick方法的匿名内部类OnClickListener对象{在此编写按键的内部执行逻辑}
这样每当点击按钮时,就会执行监听器中的onClick() 方法,我们只需要在这个方法中加入待处理的逻辑就行了。如果你不喜欢使用匿名类的方式来注册监听器,也可以使用实现接口的方式来进行注册,代码如下所示:
代码语言:javascript复制public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
// 在此处添加逻辑
break;
default:
break;
}
}
}
方式二的具体步骤:
当前活动继承AppCompatActivity 以及实现了View.OnClickListener(这是定义在View类中的公共接口) -> 重写onCreate()方法 -> {调用引入布局方法:setContentView -> 使用findViewById方法根据R文件创建Buttion对象引用 -> Button对象调用setclickListener()方法,参数为实现了View.OnClickListener接口的当前对象this } ->重写onClick方法{在此添加案件的内部执行逻辑}
这两种写法都可以实现对按钮点击事件的监听,至于使用哪一种就全凭你的喜好了。
1.3 EditText
英文组合 | 中文含义 |
---|---|
android:hint | 小提示 |
android:maxLines | 限制EditText控件的最大行数 |
EditText是程序用于和用户进行交互的另一个重要控件,它允许用户在控件里输入和编辑内容,并可以在程序中对这些内容进行处理。EditText的应用场景非常普遍,在进行发短信、发微博、聊QQ等操作时,你不得不使用EditText。那我们来看一看如何在界面上加入EditText吧,修改activity_main.xml中的代码,如下所示:
代码语言:javascript复制 <EditText
android:id="@ id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
其实看到这里,我估计你已经总结出Android控件的使用规律了,用法基本上都很相似:给控件定义一个id,再指定控件的宽度和高度,然后再适当加入一些控件特有的属性就差不多了。
所以使用XML来编写界面其实一点都不难,完全可以不用借助任何可视化工具来实现。现在重新运行一下程序,EditText就已经在界面上显示出来了,并且我们是可以在里面输入内容的
细心的你平时应该会留意到,一些做得比较人性化的软件会在输入框里显示一些提示性的文字,然后一旦用户输入了任何内容,这些提示性的文字就会消失。这种提示功能在Android里是非常容易实现的,我们甚至不需要做任何的逻辑控制,因为系统已经帮我们都处理好了。修改activity_main.xml,如下所示:
加入新的描述语句:android:hint="Type something here"
,其中hint就是暗示的意思,效果就是如下图所示:
可以看到,EditText中显示了一段提示性文本,然后当我们输入任何内容时,这段文本就会自动消失。
不过,随着输入的内容不断增多,EditText会被不断地拉长。这时由于EditText的高度指定的是wrap_content ,因此它总能包含住里面的内容,但是当输入的内容过多时,界面就会变得非常难看。我们可以使用android:maxLines 属性来解决这个问题,修改activity_main.xml,如下所示:
加入描述性语句:
android:maxLines="2"
这里通过android:maxLines 指定了EditText的最大行数为两行,这样当输入的内容超过两行时,文本就会向上滚动,而EditText则不会再继续拉伸。
我们还可以结合使用EditText与Button来完成一些功能,比如通过点击按钮来获取EditText中输入的内容。修改MainActivity中的代码,如下所示:
代码语言:javascript复制public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
editText = (EditText) findViewById(R.id.edit_text);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
String inputText = editText.getText().toString();
Toast.makeText(MainActivity.this, inputText,
Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
首先通过findViewById()
方法得到EditText的实例,然后在按钮的点击事件里调用EditText的getText()
方法获取到输入的内容,再调用toString()
方法转换成字符串,最后还是老方法,使用Toast将输入的内容显示出来。
重新运行程序,在EditText中输入一段内容,然后点击按钮,效果如下图所示。
1.4 ImageView
英文组合 | 中文含义 |
---|---|
android:src | 指定文件的源,比如说一张图片对应的源 |
imageView.setImageResource(R.drawable.img_2); | 源路径是可以通过活动中的方法修改的,那么一来可能就会导致改变显示的图片 |
ImageView是用于在界面上展示图片的一个控件,它可以让我们的程序界面变得更加丰富多彩。学习这个控件需要提前准备好一些图片,图片通常都是放在以“drawable”开头的目录下的。目前我们的项目中有一个空的drawable目录,不过由于这个目录没有指定具体的分辨率,所以一般不使用它来放置图片。这里我们在res目录下新建一个drawable-xhdpi目录,然后将事先准备好的两张图片img_1.png和img_2.png复制到该目录当中。
接下来修改activity_main.xml,如下所示,加入一下语句:
代码语言:javascript复制 <ImageView
android:id="@ id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/img_1"
/>
可以看到,这里使用android:src 属性给ImageView指定了一张图片。由于图片的宽和高都是未知的,所以将ImageView的宽和高都设定为wrap_content ,这样就**保证了不管图片的尺寸是多少,图片都可以完整地展示出来。**重新运行程序,效果如下图所示:
我们还可以在程序中通过代码动态地更改ImageView中的图片,然后修改MainActivity的代码,如下所示:
代码语言:javascript复制public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText editText;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
editText = (EditText) findViewById(R.id.edit_text);
imageView = (ImageView) findViewById(R.id.image_view);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
imageView.setImageResource(R.drawable.img_2);
break;
default:
break;
}
}
}
在按钮的点击事件里,通过调用ImageView的setImageResource()
方法将显示的图片改成img_2,现在重新运行程序,然后点击一下按钮,就可以看到ImageView中显示的图片改变了。
1.5 ProgressBar以及控件的可见性
英文组合 | 中文含义 |
---|---|
android:visibility | 控制文件的可见性,有不可见占大小、不可见不占大小、可见等分类 |
setVisibility() | 活动中控制可见性的方法,传入数据为:View.VISIBLE 、View.INVISIBLE 和View.GONE |
style | 控制进度条的格式,默认的进度条为动态的环形,可以改为拖动条 |
android:max | 用于给拖动条设置最大大小,调用活动的方法时就能改变拖动条的当前值,达到最大值时,拖动条相当于就到了100% |
ProgressBar用于在界面上显示一个进度条,表示我们的程序正在加载一些数据。它的用法也非常简单,修改activity_main.xml中的代码,如下所示:
代码语言:javascript复制<ProgressBar
android:id="@ id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
这时你可能会问,旋转的进度条表明我们的程序正在加载数据,那数据总会有加载完的时候吧?如何才能让进度条在数据加载完成时消失呢?这里我们就需要用到一个新的知识点:**Android控件的可见属性。**所有的Android控件都具有这个属性,可以通过android:visibility 进行指定,可选值有3种:visible 、invisible 和gone 。
- visible 表示控件是可见的,这个值是默认值,不指定android:visibility 时,控件都是可见的。
- invisible 表示控件不可见,但是它仍然占据着原来的位置和大小,可以理解成控件变成透明状态了。
- gone 则表示控件不仅不可见,而且不再占用任何屏幕空间。
我们还可以通过代码来设置控件的可见性,使用的是setVisibility() 方法,可以传入View.VISIBLE 、View.INVISIBLE 和View.GONE 这3种值。
代码语言:javascript复制 @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
if(imageView.getVisibility() == View.INVISIBLE){
imageView.setVisibility(View.VISIBLE);
}else{
imageView.setVisibility(View.INVISIBLE);
}
break;
default:
break;
}
}
通过以上代码就可以通过按钮点击事件来控制图片的显示或不现实,当然此处的代码实现的是不释放原来所占空间的隐藏实现方式。
另外,我们还可以给ProgressBar指定不同的样式,刚刚是圆形进度条,通过style 属性可以将它指定成水平进度条,修改activity_main.xml中的代码,如下所示:
代码语言:javascript复制style="?android:attr/progressBarStyleHorizontal"
android:max="100"
指定成水平进度条后,我们还可以通过android:max 属性给进度条设置一个最大值,然后在代码中动态地更改进度条的进度。修改MainActivity中的代码,如下所示:
代码语言:javascript复制public class MainActivity extends AppCompatActivity implements View.OnClickListener {
...
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
int progress = progressBar.getProgress();
progress = progress 10;
progressBar.setProgress(progress);
break;
default:
break;
}
}
}
1.6 AlertDialog
AlertDialog可以在当前的界面弹出一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此AlertDialog一般都是用于**提示一些非常重要的内容或者警告信息。**比如为了防止用户误删重要内容,在删除前弹出一个确认对话框。下面我们来学习一下它的用法,修改MainActivity中的代码,如下所示:
代码语言:javascript复制 @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.
this);
dialog.setTitle("This is Dialog");
dialog.setMessage("Something important.");
dialog.setCancelable(false);
dialog.setPositiveButton("OK", new DialogInterface.
OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"You clicked OK",Toast.LENGTH_SHORT).show();
}
});
dialog.setNegativeButton("Cancel", new DialogInterface.
OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"You clicked Cancel",Toast.LENGTH_SHORT).show();
}
});
dialog.show();
break;
default:
break;
}
}
代码的分析:如上点击警告栏只是在做了打印出相关Toast提示。
- 首先通过AlertDialog.Builder创建一个AlertDialog的实例
- 然后可以为这个对话框设置标题、内容、可否用Back键关闭对话框等属性
- 接下来调用setPositiveButton() 方法为对话框设置确定按钮的点击事件(对应于确定OK按键)
- 调用setNegativeButton() 方法设置取消按钮的点击事件(对应于Cancel按键)
- 最后调用show() 方法将对话框显示出来。重新运行程序
1.7 ProgressDialog
ProgressDialog和AlertDialog有点类似,都可以在界面上弹出一个对话框,都能够屏蔽掉其他控件的交互能力。不同的是,ProgressDialog会在对话框中显示一个进度条,一般用于表示当前操作比较耗时,让用户耐心地等待。它的用法和AlertDialog也比较相似,修改MainActivity中的代码,如下所示:
代码语言:javascript复制 @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
ProgressDialog progressDialog = new ProgressDialog
(MainActivity.this);
progressDialog.setTitle("This is ProgressDialog");
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(true);
progressDialog.show();
break;
default:
break;
}
}
可以看到,这里也是先构建出一个ProgressDialog 对象,然后同样可以设置标题、内容、可否取消等属性,最后也是通过调用show()
方法将ProgressDialog显示出来。重新运行程序,点击按钮后,效果如下图所示。
注意,如果在setCancelable() 中传入了false ,表示ProgressDialog是不能通过Back键取消掉的,这时你就一定要在代码中做好控制,当数据加载完成后必须要调用ProgressDialog的dismiss() 方法来关闭对话框,否则ProgressDialog将会一直存在。
好了,关于Android常用控件的使用,我要讲的就只有这么多。一节内容就想覆盖Android控件所有的相关知识不太现实,同样一口气就想学会所有Android控件的使用方法也不太现实。本节所讲的内容对于你来说只是起到了一个引导的作用,你还需要在以后的学习和工作中不断地摸索,通过查阅文档以及网上搜索的方式学习更多控件的更多用法。当然,当本书后面涉及一些我们前面没学过的控件和相关用法时,我仍然会在相应的章节做详细的讲解。