安卓入门-第三章-安卓常用控件的使用方式

2020-02-19 11:29:38 浏览数 (1)

一、安卓常用控件的使用方式

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 。

  1. visible 表示控件是可见的,这个值是默认值,不指定android:visibility 时,控件都是可见的。
  2. invisible 表示控件不可见,但是它仍然占据着原来的位置和大小,可以理解成控件变成透明状态了。
  3. 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提示。

  1. 首先通过AlertDialog.Builder创建一个AlertDialog的实例
  2. 然后可以为这个对话框设置标题、内容、可否用Back键关闭对话框等属性
  3. 接下来调用setPositiveButton() 方法为对话框设置确定按钮的点击事件(对应于确定OK按键)
  4. 调用setNegativeButton() 方法设置取消按钮的点击事件(对应于Cancel按键)
  5. 最后调用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控件的使用方法也不太现实。本节所讲的内容对于你来说只是起到了一个引导的作用,你还需要在以后的学习和工作中不断地摸索,通过查阅文档以及网上搜索的方式学习更多控件的更多用法。当然,当本书后面涉及一些我们前面没学过的控件和相关用法时,我仍然会在相应的章节做详细的讲解。

0 人点赞