[Android Studio]掌握Android Studio的五种常见控件和五种常见布局_久忆凉的博客-程序员秘密_五个android常用控件

技术标签: android  Android Studio  

一、View和ViewGroup

Android体系中UI的设计采用视图层次的结构。

视图层次: 由View和ViewGroup组成。在创建UI时,开发人员不会真正去创建View或者ViewGroup,而是直接使用Android所提供的具有不同功能的控件,因此通常是看不到View或ViewGroup。

View是Android系统中最基本的组件,同时也是Android所有可视组件的父类,它完成了构建按钮、文本框、时钟等诸多控件的基本功能。此外View还有一个非常重要的子类ViewGroup。
View与ViewGroup的区别:ViewGroup能够容纳多个View作为ViewGroup的子组件,同时View也可以包含ViewGroup作为其子组件,所以View和ViewGroup是相互包容、“你中有我,我中有你”的关系。


wrap_content: 是layout_width和layout_height的属性值之一,表示和自身内容一样的长度。(由内容决定)

match_parent: 是layout_width和layout_height的属性值之一,表示和父组件一样的长度。

fill_parent: 以填充布局单元内尽可能多的空间。

margin属性: 外边距,指当前视图与其他视图间的距离,可以一次性指定上下左右四个外边距值,也可以一次性指定上下左右采用同一个边距值。

android:layout_margin="10dp"

android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"

padding属性: 内边距,指当前视图边距与其内容间的距离。赋值跟margin属性同类型。

android:layout_padding="10dp"

android:layout_paddingTop="10dp"
android:layout_paddingBottom="10dp"
android:layout_paddingLeft="10dp"
android:layout_paddingRight="10dp"

visible属性:

android:visiblity="visible"
android:visiblity="invisible"
android:visiblity="gone"

二、Android的五种常见控件

2.1 文本控件

在Android的体系结构中,TextView和EditView之间是父类和子类的关系。即EditText继承于TextView,因此EditText几乎具备TextView的所有功能,两者之间最大的不同在于:EditText能够支持用户输入,而TextView不能。

2.1.1 TextView


TextView是用于显示文字(字符串)的控件,可在代码中通过设置属性改变文字的大小、颜色、样式等功能。

注意:
颜色值组成(三原色)有三种表示方法

1.#RGB:3位16进制整数,如:#f00

2.#RRGGBB:#00ff00

3.#AARRGGBB:#ff0000ff

2.1.2 EditText


EditText是可以进行编辑操作(用于用户输入和编辑文字或字符的控件)的文本框,将用户信息传递给Android程序。还可以为EditText控件设置监听器,用来测试用户输入的内容是否合法。

2.2 按钮控件

2.2.1 Button

Android的体系结构中Button继承于TextView,而ImageButton继承于ImageView。虽然这两个控件继承于不同的控件,但是Button和ImageButton都是用于完成用户的单击按钮时的onClick事件。


Button是按钮,是用于响应用户的一系列点击事件,使程序更加流畅和完整。

点击事件(监听事件)实现方式(三种):

☞ 实现方式一:

先在layout文件中指定onClick属性:Android:onClick=“click”。然后在Activity中实现这个click方法

public void click (View v){
    
   /// 处理按钮监听事件
}

☞ 实现方式二:在Activity中添加匿名内部类

Button button = findViewById(R.id.button);


button.setOnClickListener(new View.OnClickListener(){
    
    @Override
    public void OnClick(View v){
    
   /// 处理按钮监听事件
    Log.i("匿名内部类方式","button is clicked");  
    }
});

☞ 实现方式三:

public class MainActivity implements View.OnClickListener
{
    
    //实现接口抽象方法
    public void onClick(View v){
    
    //处理按钮监听事件
    }
}

//在Activity中注册回调接口
button.setOnClickListener(this);

2.2.2 RadioButton


RadioButton为单选按钮,它需要与RadioGroup配合使用,提供两个或多个互斥的选项集。(如男、女)
RadioGroup是单选组合框,可容纳多个RadioButton,并把它们组合在一起,实现单选状态。


RadioButton按钮的实现步骤:

1.先在UI布局文件activity——main.xml中的LinearLayout标签中添加如下代码:

