Android开发学习 -- Day5 UI开发(一)
在之前的学习中,我们只使用了最简单的布局,接下来就要学习更多关于UI开发方面的知识了。
一、如何编写程序界面
Android中有多种编写程序界面的方式可供选择。Android Studio提供了相应的可视化编辑器,允许我们使用拖放控件的方式来编写布局,并能在视图上直接修改控件属性。不过,作为初学者直接使用这种方式的话,会不利于真正地去了解界面背后的实现原理。同时,这种方式制作出的界面通常不具有良好的适配性。因此,我们在学习的过程中,直接使用xml编写布局代码。
二、常用控件的使用方法
Android里提供了大量的UI控件,合理的使用它们便可以轻松的编写出相当不错的界面。我们还在之前的项目上继续添加新功能,当然理想的情况是新建一个工程,我比较懒,直接使用之前的项目。
1、TextView
TextView可以说是Android中最简单的一个控件,它主要用户在界面上显示一段文本信息。例如:回想第一个demo中的“Hello World”。下面我们就看一看TextView的更多用法。
新建一个Activity,修改布局文件:
<LinearLayout 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"
android:orientation="vertical"
tools:context="com.johnhao.listviewdemo.Activity.FourthActivity">
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#00ff00"
android:text="This is text"
android:layout_marginTop="10dp"
android:textSize="23sp"/>
</LinearLayout>
下面详细了解一下各个属性的涵义
🀆 LinearLayout:最外面是LinearLayout,这是一种布局方式我们后面再去学习它
🀆 android:id:给当前的控件定义了一个唯一标识符
🀆 android:layout_width和android:layout_height:指定了控件的宽度和高度。Android中所有的控件都具有这两个属性,可选值一般有两种:match_parent、wrap_content、(fill_parent -- 官方不推荐使用)。match_parent表示让当前控件的大小和父布局大小一样。wrap_content表示让当前控件的大小能够刚好包住里面的内容,也就是由控件内容决定控件的大小。所以上面的代码就表示这个TextView的宽度和父布局一样,高度足够包含里面的内容
🀆 android:gravity:指定了文字的对齐方式,可选值有top、bottom、left、right、center等。这里我们用center,表示让文字居中展示
🀆 android:textColor:指定文字的颜色
🀆 android:text:指定TextView中的文本内容,为了演示需要所以这里直接hardcode了,正确的做法应该是从string.xml中引用@string/string_text
🀆 android:layout_marginTop:指定该属性所在控件距上部最近控件的最小值,这里通过设置10dp,让控件离顶部有10dp的距离
🀆 android:textSize:指定文字的大小
运行一下程序,看看我们创建的TextView控件。当然,还有很多其他的属性,这里就不再一一介绍,需要用什么属性可以通过查阅文档学习。
TextView2、Button
Button是程序用于和用户进行交互的一个重要控件,它配置的属性和TextView差不太多,下面我们添加一个Button:
...
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a button"
android:textAllCaps="false"/>
</LinearLayout>
这里应用了一个属性android:textAllCaps,如果不设置这个,那么系统会自动将所有的英文字母进行大写转换,也就是你将看到“THIS IS A BUTTON”,如果不想要这种效果,设置为false就可以禁用系统这一默认特性。
接下来我们可以在Activity中注册一个Button点击事件的监听器:
public class FourthActivity extends BaseActivity {
private TextView tv;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fourth);
setTitle("UI空间布局练习");
tv = (TextView) findViewById(R.id.text_view);
button = findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(FourthActivity.this, "You click the Button", Toast.LENGTH_SHORT).show();
}
});
}
}
这样,每当我们点击按钮式,就会执行监听器中onClick()方法,这里我们加了一个Toast提示。如果不喜欢使用匿名类的方式来注册监听器,也可以使用实现接口的方式来进行注册:
public class FourthActivity extends BaseActivity implements View.OnClickListener{
private TextView tv;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fourth);
setTitle("UI空间布局练习");
tv = (TextView) findViewById(R.id.text_view);
button = findViewById(R.id.btn);
button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn:
Toast.makeText(this, "You click the Button", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
3、EditText
EditText是程序用于和用户交互的另一个重要的控件,它允许用户在控件里输入和编辑内容,并可以在程序中对这些内容进行处理。EditText的应用场景非常普遍,在进行发信息、搜索等操作时,都不得不使用EditText。
我们继续在原有的项目上进行修改,添加如下代码:
...
<EditText
android:id="@+id/editTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入一写字符"
android:maxLines="2"/>
</LinearLayout>
android:hint:用于在输入框里显示一些提示性的文字,当输入内容后,这些提示性文字就会消失。
android:maxLines:因为我们设置的高度是wrap_content,当输入内容特别多的时候,就会把控件撑起来,显得特别难看。使用android:maxLines可以限制文本最多展示两行,当超过两行时,就会向上滚动,而EditText本身不再被拉伸。
我们还可以结合使用EditText和Button来完成一些功能,例如通过点击Button获取到EditText中的输入内容,代码如下:
public class FourthActivity extends BaseActivity implements View.OnClickListener{
private TextView tv;
private Button button;
private EditText editText;
private Button btn_geteditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fourth);
setTitle("UI空间布局练习");
tv = (TextView) findViewById(R.id.text_view);
button =(Button) findViewById(R.id.btn);
editText = (EditText) findViewById(R.id.editTextView);
btn_geteditText = (Button) findViewById(R.id.btn_getEditText);
button.setOnClickListener(this);
btn_geteditText.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn:
Toast.makeText(this, "You click the Button", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_getEditText:
String str = editText.getText().toString();
Toast.makeText(FourthActivity.this, "Text is: " + str, Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
首先通过findViewById()方法得到EditText的实例,然后在点击事件里调用EditText的getText()方法获取到输入的内容,接着调用toString()方法转换成字符串,最后通过老办法用Toast将内容展示出来。
重新运行下程序,在EditText中输入一段内容,然后点击getEditText按钮:
4、ImageView
ImageView是用于在界面上展示图片的一个控件,它可以让我们的程序界面变的更加丰富多彩。图片资源一般是放在以“drawable”开头的目录下。目前项目中有一个空的drawable目录,不过由于没drawable有指定分辨率,所以一般不用它存放图片。这里我们在res目录下新建一个drawable-hdpi目录,将准备好的图片放进去。
接下来继续修改xml文件,添加ImageView控件:
...
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/apple_pic"/>
</LinearLayout>
这里我们使用android:src属性给ImageView制定了一张图片。由于图片的宽高可能未知,因此设置为wrap_content。
此外,我们还可以在程序中动态的更改ImageView中的图案,修改Activity的代码:
public class FourthActivity extends BaseActivity implements View.OnClickListener{
private TextView tv;
private Button button;
private EditText editText;
private Button btn_geteditText;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fourth);
setTitle("UI控件布局练习");
tv = (TextView) findViewById(R.id.text_view);
button = findViewById(R.id.btn);
editText = (EditText) findViewById(R.id.editTextView);
btn_geteditText = (Button) findViewById(R.id.btn_getEditText);
imageView = findViewById(R.id.imageView);
button.setOnClickListener(this);
btn_geteditText.setOnClickListener(this);
imageView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn:
Toast.makeText(this, "You click the Button", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_getEditText:
String str = editText.getText().toString();
Toast.makeText(FourthActivity.this, "Text is: " + str, Toast.LENGTH_SHORT).show();
break;
case R.id.imageView:
imageView.setImageResource(R.drawable.banana_pic);
break;
default:
break;
}
}
}
我们给ImageView设置了一个点击事件,然后在里面通过调用ImageView的setImageResource()方法将图片改成了banana_pic,之前我们在xml中配置的是apple_pic。
5、ProgressBar
ProgressBar用于在界面上显示一个进度条,表示我们的程序正在加载一些数据。它的用法也非常简单,修改xml中的代码,添加ProgressBar控件:
...
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
重新运行程序,就能在中间看到一个转菊花,但是我们不能总让它一直转,比如数据加载完毕之后,它得消失啊。这时就需要用到一个新的知识点:Android控件的可见属性。所有的Android控件都居于这个属性,可以通过android:visibility进行指定,可选值有3种:visible、invisible和gone。
🀆 visible:表示控件可见
🀆 invisible:表示控件不可见,然仍占据着原来的位置和大小。可以理解为控件变成透明的了。
🀆 gone:表示控件不仅不可见,而且不占据任何屏幕空间。
我们可以通过代码来设置控件的可见性,使用的是setVisibility()方法,可以传入View.VISIBLE、View.INVISIBLE、View.GONE这三个值。
public class FourthActivity extends BaseActivity implements View.OnClickListener{
...
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
progressBar = (ProgressBar)findViewById(R.id.progressBar);
btn_show.setOnClickListener(this);
btn_hide.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
...
case R.id.btn_show_progressbar:
if (progressBar.getVisibility() == View.GONE){
progressBar.setVisibility(View.VISIBLE);
}
break;
case R.id.btn_hide_progressbar:
if (progressBar.getVisibility() == View.VISIBLE){
progressBar.setVisibility(View.GONE);
}
break;
...
}
}
在点击事件中,通过getVisibility()判断元素是否可见,然后对应展示或者隐藏ProgressBar。另外,我们还能给ProgressBar指定不同的样式,刚才是菊花,通过style属性可以将它设置成水平进度条。
我们再来修改一下代码:
...
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
style="?android:attr/progressBarStyleHorizontal"
android:max="100"/>
</LinearLayout>
...
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.progressBar:
int progress = progressBar.getProgress();
progress = progress + 10;
progressBar.setProgress(progress);
break;
...
xml中通过android:max给设置一个最大值,然后在ProgressBar的点击事件中动态的增加进度条的值。重新运行下程序:
progressBar.gif6、AlertDialog
AlertDialog可以在当前的界面弹出一个对话框,这个对话框是置于所有界面元素之上的,能够屏蔽掉其他控件的交互能力。因此,AlertDialog一般用于提示一些非常重要的内容或者警告信息。
我们继续修改项目的代码:
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_alret:
AlertDialog.Builder dialog = new AlertDialog.Builder(FourthActivity.this);
dialog.setTitle("警告");
dialog.setMessage("Alert dialog Demo");
dialog.setCancelable(false);
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(FourthActivity.this, "居然敢点确定", Toast.LENGTH_SHORT).show();
}
});
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(FourthActivity.this, "居然敢点取消", Toast.LENGTH_SHORT).show();
}
});
dialog.show();
break;
...
首先通过AlertDialog.Builder创建一个AlertDialog实例,然后为对话框设置标题、内容、可否取消等,接下来调用setPositiveButton()方法设置对话框的确定按钮的点击事件,调用setNegativeButton()方法设置对话框的取消按钮的点击事件,最后调用show()方法将对话框展示出来。这里还是简单让它们弹Toast提示。
重新运行程序,效果如下:
7、ProgressDialog
ProgressDialog和AlertDialog有点类似,都可以在界面上显示一个对话框,并且都能屏蔽掉其他控件的交互能力。不同的是,ProgressDialog会在对话框展示一个进度条,一般表示正在进行耗时操作,需要用户耐心等待。用法也和AlertDialog类似,代码如下:
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_progress:
ProgressDialog progressDialog = new ProgressDialog(FourthActivity.this);
progressDialog.setTitle("ProgressDialog Demo");
progressDialog.setMessage("Loading");
progressDialog.setCancelable(true);
progressDialog.show();
break;
通过ProgressDialog创建一个ProgressDialog实例,然后设置对话框的标题、内容和能够取消等,最后调用show()方法将对话框展示出来。这里需要注意的一点就是,如果设置了对话框不可取消setCancelable(false),那么就表示它不能通过按back键取消。所以需要在代码中做控制,党完成耗时操作后,必须调用ProgressDialog的dismiss()方法来将对话框取消,否则ProgressDialog将会一直存在。
关于Android常用的控件就先学习到这里,今天练习使用了7种最常用的控件的用法。
关注获取更多内容