第3章 UI开发
在过去,Android应用程序的界面主要是通过编写XML的方式来实现的。写XML的好处是,不仅能够了解界面背后的实现原理,而且编写出来的界面还可以具备很好的屏幕适配性。
不过最近几年,Google又推出了一个全新界面布局:ConstraintLayout。和以往传统的布局不同,ConstraintLayout不是非常适合通过编写XML的方式来开发界面,而是更加适合在可视化编辑器中使用拖动控件的方式来进行操作,并且Android Studio中也提供了非常完备的可视化编辑器。
虽然现在Google官方更加推荐使用ConstraintLayout来开发程序界面,但由于ConstraintLay-out的特殊性书中很难展示如何通过可视化编辑器来对界面进行动态操作。因此本书中仍然采用编写XML的传统方式开发程序界面。
3.2 常用控件的使用方法
3.2.1 TextView
新建一个UIWidgetTest项目。修改activity_main.xml中的代码,如下:
<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:gravity="center"
android:textSize="24sp"
android:textColor="#00ff00"
android:text="This is TextView" />
</LinearLayout>
TextView用于在界面上显示一段文本信息,文字默认居左上角对齐。在此仅介绍上图中基本属性,TextView中其他属性,用到的时候查阅文档即可。
- android:id ---- 给当前控件定义一个唯一标识符
- android:layout_width和android:layout_height ---- 指定控件的宽度和高度。Android中所有控件都具有这两个属性,最新可选值有2种:match_parent和wrap_content。除了使用这两个值,也可以指定固定大小,但不同手机会出现屏幕适配问题。
- android:gravity ---- 指定文字的对齐方式,可选值有top、bottom、left、right、center等。可以用“|”来同时指定多个值,这里指定center,效果等同于center_vertical | center_horizontal,表示文字在垂直和水平方向都居中对齐。
- android:textSize属性 ---- 指定文字大小,Android中字体大小用sp作为单位
- android:textColor属性 ---- 指定文字颜色。
3.2.2 Button
在activity_main.xml中加入Button:
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button"
android:textAllCaps="false"/>
由于系统会对Button中的所有英文字母自动进行大写转换,所以仅设置android:text="Button" 时,按钮实际显示“BUTTON”。如果这不是想要的效果,可以用android:textAllCaps="false"配置来禁用这一默认特性。
在MainActivity中为Button的点击事件注册一个监听器,前面用的到注册方法如下:
Button button = (Button) findViewById(R.id.button);
//使用匿名类方式注册监听器
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//此处添加逻辑
}
});
这样每当点击按钮时,就会执行监听器中的onClick()方法,只需在这个方法中加入待处理的逻辑。如果不喜欢用匿名类的方式注册监听器,也可使用实现接口的方式进行注册,代码如下:
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;
}
}
}
3.2.3 EditText
EidtText允许用户在控件里输入和编辑内容,并可以在程序中对这些内容进行处理。修改activity_main.xml中的代码,加入EditText,如下:
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Type something here"
android:maxLines="2"/>
Android控件的用法都很相似:给控件定义一个id,再指定控件的宽度和高度,然后再适当加入一些控件特有的属性。这里使用android:hint属性指定了一段提示性的文本,输入内容时,这段文本会自动消失。通过android:maxLines指定了EditText的最大行数为两行,这样当输入内容超过两行时,文本就会向上滚动。
可以结合使用EditText与Button来完成一些功能,比如通过点击按钮来获取EditText中输入的内容。修改MainActivity中的代码,如下所示:
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将输入的内容显示出来。
3.2.4 ImageView
ImageView是用于在界面上展示图片的一个控件。图片通常都是放在以“drawable”开头的目录下的,并且要带上具体的分辨率。现在最主流的手机屏幕分辨率大多是xxhdpi的,所以在res目录下新建一个drawable-xxhdpi目录,然后将事先准备好的两张图片img_1.png和img_2.png复制到该目录当中。接下来修改activity_main.xml,如下:
<ImageView
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/img_1"/>
这里使用android:src属性给ImageView指定了一张图片,由于图片的宽和高未知,所以都设定为wrap_content,以保证图片可以完整显示。还可以在程序中通过代码动态地更改ImageView中的图片,修改MainActivity的代码,如下:
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.editText);
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。
3.2.5 ProgressBar
ProgressBar用于在界面上显示一个进度条,表示程序正在加载一些数据。
修改activity_main.xml中的代码,如下:
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
重新运行程序,会看到屏幕中有一个圆形进度条正在旋转。
问题背景:旋转的进度条表明程序正在加载数据,数据总会有加载完的时候,如何才能让进度条在数据加载完成时消失?
Android控件的可见属性。所有的控件都具有这个属性,可以通过android:visibility进行指定,可选值有3种:visible、invisible和gone。
- visible ---- 表示控件是可见的,这个值是默认值。
- invisible ---- 表示控件不可见,但是它仍然占据着原来的位置和大小,即控件变成透明。
- gone ---- 表示控件不仅不可见,而且不再占用任何屏幕空间。
除此之外,还可以通过代码设置控件的可见性,使用的是setVisibility()方法,可以传入View.VISIBLE、View.INVISIBLE和View.GONE这3种值。
尝试实现,点击一下按钮让进度条消失,再点击一下按钮让进度条出现的效果。修改MainActivity中的代码,如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText editText;
private ImageView imageView;
private ProgressBar progressBar;
@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.editText);
imageView = (ImageView) findViewById(R.id.image_view);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
if (progressBar.getVisibility() == View.GONE){
progressBar.setVisibility(View.VISIBLE);
}else{
progressBar.setVisibility(View.GONE);
}
break;
default:
break;
}
}
}
在按钮点击事件中,通过getVisibility()方法来判断ProgressBar是否可见。
另外,还可以给ProgressBar指定不同的样式,上面是圆形进度条,通过style属性可以将它指定成水平进度条,修改activity_main.xml中的代码,如下:
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:max="100"/>
指定水平进度条后,还可通过android:max属性给进度条设置一个最大值,然后在代码中动态地更改进度条的进度。修改MainActivity中的代码,如下:
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;
}
}
每点击因此按钮,就获取进度条当前进度,然后唉现有的进度上加10作为更新后的进度。
3.2.6 AlterDialog
AlterDialog可以在当前的界面弹出一个对话框(类似于警告窗口),这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此AlterDialog一般都是用于提示一个非常重要的内容或者警告信息。比如为了防止用户误删重要内容,在删除前弹出一个确认对话框。修改MainActivity中的代码,如下:
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 dialogInterface, int i) {
}
});
dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
dialog.show();
break;
default:
break;
}
}
首先通过AlterDialog.Builder创建一个AlterDialog的实例,然后为这个对话框设置标题、内容、可否取消等属性,接下来调用setPositiveButton()方法为对话框设置确定按钮的点击事件,调用setNegativeButton()方法设置取消按钮的点击事件,最后调用show()方法将对话框显示出来。
3.2.7 ProgressDialog
ProgressDialog和AlterDialog有点类似,都可以在界面上弹出一个对话框,都能够屏蔽掉其他控件的交互能力。不同的是,ProgressDialog会在对话框中显示一个进度条,一般用于表示当前操作比较耗时,让用户耐心地等待。用法类似,修改MainActivity中代码,如下:
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将会一直存在。
3.3 详解3种基本布局
布局是一种可用于放置很多控件的容器,它可以按照一定的规律调整内部控件的位置,从而编写出精美的界面。当然,布局的内部出了放置控件外,也可以放置布局,通过多层布局的嵌套,能够完成一些比较复杂的界面实现。新建一个UILayoutTest项目。
3.3.1 LinearLayout
LinearLayout又称作线性布局,这个布局会将它所包含的控件在线性方向上依次排列。其中,通过android:orientation属性可以指定排列方向,可选值为vertical或horizontal。若不指定属性的值,则默认为horizontal。需要注意的是,如果LinearLayout的排列方式是horizontal,内部控件的宽度就不能指定为match_parent,因为单独一个控件会将整个水平方向占满。排列方式是vertical时同理。
- android:gravity -------------- 用于指定文字在控件中的对齐方式
- android:layout_gravity ------- 用于指定控件在布局中的对齐方式
需要注意,当排列方式是horizontal时,只有垂直方向上的对齐方式才会生效,因为水平方向上控件长度不固定,因而无法指定该方向上的对齐方式。排列方式是vertical时同理。修改新建项目UILayoutTest中activity_main.xml中的代码,如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:text="Button1"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="Button2"/>
<Button
android:id="@+id/Button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:text="Button3"/>
</LinearLayout>
android:layout_weight属性,这个属性允许使用比例的方式指定控件的大小。比如正在编写一个消息发送界面,需要一个文本编辑框和一个发送按钮,修改activity_main.xml中的代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="Type something"/>
<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Send"/>
</LinearLayout>
由于使用了android:layout_weight属性,此时控件的宽度就不应该再由android:layout_width来决定,这里指定成0dp是一种比较规范的写法。dp是Android中用于指定控件大小、间距等属性的单位。
在EditText和Button里都将android:layout_weight属性指定为1,表示EditText和Button将在水平方向平分宽度。还可以通过指定部分控件的layout_weight值来实现更好的效果。比如,仅指定EditText的android:layout_weight属性,并将Button的宽度改回wrap_content。这表示Button宽度仍会按照wrap_content计算,而EditText则会占满屏幕所有的剩余空间。
3.3.2 RelativeLayout
RelativeLayout又称作相对布局,它可以通过相对定位的方式让控件出现在布局的任何位置。修改activity_main.xml中的代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Button 1"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="Button 2"/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Button 3"/>
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:text="Button 4"/>
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:text="Button 5"/>
</RelativeLayout>
android:layout_alignParentLeft和android:alignParentTop表示Button 1和父布局的左上角对齐,其他按钮设置位置类似。上面代码中每个控件都是相对于父布局进行定位的,也可以相对于控件进行定位,修改activity_main.xml代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Button 3"/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/button3"
android:layout_toLeftOf="@+id/button3"
android:text="Button 1"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/button3"
android:layout_toRightOf="@+id/button3"
android:text="Button 2"/>
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button3"
android:layout_toLeftOf="@+id/button3"
android:text="Button 4"/>
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button3"
android:layout_toRightOf="@+id/button3"
android:text="Button 5"/>
</RelativeLayout>
android:layout_above属性可以让一个控件位于另一个控件的上方,需要为这个属性指定相对控件id的引用,这里填入@id/button3,表示让该控件位于Button 3 的上方。注意:当一个控件去引用另一个控件的id时,该控件一定要定义在引用控件的后面,不然会出现找不到id的情况。
RelativeLayout中还有另外一组相对于控件进行定位的属性,android:layout_alignLeft表示让一个控件的左边缘和另一个空间的左边缘对齐。
3.3.3 FrameLayout
FrameLayout又称作帧布局,这种布局没有方便的定位方式,所有控件都会默认摆放在布局的左上角。修改activity_main.xml中的代码:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is TextView"/>
<ImageView
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
</FrameLayout>
运行程序会看到文字和图片都是位于布局的左上角。由于ImageView是在TextView之后添加的,因此图片压在了文字的上面。除了这种默认效果外,还可以使用layout_gravity属性来指定控件在布局中的对齐方式,这和LinearLayout中的用法相似。修改activity_main.xml中的代码:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:text="This is TextView"/>
<ImageView
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:src="@mipmap/ic_launcher"/>
</FrameLayout>
指定了TextView在FrameLayout中居左对齐,指定ImageView在FrameLayout中居右对齐。总体来说,FrameLayout由于定位方式的欠缺,导致应用场景相对偏少。
3.4 创建自定义控件
控件和布局的继承结构如下图:
可以看到,所用的所有控件都是直接或间接继承自View的,所用的所有布局都是直接或间接继承自ViewGroup的。View是Android中最基本的一种UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件,因此,使用的各种控件其实就是在View的基础上又添加了各自特有的功能。而ViewGroup是一种特殊的View,它可以包含很多子View和子ViewGroup,是一个用于放置控件和布局的容器。
3.4.1 引入布局
创建一个UICustomViews项目。虽然Android系统已经给每个Activity提供了标题栏功能,但这里先不使用它,创建一个自定义的标题栏。
问题背景:一般程序中可能有很多个Activity需要这样的标题栏,如果每次都编写一遍同样的标题栏代码,会导致代码的大量重复。
引用布局的方式可以解决上述标题栏代码重复的问题。在layout目录下新建一个title.xml布局,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/title_bg">
<Button
android:id="@+id/title_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:background="@drawable/back_bg"
android:text="Back"
android:textColor="#fff"/>
<TextView
android:id="@+id/title_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center"
android:text="Title Text"
android:textColor="#fff"
android:textSize="24sp"/>
<Button
android:id="@+id/edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:background="@drawable/edit_bg"
android:text="Edit"
android:textColor="#fff"/>
</LinearLayout>
android:background用于为布局或控件指定一个背景,可以使用颜色或图片进行填充。这里提前准备了三张图片,分别作为标题栏、返回按钮和编辑按钮的背景。android:layout_margin属性可以指定控件在上下左右方向上的间距。当然也可以使用android:layout_marginLeft 或 android:layout_marginTop等属性单独指定控件在某个方向上的间距。
在程序中使用这个标题栏,修改activity_main.xml中的代码,如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/title"/>
</LinearLayout>
只需通过一行include语句将标题栏布局引入进来就可以了。最后在MainActivity中将系统自带的标题栏隐藏掉,代码如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null){
actionBar.hide();
}
}
}
调用getSupportActionBar()方法获得ActionBar的实例,然后再调用ActionBar的hide()方法将标题栏隐藏起来。关于ActionBar的更多用法会在第12章中讲解。
3.4.2 创建自定义控件
如果某些控件在不同的Activity中功能都是相同的,这种情况最好使用自定义控件。比如上述标题栏中的返回按钮,功能都是销毁当前Activity。新建TitleLayout继承自LinearLayout,让它成为自定义的标题栏控件,代码如下:
public class TitleLayout extends LinearLayout {
public TitleLayout(Context context, AttributeSet attrs){
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.title, this);
}
}
首先重写了LinearLayout中带有两个参数的构造函数,在布局中引入TitleLayout控件就会调用这个构造函数。然后在构造函数中需要对标题栏布局进行动态加载,这要借助LayoutInflater实现。通过LayoutInflater的from()方法可以构建出一个LayoutInflater对象,然后调用inflate()方法就可以动态加载一个布局文件,inflate()方法接收两个参数,第一个参数是要加载的布局文件的id,第二个参数是给加载好的布局再添加一个父布局。
自定义控件已经创建好了,然后需要再布局文件中添加这个自定义控件,修改activity_main.-xml中的代码,如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.uicustomviews.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
在添加自定义控件时,需要指明控件的完整类名,包名在这里不可以省略。运行程序,此时效果和引入布局方式的效果是一样的。下面为标题栏中的按钮注册点击事件,修改TitleLayout中的代码,如下:文章来源:https://www.toymoban.com/news/detail-824559.html
public class TitleLayout extends LinearLayout {
public TitleLayout(Context context, AttributeSet attrs){
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.title, this);
Button titleBack = (Button) findViewById(R.id.title_back);
Button titleEdit = (Button) findViewById(R.id.edit);
titleBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
((Activity) getContext()).finish();
}
});
titleEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getContext(), "You clicked Edit button",
Toast.LENGTH_SHORT).show();
}
});
}
}
这样的话,每当在一个布局中引入TitleLayout时,返回按钮和编辑按钮的点击事件就已经自动实现好了。文章来源地址https://www.toymoban.com/news/detail-824559.html
到了这里,关于第一行代码Android----阅读笔记(UI开发_1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!