<RadioGroup
   android:id="@+id/radiogroup"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:orientation="horizontal">
   
    <RadioButton
   android:id="@+id/radiobutton1"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:checked="true"
   android:text="Male"/>
   <RadioButton
   android:id="@+id/radiobutton2"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="Female"/>
   
 </RadioGroup>

然后在MainActivity.java中添加onCreate函数中添加以下代码:

RadioGroup radiogroup = (RadioGroup)findViewById(R.id.radiogroup);
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener(){
    
    public void onCheckedChanged(RadioGroup group,int checkedId){
    
    switch(checkedId){
    
        case R,id.maleradio:editText.setText("男");
        break;
     }
       case R,id.femaleradio:editText.setText("女");
        break;
     }
    }
}

///另外Switch也可以用以下方法表示
if(checked==R.id.radiobutton1){
    
    textView.setText("男");
}
else{
    
     case R,id.maleradio:editText.setText("女");
        break;
     } 
}

2.2.3 CheckBox


CheckBox即多选按钮,允许用户在一组选项中进行单选和多选。用法与RadioButton类似。

CheckBox按钮的实现步骤:

1.先在UI布局文件activity——main.xml中的LinearLayout标签中添加代码(与radioBox的相似)
2.

注意:响应事件从何而来?(两个来源)

1.由系统提供的,具有特定函数名的响应函数(在OnCreate中进行定义和实现)

2.自定义响应函数名的方法来响应用户事件(放在Activity中作为一个成员函数来使用)

public void CheckboxClicked(View view){
    
    boolean checked = ((Checked)view).isChecked();
    case R.id.meat:
    if(checked){
    
        editText.setText("肉类");
    }else{
    
        ...
    }
    break;
    
    ...
}

2.3 图片控件

2.3.1 ImageView

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

///在UI布局文件activity——main.xml中添加

<ImageView 
android:id="@id/imageView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:srcCompat="@tolls:sample/backgrounds/scenic[0]"

///在MainActivity.java中添加onCreate函数中定义ImageView对象
ImageView imageView;
imageView.setImageResource(R.drawable.ic_launcher_foreground);

2.4 列表控件

2.4.1 ListView

普通列表–ListView在程序中使用频率相对比较高,很多地方都会用到这个控件,其中的内容会以一个列表的形式显示出来,但是在使用ListView时需要一个适配器(应用自带适配器、z自定义适配器)(Adapter)类显示需要的内容。当显示的内容复杂的时候系统的适配器不能满足要求了,这时可以自定义适配器,写一个类继承BaseAdapter。

2.4.2 Spinner

下拉列表–Spinner 控件也是一种列表类型的控件,可以极大地提高用户的体验性。当需要用户选择时,可以提供一个下拉列表将所有可选的项列出来,供用户选择。

2.4.3 ExpandableListView

多级列表ExpandableListView控件提供的是一个多级列表(一般是两级)。


如何实现这个两级列表呢?既然ExpandableListView采用列表的形式,它也是应该有一个适配器,但是它的适配器不是继承BaseAdapter,而是继承它独有的适配器BaseExpandableListView,同时也需要实现其中的几个方法:

BaseExpandableListView中的方法:

方法名称 参数 说明
getGroudId int groundPosition 获取在给定的位置编号
getChildId int groundPosition,int childPosition 获取给定组的孩子的ID
getGroudCount 获取第一级列表的列数
getChildrenCount int groupPosition 获取指定组中孩子的数量
getGroup int groupPosition 获取定组相关的数据
getGroupView int groupPositin,boolean isExpanded,View convertView,ViewGroup parent 获取一个显示的视图给定组
getChild int groupPosition,int childPosition 获取与孩子在给定的组相关的数据
getChildView int groupPosition,boolean isLastChild,View convertView,ViewGroup parent 获取一个视图显示在给定的组的孩子的数据

2.5 时间日期控件

2.5.1 AnalogClock(模拟时钟的显示方式)和DigitalClock

这两个控件都是通过获取系统时间展示给用户。AnalogClock是以模拟时钟的形式展示,DigitalClock是以数字时钟 的形式向用户展示。

