版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章Android常用UI组件在介绍了Android程序的基本框架之后,现在介绍如何构建Android的UI界面。Android提供了基本的用于构建程序UI的组件,包括:用于显示文字的TextView组件、用于显示图片的Image组件、用户显示进度情况的ProgressBar组件等。本章对Android的基础常用组件进行介绍。目录5.1基于XML的布局及组件使用入门5.2Android基本组件5.3Android容器组件5.4课后同步练习5.5AdapterView5.6ListView5.7Spinner5.8GridView5.9Android其他常用组件5.10课后同步练习5.1基于XML的布局及组件使用入门Android建议将程序界面与程序业务逻辑分离的方式来进行程序设计,其实,这不是Android的首创。在进行网页程序设计时,也采用将要显示的内容与页面的布局分离的方式:将要显示的信息保存在HTML中,而在CSS中定义信息显示的格式。下面举例说明Android基于XML的界面布局,以及如何响应对按钮的点击。这个程序首先显示一个巨大的按钮,当用户点击这个按钮时,在按钮上显示当前的日期和时间。activity_main.xml文件。<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<Buttonandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="@string/text_btn01"android:textSize="30sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>修改res/values/strings.xml的内容,在其中添加一个name为text_btn01的字符串资源定义。点击按钮时按钮的外观会发生变化,除此之外,没有其他反应。<resources><stringname="app_name">ch0501</string><stringname="text_btn01">点击</string></resources>程序需要响应用户对按钮的点击。通过实现View.OnClickListener接口来达到这个目的。View.OnClickListener是android.view.View类的一个内部接口,它定义了一个组件被点击时的响应函数:onClick()方法。修改MainActivity.java程序代码,在ID为id_btn01的按钮上监听点击事件,当按钮被点击时,对这个点击事件进行适当的响应。packagecom.example.ch0501;
importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
importjava.util.Date;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{Buttonbtn;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
btn=this.findViewById(R.id.id_btn01);//获取界面上Button(按钮)的引用btn.setOnClickListener(this);//设置按钮监听点击事件}
@OverridepublicvoidonClick(Viewv){Dated=newDate();btn.setText(d.toString());}}5.2Android基本组件Android基本组件包括Button、TextView、ImageView、EditText、CheckBox、RadioButton等。通过对这些组件的介绍,可以更好地掌握这些组件及其他组件的使用方法。Android的基础组件定义在android.widget包中。5.2.1ButtonButton组件是常用的组件。Button组件的每个XML可配置属性,均有一个与之对应的setXXX()方法。从android.widget.TextView中继承来的属性:(1)android:text设置在Button上要显示的文字。可以是一个字符串常量也可以是对一个字符串资源的引用。按照Android的规则,最好不要直接使用字符串常量,而应该使用字符串资源引用。(2)android:textColor设置显示在Button上的文字的颜色。可以是对一个颜色资源的引用,也可以是这些形式的颜色值:"#rgb"、"#argb"、"#rrggbb"或"#aarrggbb"。(3)android:textSize设置显示在Button上显示的文字尺寸大小。可以是一个常数加单位,如15px、20sp等,也可以是对单位度量资源的引用。(4)android:textStyle设置显示在Button上的文字风格,可用的值包括bold、italic、bolditalic。(5)android:typeface设置显示在Button上的文字的字体。目前Android只支持如下的字体:normal、sans、serif、monospace。从android.view.View中继承的XML配置属性。(1)android:id设置Button的ID属性以便在程序代码中可以引用该组件。(2)android:background设置Button的背景。可以是对一个mipmap/drawable资源的引用,也可以是形如"#rgb"、"#argb"、"#rrggbb"、"#aarrggbb"的颜色值。(3)android:clickable设置按钮是否可以响应点击事件。可选值包括true、false。(4)android:visibility设置按钮是否显示在屏幕上。可选值包括true、false。(5)android:padding、android:paddingTop、android:paddingBottom、android:paddingLeft、android:paddingRight设置组件的内边界,类似于HTML/CSS中的padding。(6)android:gravity设置按钮上显示的文字的对齐方式。可取值包括top、right、left、center等。5.2.2TextViewTextView用于显示一个文字到界面。显示在TextView中的字符串是不可编辑的。其实,Button组件的XML配置都是从TextView和View中继承来的,因此,TextView的属性与Button组件的XML配置属性是类似的。5.2.3ImageViewAndroid的ImageView组件用于显示图片。ImageView常用的XML配置属性包括如下内容。(1)android:maxHeight用于指定组件的最大高度。(2)android:maxWidth用于指定组件的最大宽度。(3)android:scaleType:center、centerCrop、centerInside、fitXY、……(4)android:src指定显示在组件中的图片。必须是对一个图片资源的引用。(5)android:contentDescription设定图片的描述性文字。下面举一个例子演示ImageView组件的使用。这个程序要求,当手机(模拟器)是竖屏时显示一张风景图片,横屏时显示另一张风景图片。新建名称为ch0502的Android工程,然后,按照如下操作新建mipmap-land资源目录:右击工程的res目录NewAndroidResourceDirectory。修改activity_main.xml布局文件为如下代码:<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/a02"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>5.2.4Android资源后缀可以为不同分辨率的手机制作不同尺寸的图片并放置在不同的mipmap图片资源目录下,进而可以使同一张图片在不同分辨率的手机上显示时呈现相似的视觉效果。为了支持不同的图片分辨率,可以使用的资源后缀包括:xxxhdpi、xxhdpi、xhdpi、hdpi等。其实Android支持的资源后缀远远不止这些。上一节显示图片的例子,就使用land资源后缀。land资源后缀的含义是:当手机处于风景模式,也就是横屏时,要使用的资源。所以,一旦旋转手机为风景模式,将显示位于mipmap-land资源目录下的图片。表5-1里给出了常用的Android资源后缀及其含义。提示一下,有些文献将资源后缀称为资源配置量词,不管如何称呼,它们的含义一样的。常用的Android资源后缀及其含义。类型资源后缀含义屏幕分辨率ldpi低密度屏幕分辨率,120dpi,120点每英寸mdpi中密度屏幕分辨率,160dpi,160点每英寸hdpi高密度屏幕分辨率,240dpi,240点每英寸xhdpi超高密度屏幕分辨率,320dpi,320点每英寸xxhdpi超超高密度屏幕分辨率,480dpi,480点每英寸xxxhdpi超超超高密度屏幕分辨率,640dpi,640点每英寸屏幕大小small屏幕大小至少是320*426dp。注意,这里的dp不是指屏幕的物理像素,而是指逻辑像素。dp的英文含义是densityindependentpixel,在分辨率为160dpi的屏幕上,1dp=1px,在分辨率为240dpi的屏幕上,1dp=1.5px,以此类推。normal屏幕大小至少是320*470dplarge屏幕大小至少是480*640dpxlarge屏幕大小至少是720*960dp屏幕方位port手机处于竖屏状态,即手机是被竖着(Portrait)拿的land手机处于横屏状态,即手机是被横着(Landscape)拿的API版本v26当AndroidAPI版本大于等于26时v34当AndroidAPI版本大于等于34时v36当AndroidAPI版本大于等于36时语言和地区cn中文en英文fr法文fr-rCA法文,加拿大地区5.2.5EditTextEditText是可编辑文本组件,与TextView组件类似,只是提供了编辑功能。它的XML配置属性都是从TextView及View中继承来的,如下的几个XML配置属性将会在以后的编程中被使用到。(1)android:autoText设置是否对输入的文字进行自动拼写检查。只能取值true或false。(2)android:captalize设置是否将输入的文字改为大写。只能取值true或false。(3)android:digits设置是否只能输入数字。只能取值true或false。(4)android:singleLine设置是否可以输入多行。只能取值true或false。(5)android:hint设置当输入框为空时,在输入框中显示的提示信息。(6)android:inputType设置放置在EditText组件中的文字类型。取值包括none、text、textCapCharacters、textCapWords、textUri、number等。5.2.6CheckBoxCheckBox组件就是常用的“复选框”,它继承了TextView和View组件的XML属性。该组件的常用方法如下。(1)isChecked()检查该复选框是否被勾选。(2)setChecked(Booleanchecked)设置该复选框的选中状态。(3)toggle()将复选框的状态反选。5.2.7RadioButtonRadioButton组件是单选按钮。在一般情况下,RadioButton总是与RadioGroup结合使用,使得在属于同一个组的RadioButton中只有一个可以被选中。也就是通过RadioGroup控制RadioButton的选中状态。常用的RadioGroup的方法如下。(1)check(intrb)检查指定rb的选中状态。(2)clearCheck()清除所有RadioButton的选中状态,因此,调用该方法后,没有RadioButton被选中。(3)getCheckedRadioButtonId()返回被选中的RadioButton的ID,若没有RadioButton被选中,则返回-1。5.2.7课堂同步练习编写一个简单的Android程序,程序主界面上显示一个按钮,点击这个按钮,在这个按钮上以适合中国人阅读习惯的方式显示日期和时间。例如,显示日期和时间的格式应该是:2022年03月10日10:30:17。5.3Android容器组件Android容器组件,也就是在其中放置其他组件并可以对放置在其中的组件进行布局的Android组件。常用的Android容器组件包括LinearLayout、RelativeLayout、FrameLayout、ScrollView及ConstraintLayout。在这一节,对Android的常用容器组件进行介绍。5.3.1LinearLayoutLinearLayout是线性布局组件,也是最为常用的布局组件。放置在其中的组件或者按列,或者按行的方式进行顺序布局。它包括如下常用的XML配置属性。(1)android:orientation设置LinearLayout容器布局组件的方式:按行或者按列。只能取值:horizontal、vertical。(2)android:gravity设置布局在LinearLayout容器内的组件的对齐方式。取值包括top、bottom、left、right、center、start、end等(3)其他从View中继承来的属性,包括android:backgroud、android:visibility等对布局在LinearLayout中的组件,LinearLayout提供如下这些XML配置属性,用以告知LinearLayout如何放置这些组件。这些属性及其含义如下:(1)android:layout_width和android:layout_height所有放置在LinearLayout中的组件通过android:layout_width和android:layout_height属性告知LinearLayout如何对为组件分配显示空间。它们有2个可选的值:match_parent,占满父容器的所有空间;wrap_content,将只分配能够正确显示内容所需的显示空间;一个常数值和单位,如100px,表示该组件占用100个物理像素,可用的单位包括如下:
px:物理像素,屏幕上的物理点;in:英寸,长度单位;
mm:毫米,长度单位;pt:磅,1/72英寸;
dp:与密度无关的像素,一种基于屏幕密度的抽象单位。在160点每英寸的显示器上,1dp=1px;在240点每英寸的显示器上,1dp=1.5px,以此类推;
dip:与dp相同;sp:与刻度无关的像素,与dp类似,常用于描述文字大小。(2)android:layout_gravity设置组件在容器中的布局方式。(3)android:layout_weight设置组件占用容器的空余显示空间的比例。(4)android:layout_margin、android:layout_marginTop等设置组件的外边界,类似于HTML/CSS中的margin。下面举例说明如何使用LinearLayout进行组件布局。这个程序布局一个类似注册的界面,要求输入用户名、密码,选择性别信息,然后显示两个按钮,分别表示提交和取消,当点击提交按钮时,将用户输入的信息显示在界面上。布局文件activity_main.xml:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical">
<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/register"android:textSize="30sp"android:layout_gravity="center"android:gravity="center"/>
<EditTextandroid:id="@+id/et_name"android:layout_width="match_parent"android:layout_height="48dp"android:hint="@string/name"android:layout_gravity="center"/><EditTextandroid:id="@+id/et_password"android:layout_width="match_parent"android:layout_height="48dp"android:hint="@string/password"android:inputType="textPassword"/>
<RadioGroupandroid:id="@+id/rg_gender"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:orientation="horizontal">
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/gender"/>
<RadioButtonandroid:id="@+id/radio_male"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/male"android:checked="true"/><RadioButtonandroid:id="@+id/radio_female"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/female"android:checked="false"/>
</RadioGroup>
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical">
<Buttonandroid:id="@+id/btn_ok"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/ok"/>
<Buttonandroid:id="@+id/btn_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/cancel"/></LinearLayout>
<TextViewandroid:id="@+id/tv_summary"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"/>
</LinearLayout>这段代码看是很长,其实就是一个典型的注册界面,包括用户名、密码、性别、以及两个按钮,并且使用了LinearLayout嵌套。需要说明一下,RadioGroup是LinearLayout的子类,因此,可以指定RadioGroup的orientation属性值。在组件中使用了字符串资源引用,为此,需要在res/values/string.xml文件定义字符串资源。<resources><stringname="app_name">ch0503</string>
<stringname="register">注册</string><stringname="name">请输入注册名</string><stringname="password">请输入密码</string><stringname="gender">性别:</string><stringname="male">男</string><stringname="female">女</string><stringname="ok">提交</string><stringname="cancel">取消</string></resources>现在处理按钮的点击事件。为了处理对按钮的点击事件,需要实现View.OnClickListener接口,修改MainActivity.java代码为如下内容:packagecom.example.ch0503;
importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.RadioGroup;importandroid.widget.TextView;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{Buttonok,cancel;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
ok=findViewById(R.id.btn_ok);cancel=findViewById(R.id.btn_cancel);ok.setOnClickListener(this);cancel.setOnClickListener(this);}
@OverridepublicvoidonClick(Viewv){if(v.getId()==R.id.btn_ok){EditTextet_name=findViewById(R.id.et_name);EditTextet_password=findViewById(R.id.et_password);RadioGrouprg=findViewById(R.id.rg_gender);
Stringsummary="注册信息\n"+"姓名:"+et_name.getText()+"\n"+"密码:"+et_password.getText()+"\n"+"性别:"+(rg.getCheckedRadioButtonId()==R.id.radio_male?"男":"女");TextViewtv=findViewById(R.id.tv_summary);tv.setText(summary);}else{TextViewtv=findViewById(R.id.tv_summary);tv.setText("");}}}LinearLayout布局容器为布局于其中的组件提供了android:layout_weight布局属性,这个布局属性很有意思:它可以使各个组件按指定的比例来共享LinearLayout容器的显示空间。下面举例来说明如何使用android:layout_weight布局属性。新建一个名称为ch0504的Android工程,并修改res/layout/activity_main.xml为如下内容:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity">
<TextViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="5"android:background="#448AFF"android:textSize="40sp"android:gravity="center"android:text="@string/fifty"/>
<TextViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="3"android:background="#40C4FF"android:textSize="40sp"android:gravity="center"android:text="@string/thirty"/>
<TextViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="2"android:background="#18FFFF"android:textSize="40sp"android:gravity="center"android:text="@string/twenty"/>
</LinearLayout>还需要修改res/values/strings.xml文件,在这个文件中,对布局中引用的3个字符串资源常量进行定义,内容如下:<resources><stringname="app_name">ch0504</string>
<stringname="fifty">50%</string><stringname="thirty">30%</string><stringname="twenty">20%</string>
</resources>5.3.2RelativeLayoutRelativeLayout,顾名思义,就是相对布局:一个组件相对于另一个组件的位置来构造布局。例如,将组件A布局在组件B的右下方,将组件C放置在组件D的左边等。RelativeLayout为布局在其中的组件提供了非常多的布局属性,表列出了部分常用的XML布局属性及其含义。XML布局属性含义android:layout_above定位组件到指定的组件的上方,参数为某个指定的组件的idandroid:layout_alignParentBottom如果为true值,定位组件到父容器的最下方android:layout_alignParentLeft如果为true值,定位组件到父容器的最左边android:layout_alignParentRight如果为true值,定位组件到父容器的最右边android:layout_alignParentTop如果为true值,定位组件到父容器的最上方android:layout_centerInParent如果为true值,定位组件到父容器的中央android:layout_below定位组件到指定的组件的下方,参数为某个指定的组件的id举一个例子说明RelativeLayout布局容器的使用。在AndroidStudio中新建一个名称为ch0505的工程,然后修改res/layout/activity_main.xml布局文件为如下内容:<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<TextViewandroid:id="@+id/userNameLbl"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:text="@string/username"/>
<EditTextandroid:id="@+id/userNameText"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/userNameLbl"/>
<TextViewandroid:id="@+id/pwdLbl"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/userNameText"android:text="@string/password"/>
<EditTextandroid:id="@+id/pwdText"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/pwdLbl"/>
<TextViewandroid:id="@+id/pwdCriteria"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/pwdText"android:text="@string/criteria"/>
<TextViewandroid:id="@+id/disclaimerLbl"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:text="@string/risk"/>
</RelativeLayout>再修改res/values/strings.xml文件为如下内容:<resources><stringname="app_name">ch0505</string>
<stringname="username">用户名</string><stringname="password">密码</string><stringname="criteria">密码规范</string><stringname="risk">风险</string>
</resources>5.3.3FrameLayoutFrameLayout以层叠的方式布局组件:每次只能显示其中的一个。与扑克牌类似,当叠加在一起时只能看到最上面的那张。FrameLayout为布局在其中的组件提供了一个XML配置属性:android:layout_gravity,通过这个属性,布局在FrameLayout中的组件可以指定自己在容器中的重心位置,例如,靠左、靠右、中心等。举一个例子来说明FrameLayout的应用。新建名为ch0506的工程,在程序中显示4张图片。需要先在mipmap目录下放置4张图片。然后修改res/layout/activity_main.xml文件为如下内容:<?xmlversion="1.0"encoding="utf-8"?><FrameLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<ImageViewandroid:id="@+id/id_iv01"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter"android:src="@mipmap/png0001"android:visibility="visible"/>
<ImageViewandroid:id="@+id/id_iv02"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter"android:src="@mipmap/png0002"android:visibility="gone"/>
<ImageViewandroid:id="@+id/id_iv03"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter"android:src="@mipmap/png0003"android:visibility="gone"/>
<ImageViewandroid:id="@+id/id_iv04"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter"android:src="@mipmap/png0004"android:visibility="gone"/>
</FrameLayout>在这个布局文件中,在FrameLayout中放置4个ImageView组件,并且只显示第一个ImageView组件,而将其他的ImageView组件的android:visibility属性值设为“gone”。注意,也可以将这个值设为“invisible”。gone与invisible的相同点是:它们都让组件不再显示出来;而区别在于,gone不仅不显示组件,而且使组件也不占据显示空间。现在修改MainActivity.java文件,使得ImageView组件能够响应点击事件,修改后的代码如下:packagecom.example.ch0506;
importandroid.os.Bundle;importandroid.view.View;importandroid.widget.ImageView;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{privateImageViewiv01,iv02,iv03,iv04;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
iv01=this.findViewById(R.id.id_iv01);iv01.setOnClickListener(this);iv02=this.findViewById(R.id.id_iv02);iv02.setOnClickListener(this);iv03=this.findViewById(R.id.id_iv03);iv03.setOnClickListener(this);iv04=this.findViewById(R.id.id_iv04);iv04.setOnClickListener(this);}
@OverridepublicvoidonClick(Viewv){intid=v.getId();if(id==R.id.id_iv01){iv01.setVisibility(View.GONE);iv02.setVisibility(View.VISIBLE);}elseif(id==R.id.id_iv02){iv02.setVisibility(View.GONE);iv03.setVisibility(View.VISIBLE);}elseif(id==R.id.id_iv03){iv03.setVisibility(View.GONE);iv04.setVisibility(View.VISIBLE);}else{iv04.setVisibility(View.GONE);iv01.setVisibility(View.VISIBLE);}}}5.3.4ScrollViewScrollView也是容器,顾名思义,是可滚动容器,它的主要作用是可以将超出物理屏幕的内容显示出来。ScrollView提供垂直滚动,进而可将超出物理屏幕的内容显示出来。一般情况下,可以将一个采用垂直方式布局组件的LinearLayout作为ScrollLayout容器的子组件,在LinearLayout容器中显示超出屏幕物理高度的内容。下面举例说明ScrollView的使用方法。为此新建一个名称为Ch0507的Android工程。修改res/layout/activity_main.xml布局文件,虽然代码看起来有点长,但结构很简单,就是在ScrollView中嵌套一个LinearLayout,再在这个LinearLayout中嵌套多个LinearLayout,在每个二级嵌套的LinearLayout中显示一个颜色和这个颜色的编码。activity_main.xml文件内容。<?xmlversion="1.0"encoding="utf-8"?><ScrollViewxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Viewandroid:layout_width="0dp"android:layout_height="400dp"android:layout_weight="4"android:background="#000000"/><TextViewandroid:layout_width="0dp"android:layout_height="400dp"android:layout_weight="2"android:gravity="center"android:text="@string/text_000000"/></LinearLayout>
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Viewandroid:layout_width="0dp"android:layout_height="400dp"android:layout_weight="4"android:background="#440000"/><TextViewandroid:layout_width="0dp"android:layout_height="400dp"android:layout_weight="2"android:gravity="center"android:text="@string/text_440000"/></LinearLayout>
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Viewandroid:layout_width="0dp"android:layout_height="400dp"android:layout_weight="4"android:background="#884400"/><TextViewandroid:layout_width="0dp"android:layout_height="400dp"android:layout_weight="2"android:gravity="center"android:text="@string/text_884400"/></LinearLayout>
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Viewandroid:layout_width="0dp"android:layout_height="400dp"android:layout_weight="4"android:background="#aa8844"/><TextViewandroid:layout_width="0dp"android:layout_height="400dp"android:layout_weight="2"android:gravity="center"android:text="@string/text_aa8844"/></LinearLayout></LinearLayout></ScrollView>strings.xml文件的内容如下:<resources><stringname="app_name">ch0507</string>
<stringname="text_000000">#000000</string><stringname="text_440000">#440000</string><stringname="text_884400">#884400</string><stringname="text_aa8844">#aa8844</string>
</resources>5.3.5ConstraintLayoutConstraintLayout,也就是约束布局,是在创建新的Android工程时使用的默认布局方式。ConstraintLayout采用相对位置对组件进行布局,这一点与RelativeLayout非常相似,但是,ConstraintLayout提供了更多的布局约束属性。ConstraintLayout提供的布局控制属性非常丰富,功能非常强,因此,使用起来也要非常小心。在此不对ConstraintLayout的使用做详细介绍,大家可以参考Android开发者网站自行了解学习。5.3.6课堂同步练习TextVi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第13课 有趣的传播者说课稿2025学年初中艺术·美术苏少版2024七年级下册-苏少版2024
- 驾驶员安全教育培训记录
- 唱歌 《想你的三百六十五天》说课稿2025年初中音乐七年级下册沪教版
- 初中语文2025年辩论赛说课稿
- 202天津绿色能源发展有限公司社会招聘2人备考题库附答案详解(巩固)
- 大学生职业适应2025说课稿
- 2026辽宁大连市瓦房店市教育系统自主招聘教师(第三批)8人备考题库及答案详解1套
- 2026山东第一医科大学附属省立医院(山东省立医院)招聘初级岗位人员50人备考题库附答案详解(达标题)
- 2026湖南长沙工业学院第一批公开引进博士15人备考题库附答案详解(综合题)
- 2026中国农业大学后勤保障处宿舍服务部(西区)合同聘用制C岗人员招聘4人备考题库附答案详解(完整版)
- 劳务合同书(完整版)pdf
- 村委会会议签到表
- ARCGIS中提取坡位方法
- 解除党纪处分影响期申请书
- 加油站动火作业安全管理制度
- 电力电子技术第二版张兴课后习题答案
- 人们通过竞争才会取得更大的成功
- LY/T 2103-2013根径立木材积表编制技术规程
- GB/T 9445-2015无损检测人员资格鉴定与认证
- 第五章 井间地震
- 高二期中考试后家长会课件
评论
0/150
提交评论