2.5.2 DatePicker和TimePiker

用户可以通过这两个控件来设置日期和时间,DatePicker(会在Android 4.0中自动产生一个日历的功能)用于选择日期,TimePicker用于选择时间。

三、五种常用的布局

在Android程序中界面是通过布局文件设定的,在每个应用程序创建会默认包含一个主界面布局,该布局位于res/layout目录中。实际开发中每个应用程序都包含多个界面,而程序默认提供的一个主界面布局无法满足需求,因此经常会在程序中添加多个布局。

在Android中有两种方式创建布局:一种是在项目中的layout文件夹中写XML,将各个布局写在XML中;一种是在程序中通过代码去编写,这种方式一般用得比较少。

四种布局常用的单位:

1.px: 像素,即在屏幕中可以显示最小元素单位。

2.pt: 磅数,一磅等于1/72英寸,一般pt作为字体的单位来显示

3.dp(与密度无关的像素,dp与dip相同): 基于屏幕密度的抽象单位。不同设备由不同的显示效果,更具分辨率的不同来去顶控件的尺寸。

4.sp: 可伸缩像素,采用与dp相同的设计理念,推荐设置文字大小时使用。

3.1 线性布局(LinearLayout)

线性布局就是将一些控件排放在一条线上,但是有水平方向和垂直方向两种。水平和垂直方向的控制由属性android:orientation来控制,这个属性有两个值:垂直(Vertical)和水平(Horizaontal),在线性布局中还有一些比较常用的属性,如:android:gravity、android:weight(控件的权值)等。

<?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"
    android:background="#ffffff"
    >
    <LinearLayout
        android:id="@+id/LinearLayout01"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1.0"
        android:orientation="horizontal"
        >
        <Button
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:gravity="center_horizontal"
            android:text="按钮1"
            android:layout_weight="1.0"
            />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:gravity="center_horizontal"
            android:text="按钮2"
            android:layout_weight="1.0"
            />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:gravity="center_horizontal"
            android:text="按钮3"
            android:layout_weight="1.0"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="按钮4"
            android:layout_weight="1.0"
            />
        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="按钮5"
            android:layout_weight="1.0"
            />
        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="按钮6"
            android:layout_weight="1.0"
            />
    </LinearLayout>
</LinearLayout>

运行效果效果如下:

3.2 相对布局(RelativelLayout)

线对布局是指按照控件间的相对位置进行布局,也就是说我们可以选一个控件作为参照,其他的控件可以在它的上边、下边、左边及右边等。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#ffffff"
    >
   <TextView
       android:id="@+id/textView01"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="AA"
       android:textColor="#00FF00"
       android:textSize="22sp"
       android:layout_marginLeft="20px"/>

    <TextView
    android:id="@+id/textRight"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
        android:layout_toRightOf="@id/textView01"
    android:text="BB"
        android:textColor="#FF0000"
        android:textSize="22sp"
    android:layout_marginLeft="20px"/>
    <TextView
        android:id="@+id/text02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/textView01"
        android:text="CC"
        android:textColor="#00FFFF"
        android:textSize="22sp"
        android:layout_marginLeft="20px"/>
    <TextView
        android:id="@+id/textView02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/textRight"
        android:layout_toRightOf="@id/text02"
        android:text="DD"
        android:textColor="#000000"
        android:textSize="22sp"
        android:layout_marginLeft="20dip"/>

</RelativeLayout>

运行结果如下:
BB相对于AA的左边,CC相对于AA的下边边,DD相对于BB的下边且相对于CC的右边

3.3 帧布局(FrameLayout)

帧布局是五大布局中最简单的一个布局,在这个布局中,整个界面被当成一块空白备用区域,所有的子元素都不能被指定放置的位置,它们统统放于这块区域的左上角,并且后面的子元素直接覆盖在前面的子元素上,将前面的子元素部分和全部遮挡。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/FrameLayout01"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    >
    <TextView
        android:id="@+id/TextView01"
        android:layout_width="1000px"
        android:layout_height="1000px"
        android:background="#ff0000"
        android:text="文本框1"
        android:textColor="#ffffff"/>
    <TextView
        android:id="@+id/TextView02"
        android:layout_width="750px"
        android:layout_height="750px"
        android:background="#0000ff"
        />
    <TextView
        android:id="@+id/TextView03"
        android:layout_width="500px"
        android:layout_height="500px"
        android:background="#00ff00"
        />
</FrameLayout>

运行结果如下:

3.4 表格布局(TableLayout)

表格布局适用于N行N列的布局格式。一个TableLayout由许多TableRow组成,一个TableRow就代表TableLayout中的一行。TableRow的数量决定表格的行数。而表格的列数是由包含最多控件的TableRow决定。

<?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:background="#ffffff"
    android:stretchColumns="1"
    >
    <TableRow>
    <TextView
        android:layout_column = "1"
        android:padding="3dip"
        android:textColor="#000000"
        android:text="open..."/>
    <TextView
        android:gravity="right"
        android:padding="3dip"
        android:textColor="#000000"
        android:text="Ctrl_o"/>
    </TableRow>

    <View
        android:layout_height="2dip"
        android:background="#FF909090"/>

    <TableRow>
    <TextView
        android:layout_column = "1"
        android:padding="3dip"
        android:textColor="#000000"
        android:text="Save..."/>
    <TextView
        android:gravity="right"
        android:padding="3dip"
        android:textColor="#000000"
        android:text="Ctrl_s"/>
    />
    </TableRow>

    <View
        android:layout_height="2dip"
        android:background="#FF909090"/>

    <TableRow>
    <TextView
        android:layout_column = "1"
        android:padding="3dip"
        android:textColor="#000000"
        android:text="Save As..."/>
    <TextView
        android:gravity="right"
        android:padding="3dip"
        android:textColor="#000000"
        android:text="Ctrl_shift_s"/>
    </TableRow>

    <View
        android:layout_height="2dip"
        android:background="#FF909090"/>

    <TableRow>
    <TextView
        android:layout_column = "1"
        android:padding="3dip"
        android:textColor="#000000"
        android:text="X"/>
    <TextView
        android:gravity="right"
        android:padding="3dip"
        android:textColor="#000000"
        android:text="Import..."/>
    </TableRow>
</TableLayout>

运行结果如下:

3.5 绝对布局(AbsoluteLayout)

绝对布局是通过指定x、y坐标来控制每一个控件位置的。

四、参考资料

《从零开始学Android编程》

中国大学慕课网:Android应用开发

中国大学慕课网:Android基础应用开发

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Honeycomb_1/article/details/105058028

智能推荐

ubuntu下安装和卸载jdk_Nicolas Lee的博客-程序员秘密

直接下载jdk压缩包方式安装(这里只介绍jdk7的,jdk8 的原理完全一致) 分为5个步骤文章目录1.官网下载JDK2.解压缩,放到指定目录(以jdk-7u60-linux-x64.gz为例)3.修改环境变量:4.设置系统默认jdk 版本5.测试jdk1.官网下载JDK官网地址  选择相应的 .gz包下载2.解压缩,放到指定目录(以jdk-7u60-linux-x64.gz为例)创...

Python3运行报错TypeError: Object of type bytes is not JSON serializable_Y丶yearns的博客-程序员秘密

dict类型的数据(存在中文),在python2中是可以转化的,但是在python3中存在序列化问题:TypeError: Object of type bytes is not JSON serializable比较low的解决办法是:print(result[‘title’])print(result[‘title’].decode(‘utf-8’))print(result.dec...

Mysql循环插入数据_訫灬诫的博客-程序员秘密

初始化数据环境如果存在将表删除(慎用)

HDU 4286 Data Handler(12年天津网络赛-模拟)_int pop back()_nyist_xiaod的博客-程序员秘密

题目链接:Click here~~题意:给一列数字,一个左指针 L 和一个右指针 R。然后有7种操作。最后输出操作完的结果。比赛时敲了2个小时才敲出来。。。各种弱。解题思路:观察这7种操作,我们发现,除了翻转,另外6种操作都是对于 L 或 R 这两点进行的。这不就是双向队列么。于是想到用三个队列来储存所有的数据:L 左边的

NAACL| 基于标签感知的双迁移学习在医学命名实体识别中的应用_DrugAI的博客-程序员秘密

本期给大家介绍上海交通大学APEX数据和知识管理实验室俞勇教授课题组发表在NAACL的文章“Label-aware Double Transfer Learning for Cross-Specialty Medical Named Entity Recognition”。该文章提出了一种跨领域的实体识别方法——标签感知双迁移学习框架(La-DTL),使得为某一领域设计的医疗命名实体识别(NER)系统能够以最小的标注量迁移应用到另一领域。同时,该方法在非生物医学领域的实体识别任务上也取得了很好的效果。...

[益智]:13个球有一个质量不同,用天平三次找出_13个球称3次找出质量不一样的球_AngelDg的博客-程序员秘密

题目描述13个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球?答案解析将13个球分成4个、4个、5个(A组,B组,C组)先拿两个四个上去,如果平衡,则问题出在5个那组。就在5个里任拿三个设为C1C2C3,再拿三个正常的,分别放两边,若平衡就简单啦~~在剩下的两个球中拿一个与正常的球相比:如果天平不平衡,则拿出来的那个球有问题如果天平平衡,则剩下的那个球有问题若不平衡,就出现C1C2C3重,或C1C2C3轻,相当于就知道那个特别的球是比较重或者比较轻啦~

随便推点

通过数据生成器解决大文件无法一次性载入内存训练的问题_海晨威的博客-程序员秘密

通过数据生成器解决大文件无法一次性载入内存训练的问题from keras.models import Modeldef process_line(line): tmp = [float(val) for val in line.strip().split(',')] x = np.array(tmp[:-1]) y = np.array(tmp[-1:]) r...

如何下载Linux版本的mysql精讲_linux中怎么下载mysql_Generman的博客-程序员秘密

如何下载Linux版本的mysql精讲基于许多人在Windows下安装linux熟悉,但工作中的环境偏偏为LInux,于是乎此帖子予以告知:这里提供大家一个连接,可直接复制下载到本地(就是我文章最下边一行的那个版本):https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz①如...

ActiveMQ(二)——常用api、持久化、签收模式、以及常见问题_activemq 停止消费_钱多多_qdd的博客-程序员秘密

前言本章内容重点:activeMq签收模式 持久化 优先级 事务注意的点:设置签收模式解决消息重复 还有一种消息重复:p2p模式下,且当签收模式用的是事务,这时当一个消费者消费消息时,就算消息没有"message.acknowledge();"方法做应答,只要session连接不断开,另一个消费者无法重复消费这条消息。但当此消费者下线后(即此session断开后),另一个消费者会重复消费这条消息。 receiver端createsession时是true,后面的参数会被覆盖.

01_Java筑基之Java简介_一一哥Sun的博客-程序员秘密

01_Java筑基之Java简介一. Java到底是什么?Java是一门全球范围内使用最广泛的,面向对象的编程语言.Java语言具有功能强大和简单易用两个特征,它作为面向对象编程语言系列的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程.二. Java到底是干嘛的?Java技术具体的应用领域1️⃣.安卓手机App我们的安卓手机里面几乎所有的App应用...

关于Android Application类的一些认识_没有故事的A同学的博客-程序员秘密

在学习别人的代码时候,发现有一个Application类,趁机了解一下~下面是看到的几篇比较好的文章。转载过来学习学习~第一篇:Android Application的作用What is ApplicationApplication和Actovotu,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一

php表单提交到qq邮箱,DedeCMS实现自定义表单提交后发送指定QQ邮箱的方法_weixin_39572794的博客-程序员秘密

余斗在做DedeCMS自定义表单发送邮箱的教程,发现大部分都是在php文件里写死固定字段内容,这样虽然也能实现自定义表单提交后发送指定邮箱,但是很不智能,余斗想要一个我们自定义表单中有什么字段就发送什么字段的内容,这里就需要phpmailer来实现。余斗就拿QQ邮箱来说明,其他邮箱(163,雅虎等邮箱方法一样):一、登陆QQ邮箱——设置——账户,找到POP3/IMAP/SMTP,开启,现在的邮箱开...

推荐文章

热门文章

相关标签