在安卓开发中,布局是构建用户界面的基础,选择合适的布局能够提高应用的用户体验和性能。本文将详细介绍各种常见布局,包括线性布局、约束布局、表格布局、帧布局和相对布局,并总结UI界面交互功能的实现方法。
一、安卓开发中各种布局的理解
线性布局(LinearLayout)
特点:线性布局按照垂直或水平的方向排列子视图。可以通过orientation属性设置排列方向。
线性布局是以水平方向或垂直方向将子元素(子组件或子布局)按照线性的方式进行布局。以下为线性布局的常用属性:
属性 | 作用 |
orientation | 布局中组件的排序方式:horizontal(水平,默认)、vertical(垂直) |
gravity | 控制布局中所有的子元素的对齐方式:left、right、center等方式 |
layout_gravity | 控制某个组件在父容器中的对齐方式:left、right、center等方式 |
layout_width | 布局的宽度:wrap_content、fill_parent、match_parent |
layout_height | 布局的高度:wrap_content、fill_parent、match_parent |
特别注意
1、left和start的区别
left是绝对的左边,start是相对的,会根据不同的国家阅读习惯而改变,比如在从右向左顺序阅读的国家,start代表的就是在右边
2、layout_width和width的区别
layout_width是指定当前组件宽度与父容器之间宽度的关系。layout_width一共有三种模式:wrap_content、fill_parent、match_parent,其中fill_parent与match_parent效果一致,只是match_parent是新版本才支持的模式,都是以父容器宽度为标准,充满父容器的宽度;wrap_content则是以组件自身的宽度为标准进行显示,调整父容器的宽度来适应该组件的宽度,只有在该模式下,width属性才会生效。
适用场景:适用于需要按顺序排列一系列控件的场景,如简单的表单、列表等。
示例代码:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, World!" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me" />
</LinearLayout>
约束布局(ConstraintLayout)
特点:约束布局是安卓中功能最强大的布局之一,通过设置约束(constraints)来定义子视图之间的位置关系。
适用场景:适用于复杂的界面布局,可以替代嵌套的其他布局,优化性能。
示例代码:
<ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, World!"
app:layout_constraintTop_toBottomOf="@id/button"
app:layout_constraintStart_toStartOf="parent" />
</ConstraintLayout>
表格布局(TableLayout)
定义:
表格布局就是类似于excel中的表格,每个“单元格”的位置都是由行与列共同决定,最后组件元素放入某个“单元格”进行布局定位,以达到最终的布局效果。
表格布局常用属性的分析
属性 | 作用 |
collapseColumns | 设置需要被隐藏的列的列序号 |
shrinkColumns | 设置允许被收缩的列的列序号 |
stretchColumns | 设置允许被拉伸的列的列序号 |
layout_column | 设置跳过指定的列,组件元素从下一列开始显示 |
layout_span | 合并指定列数的单元格 |
特点:表格布局按行和列排列子视图,每个子视图位于一个表格单元格内。
适用场景:适用于需要网格结构的界面,如日历、数据表等。
示例代码:
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Row 1, Col 1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Row 1, Col 2" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Row 2, Col 1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Row 2, Col 2" />
</TableRow>
</TableLayout>
帧布局(FrameLayout)
定义:
帧布局默认情况下会将组件元素统一在屏幕的左上角进行渲染,新组件元素(后渲染的组件)总是在旧组件元素(先渲染的组件)之上进行覆盖式渲染,且布局容器的大小由其布局容器中最大的组件元素大小所决定,当我们在帧布局中创建组件元素时,就会产生类似这样的叠加效果:
属性:
属性 | 作用 |
foreground | 设置布局容器的前景图片(始终显示在所有组件最上方) |
foregroundGravity | 设置前景图片的显示位置 |
特点:帧布局按顺序堆叠子视图,后面的子视图覆盖前面的子视图。
适用场景:适用于简单的视图堆叠,如视频播放界面、图片切换等。
示例代码:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/image1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Overlay Text" />
</FrameLayout>
相对布局(RelativeLayout)
定义:
相对布局是一种可以指定某个组件相当于另外一个同级组件或当前布局父容器的位置,解决了LinearLayout布局多层嵌套的问题,使布局结构始终保持扁平化。
1、基础属性:
属性 | 作用 |
gravity | 设置容器中所有组件元素的对齐方式 |
ignoreGravity | 设置容器中某个组件元素不受gravity的影响 |
2、根据父容器的位置定位
属性 | 作用 |
layout_alignParentLeft | 向父容器的左边对齐 |
layout_alignParentRight | 向父容器的右边对齐 |
layout_alignParentTop | 向父容器的顶部对齐 |
layout_alignParentBottom | 向父容器的底部对齐 |
layout_centerInParent | 设置当前组件在父容器的中间位置 |
layout_centerHorizontal | 设置当前组件在父容器中水平居中 |
layout_alignParentLeft | 设置当前组件在父容器中垂直居中 |
特点:相对布局通过子视图之间的相对关系定位,如相对于父视图或其他子视图的位置。
适用场景:适用于需要相对定位的界面布局,但在性能上不如约束布局。
示例代码:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, World!"
android:layout_below="@id/button"
android:layout_centerHorizontal="true" />
</RelativeLayout>
二、UI界面交互功能的实现方法
按钮点击事件
实现方法:通过在布局文件中定义Button控件,并在活动中设置OnClickListener。
示例代码:
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "Button Clicked", Toast.LENGTH_SHORT).show();
}
});
列表项点击事件
实现方法:通过ListView或RecyclerView设置点击事件监听器。
示例代码:
ListView listView = findViewById(R.id.listView);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "Item " + position + " Clicked", Toast.LENGTH_SHORT).show();
}
});
滑动操作
实现方法:使用ViewPager或RecyclerView结合ItemTouchHelper实现滑动功能。
示例代码:
ViewPager viewPager = findViewById(R.id.viewPager);
// Set up ViewPager with an adapter
菜单项和对话框
实现方法:通过Menu和Dialog类实现菜单和对话框功能。
示例代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
// Handle settings action
return true;
}
return super.onOptionsItemSelected(item);
}
// Show a dialog
new AlertDialog.Builder(this)
.setTitle("Dialog Title")
.setMessage("Dialog Message")
.setPositiveButton(android.R.string.ok, null)
.show();
三、安卓常用十大控件
1. TextView(文本视图)
TextView 是 Android 中常用的控件之一,用于显示文本内容,可以设置文字的样式、字体、颜色、大小等属性。
- 属性
以下是 TextView 常用的属性:
属性名 | 含义 | 示例 |
android:id | 控件 ID | android:id=“@+id/textView” |
android:background | 设置背景颜色或背景图片 | android:background=“#F0F0F0” |
android:text | 显示的文本内容 | android:text=“Hello, world!” |
android:textSize | 字体大小 | android:textSize=“24sp” |
android:textColor | 字体颜色 | android:textColor=“#FF0000” |
android:hint | 当 TextView 显示的内容为空时,用于提示用户输入的文本 | android:hint=“请输入用户名” |
android:padding | 控件内边距 | android:padding=“10dp” |
android:lines | 文本行数,当文本行数超过指定行数时,会自动添加滚动条 | android:lines=“5” |
android:maxLines | 最大文本行数 | android:maxLines=“5” |
android:minLines | 最小文本行数 | android:minLines=“2” |
android:singleLine | 是否单行显示 | android:singleLine=“true” |
android:ellipsize | 文本超出行数时的省略方式 | android:ellipsize=“end” |
android:inputType | 输入类型 | android:inputType=“textPassword” |
android:maxLength | 最大输入长度 | android:maxLength=“12 |
- 常用方法
以下是常用的 Java 方法:
- public class TextView extends View {
- // 设置显示的文本内容
- public void setText(CharSequence text);
- // 设置字体大小
- public void setTextSize(float size);
- // 设置字体颜色
- public void setTextColor(int color);
- // 设置当 TextView 显示的内容为空时,用于提示用户输入的文本
- public void setHint(CharSequence hint);
- // 设置内边距
- public void setPadding(int left, int top, int right, int bottom);
- // 设置文本行数
- public void setLines(int lines);
- // 设置最大文本行数
- public void setMaxLines(int maxLines);
- // 设置最小文本行数
- public void setMinLines(int minLines);
- // 设置是否单行显示
- public void setSingleLine(boolean singleLine);
- // 设置文本超出行数时的省略方式
- public void setEllipsize(TextUtils.TruncateAt where);
- // 设置输入类型
- public void setInputType(int type);
- // 设置最大输入长度
- public void setMaxLength(int maxLength);
- // 设置软键盘操作选项
- public void setImeOptions(int imeOptions);
- // 设置是否可用
- public void setEnabled(boolean enabled);
- // 设置是否可点击
- public void setClickable(boolean clickable);
- // 设置是否可聚焦
- public void setFocusable(boolean focusable);
- // 当控件处于触摸模式时,设置是否可聚焦
- public void setFocusableInTouchMode(boolean focusableInTouchMode);
- // 设置需要自动链接的类型,如电话号码、网址、电子邮件等
- public void setAutoLinkMask(int mask);
- // 图文混排时,设置文字与图片之间的间隔
- public void setCompoundDrawablePadding(int padding);
- // 在文本四周添加图标
- public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom);
- }
2. EditText(编辑框)
EditText 继承自 TextView,是 Android 中常用的控件之一,用于输入文本内容,可以设置文字的样式、字体、颜色、大小等属性。
- 属性
以下 EditText 常用的属性:
属性名 | 含义 | 示例 |
android:id | 控件 ID | android:id=“@+id/editText” |
android:background | 设置背景颜色或背景图片 | android:background=“#F0F0F0” |
android:text | 显示的文本内容,若设置了 hint 属性,则显示的是 hint 内容,否则显示的是 text 内容 | android:text=“请输入用户名” |
android:textSize | 字体大小 | android:textSize=“18sp” |
android:textColor | 字体颜色 | android:textColor=“#000000” |
android:hint | 当 EditText 显示的内容为空时,用于提示用户输入的文本 | android:hint=“请输入用户名” |
android:padding | 控件内边距 | android:padding=“10dp” |
android:lines | 文本行数,当文本行数超过指定行数时,会自动添加滚动条 | android:lines=“3” |
android:maxLines | 最大文本行数 | android:maxLines=“5” |
android:minLines | 最小文本行数 | android:minLines=“2” |
android:singleLine | 是否单行显示 | android:singleLine=“true” |
android:ellipsize | 文本超出行数时的省略方式 | android:ellipsize=“end” |
android:inputType | 输入类型,如数字、电话号码、密码等 | android:inputType=“textPassword” |
android:maxLength | 最大输入长度 | android:maxLength=“12” |
- 常用的方法:
以下是常用的java方法
- public class EditText extends TextView {
- // 获取 EditText 中的文本内容
- public Editable getText();
- // 设置 EditText 中的文本内容
- public void setText(CharSequence text);
- // 设置字体大小
- public void setTextSize(float size);
- // 设置字体颜色
- public void setTextColor(int color);
- // 设置当 EditText 显示的内容为空时,用于提示用户输入的文本
- public void setHint(CharSequence hint);
- // 设置内边距
- public void setPadding(int left, int top, int right, int bottom);
- // 设置文本行数
- public void setLines(int lines);
- // 设置最大文本行数
- public void setMaxLines(int maxLines);
- // 设置最小文本行数
- public void setMinLines(int minLines);
- // 设置是否单行显示
- public void setSingleLine(boolean singleLine);
- // 设置文本超出行数时的省略方式
- public void setEllipsize(TextUtils.TruncateAt where);
- // 设置输入类型
- public void setInputType(int type);
- // 设置最大输入长度
- public void setMaxLength(int maxLength);
- // 设置软键盘操作选项
- public void setImeOptions(int imeOptions);
- // 设置是否可用
- public void setEnabled(boolean enabled);
- // 判断是否可编辑
- public boolean onCheckIsTextEditor();
- // 设置是否可编辑
- public void setEditable(boolean editable);
- // 设置是否可点击
- public void setClickable(boolean clickable);
- // 设置是否可聚焦
- public void setFocusable(boolean focusable);
- // 当控件处于触摸模式时,设置是否可聚焦
- public void setFocusableInTouchMode(boolean focusableInTouchMode);
- // 设置需要自动链接的类型,如电话号码、网址、电子邮件等
- public void setAutoLinkMask(int mask);
- // 图文混排时,设置文字与图片之间的间隔
- public void setCompoundDrawablePadding(int padding);
- // 在文本四周添加图标
- public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom);
- }
3. Button(按钮)
Button 是 Android 中常用的控件之一,用于触发事件,可以设置按钮的样式、字体、颜色、大小等属性。
- 属性
以下是 Button 常用的属性:
属性名 | 含义 | 示例 |
android:id | 控件 ID | android:id=“@+id/button” |
android:text | 显示的文本内容 | android:text=“登录” |
android:drawableLeft | 在文本左侧添加一个图标 | android:drawableLeft=“@drawable/icon” |
android:drawableRight | 在文本右侧添加一个图标 | android:drawableRight=“@drawable/icon” |
android:padding | 控件内边距 | android:padding=“10dp” |
android:textSize | 字体大小 | android:textSize=“18sp” |
android:textColor | 字体颜色 | android:textColor=“#000000” |
android:background | 设置背景颜色或背景图片 | android:background=“#F0F0F0” |
android:enabled | 是否可用 | android:enabled=“false” |
android:clickable | 是否可点击 | android:clickable=“true” |
- 常用方法
以下是常用的 Java 方法:
- public class Button extends TextView {
- // 获取 Button 中的文本内容
- public CharSequence getText();
- // 设置 Button 的文本内容
- public void setText(CharSequence text);
- // 设置背景颜色或背景图片
- public void setBackground(Drawable background);
- // 使 Button 可用/不可用
- public void setEnabled(boolean enabled);
- // 设置按钮内边距
- public void setPadding(int left, int top, int right, int bottom);
- // 设置字体大小
- public void setTextSize(float size);
- // 设置字体颜色
- public void setTextColor(int color);
- // 在文本左侧添加一个图标
- public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom);
- // 是否可聚焦
- public void setFocusable(boolean focusable);
- // 是否可点击
- public void setClickable(boolean clickable);
- // 设置可视状态改变监听器
- public void setOnVisibilityChangedListener(OnVisibilityChangedListener listener);
- // 取消可视状态改变监听器
- public void unsetOnVisibilityChangedListener();
- }
4. ImageView(图像视图)
ImageView 是 Android 中常用的控件之一,用于显示图片,可以设置图片的源、大小、缩放类型等属性
- 属性
以下是 ImageView 常用的属性:
属性名 | 含义 | 示例 |
android:id | 控件 ID | android:id=“@+id/imageView” |
android:src | 图片的源文件路径 | android:src=“@drawable/image” |
android:scaleType | 缩放类型 | android:scaleType=“centerCrop” |
android:adjustViewBounds | 调整 View 边界以适应其内容 | android:adjustViewBounds=“true” |
android:maxWidth | 最大宽度 | android:maxWidth=“200dp” |
android:maxHeight | 最大高度 | android:maxHeight=“200dp” |
android:layout_width | 布局宽度 | android:layout_width=“match_parent” |
android:layout_height | 布局高度 | android:layout_height=“wrap_content” |
- 常用方法
以下是常用的 Java 方法:
- public class ImageView extends View {
- // 获取 ImageView 中显示的图片
- public Drawable getDrawable();
- // 设置显示的图片
- public void setImageDrawable(Drawable drawable);
- // 设置显示的位图
- public void setImageBitmap(Bitmap bm);
- // 获取 ImageView 的缩放类型
- public ScaleType getScaleType();
- // 设置 ImageView 的缩放类型
- public void setScaleType(ScaleType scaleType);
- // 获取 ImageView 的最大宽度
- public int getMaxWidth();
- // 设置 ImageView 的最大宽度
- public void setMaxWidth(int maxWidth);
- // 获取 ImageView 的最大高度
- public int getMaxHeight();
- // 设置 ImageView 的最大高度
- public void setMaxHeight(int maxHeight);
- // 是否调整 View 边界以适应其内容
- public boolean getAdjustViewBounds();
- // 设置是否调整 View 边界以适应其内容
- public void setAdjustViewBounds(boolean adjustViewBounds);
- }
5. CheckBox(复选框)
CheckBox 是 Android 中常用的控件之一,用于表示二选一的选择状态。
以下是 CheckBox 常用的属性:
属性名 | 含义 | 示例 |
android:id | 控件 ID | android:id=“@+id/checkBox” |
android:text | 文本内容 | android:text=“选项 A” |
android:checked | 是否选中 | android:checked=“true” |
android:button | 用于选中状态显示的按钮图标 | android:button=“@drawable/checked_button” |
- 常用方法
以下是常用的 Java 方法:
- public class CheckBox extends CompoundButton {
- // 判断 CheckBox 是否选中
- public boolean isChecked();
- // 设置 CheckBox 是否选中
- public void setChecked(boolean checked);
- // 切换 CheckBox 状态
- public void toggle();
- }
6. RadioButton(单选按钮)
RadioButton 是 Android 中常用的控件之一,用于表示多选一的选择状态。
以下是 RadioButton 常用的属性:
属性名 | 含义 | 示例 |
android:id | 控件 ID | android:id=“@+id/radioButton” |
android:text | 文本内容 | android:text=“选项 A” |
android:checked | 是否选中 | android:checked=“true” |
android:button | 用于选中状态显示的按钮图标 | android:button=“@drawable/checked_button” |
- 常用方法
以下是常用的 Java 方法:
- public class RadioButton extends CompoundButton {
- // 判断 RadioButton 是否选中
- public boolean isChecked();
- // 设置 RadioButton 是否选中
- public void setChecked(boolean checked);
- // 切换 RadioButton 状态
- public void toggle();
- }
7. Spinner(下拉框)
Spinner 是 Android 中常用的控件之一,用于实现下拉列表的功能。
以下是 Spinner 常用的属性:
属性名 | 含义 | 示例 |
android:id | 控件 ID | android:id=“@+id/spinner” |
android:entries | 列表项文本内容,可以是静态或动态数组 | android:entries=“@array/my_array” |
android:prompt | 显示在 Spinner 上方的提示性文本 | android:prompt=“请选择一个选项” |
android:background | 在 Spinner 没有展开时显示的背景 | android:background=“@drawable/spinner_bg” |
- 常用方法
以下是常用的 Java 方法:
- public class Spinner extends AbsSpinner implements AdapterView {
- // 获取 Spinner 中当前选择的项
- public Object getSelectedItem();
- // 设置 Spinner 的数据源
- public void setAdapter(SpinnerAdapter adapter);
- // 添加子项
- public void addView(View child, ViewGroup.LayoutParams params);
- }
8. ListView(列表视图)
ListView 是 Android 中常用的控件之一,用于实现列表视图。
以下是 ListView 常用的属性:
属性名 | 含义 | 示例 |
android:id | 控件 ID | android:id=“@+id/listView” |
android:divider | 列表项之间的分割线 | android:divider=“@color/divider” |
android:dividerHeight | 分割线高度 | android:dividerHeight=“2dp” |
android:listSelector | 点击时的背景效果 | android:listSelector=“@drawable/item_bg” |
- 常用方法
以下是常用的 Java 方法:
- public class ListView extends AbsListView {
- // 获取列表项数目
- public int getCount();
- // 获取指定位置的列表项
- public Object getItem(int position);
- // 获取指定位置的列表项 ID
- public long getItemId(int position);
- // 设置数据源和适配器
- public void setAdapter(ListAdapter adapter);
- // 设置选项单击事件监听器
- public void setOnItemClickListener(AdapterView.OnItemClickListener listener);
- // 添加列表项
- public void addView(View child, ViewGroup.LayoutParams params);
- }
9. ProgressBar(进度条)
ProgressBar 是 Android 中常用的控件之一,用于显示任务的进度。
以下是 ProgressBar 常用的属性:
属性名 | 含义 | 示例 |
android:id | 控件 ID | android:id=“@+id/progressBar” |
android:indeterminate | 是否为不确定模式,即转动圆圈 | android:indeterminate=“true” |
android:max | 进度条的最大值 | android:max=“100” |
android:progress | 当前进度 | android:progress=“50” |
android:progressDrawable | 进度条的背景(未填充部分) | android:progressDrawable=“@drawable/progress_bg” |
android:secondaryProgress | 第二进度(一般用于双向进度条) | android:secondaryProgress=“25” |
- 常用方法
以下是常用的 Java 方法:
- public class ProgressBar extends View {
- // 获取进度条的最大值
- public int getMax();
- // 设置进度条的最大值
- public void setMax(int max);
- // 获取进度条当前的进度
- public int getProgress();
- // 设置进度条当前的进度
- public void setProgress(int progress);
- // 判断进度条是否为不确定模式
- public boolean isIndeterminate();
- // 设置进度条是否为不确定模式
- public void setIndeterminate(boolean indeterminate);
- }
10. Switch(开关按钮)
Switch 是 Android 中常用的控件之一,用于实现开关按钮。
以下是 Switch 常用的属性:
属性名 | 含义 | 示例 |
android:id | 控件 ID | android:id=“@+id/switchButton” |
android:checked | 开关状态(true 表示开启,false 表示关闭) | android:checked=“true” |
android:textOff | 关闭状态时的文本 | android:textOff=“关” |
android:textOn | 开启状态时的文本 | android:textOn=“开” |
- 常用方法
以下是常用的 Java 方法:
- public class Switch extends CompoundButton {
- // 获取开关状态
- public boolean isChecked();
- // 设置开关状态
- public void setChecked(boolean checked);
- // 切换开关状态(即改变当前的状态)
- public void toggle();
- }
四、活动(Activity)与intent
4.1 活动(activity)是什么?
Activity活动存在于android中,是所有程序的根本,流程都运行在Activity之中,Activity是Android当中最基本的模块之一。主要用于和用户进行交互。
4.2 intent在活动之间穿梭
intent为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。一般可被用于启动活动、启动服务以及发送广播等场景。
大致可以把intent分为两种:显示intent和隐式intent。
4.2.1 显示intent
Intent有多个构造函数的重载,其中一个是intent(context packagecontext, class<?>cls)。
这个构造函数接收两个参数,第一个参数context:要求提供一个启动活动的上下文;第二个参数class:想启动的目标活动。
Activity类提供了一个**startactivity()**方法来给我们使用intent,这个方法是专门用于启动活动的,其接收一个intent参数。
语法:
- Intent intent=new Intent(MainActivity.this,想调用其他活动的.class);
- startActivity(intent);
像这种“意图”非常明显想去到哪个活动的方式称之为显示intent。
4.2.2 隐式intent
相比于显示intent,隐式则不明显,它并不明确指出我们想要启动哪个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个intent,并帮我们找出合适的活动去启动。
合适的活动简单来说就是可以响应我们这个隐式intent的活动。
实例:
androidmanifest.xml文件在要跳转的活动编写
- <intent-filter>
- <action android:name="android.intent.action.jizhenghuod" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
Mainactivity文件
- Intent intent=new Intent("android.intent.action.jizhenghuod");
- startActivity(intent);
Action指明当前活动可以响应对应的name,category则包含一些附加信息,更精确地指明了当前的活动能够响应的intent还可能带有category。
每个intent只能指定一个action,但却能指定多个category。
4.2.3 隐式intent更多用法
隐式intent不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使的android多个应用程序之间的功能共享成为可能。
Intent当中有一个方法setData( ),接收URI对象,主要用于指定当前的intent正在操作的数据,这些数据通常都是以字符串的形式传入到uri.parse( )方法中解析产生的。
实例(调用系统浏览器):
- Intent intent=new Intent(Intent.ACTION_VIEW);
- intent.setData(Uri.parse("http://www.vkxx.top"));
- startActivity(intent);
首先指定了intent的action为Intent.ACTION_VIEW,是一个android系统内置的动作,其常量值为android.intent.action.VIEW。
与此对应,我们可以在androidmanifest.xml中的< intent-filter>中配置一个< data>,用于更精确地指定当前活动能够响应什么类型的数据。
< data>主要可以配置以下内容:
android:scheme:用于指定数据的协议部分,如实例的http。
android:host:用于指定数据的主机名部分,如实例的www.vkxx.top。
android:port:用于指定数据的端口部分,紧随在主机名后;如实例的80。
android:path:用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容,如实例的www.vkxx.top/post.1。
android:mimeType:用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
只有< data>中指定的内容和intent中携带的data完全一样时,当前活动才能够响应该intent;不过一般在< data>中都可以指定过多的内容。
刚才我们的实例只需要指定android:scheme为http,就可以响应所有的http协议的intent。
除了http协议外,也可以指定其他协议,比如geo表示显示地理位置,tel表示拨打电话。
实例(调用系统电话):
- Intent intent=new Intent(Intent.ACTION_CALL);
- intent.setData(Uri.parse("tel:1008611"));
- startActivity(intent);
其中,Intent.ACTION_CALL是一个android系统的内置动作,data部分指定链协议是tel。
4.3 intent传递数据给下一个活动
Intent除了可以启动活动外,还可以在启动活动时传递数据给下一个活动。
Intent为传递数据提供了一系列putExtra()方法的重载,可以将传递的数据暂存在intent中,启动下一个活动后,把这些数据从intent中取出即可。
实例:
在第一个活动的按钮点击事件中添加代码:
- String data="实现数据传输";
- Intent intent=new Intent(MainActivity.this,Main2Activity.class);
- intent.putExtra("语句",data);
- startActivity(intent);
- //使用putExtra()方法传递一个字符串,
- // putExtra()方法接收两个参数,第一个参数是键,用于从intent中取值;
- // 第二个参数是键值,为真正传递的数据。
在下一个活动中取出传递的数据:
- Intent intent=getIntent();
- String data=intent.getStringExtra("语句");
- Log.d("活动接收到数据:",data);
- // getIntent()方法获取用于启动当前活动的intent,
- // 调用getStringExtra()方法获取传递字符串的数据。
- // 整型数据则用getIntExtra()方法,以此类推。
4.4 intent返回数据给上一个活动
Intent可以传递数据当然也可以返回数据。不同的是,返回到上一个活动只需要按一下手机的back键就可以,并没有一个用于启动活动intent来传递数据。
Activity(活动)中有一个** startActivityForRester() **方法也是用于启动活动的,这个方法会在活动销毁时返回一个结果给上一个活动,这个方法是最好用于返回。
实例:
在第一个活动按钮的点击事件添加代码:
- Intent intent=new Intent(MainActivity.this,Main2Activity.class);
- startActivityForResult(intent,1);
- // 用startActivityForResult()方法启动第二个活动,
- // 请求码只要是一个唯一值即可,这里传入1。
在第二个活动按钮的点击事件(返回数据)添加代码:
- Intent intent=new Intent();
- intent.putExtra("返回语句","返回的数据成功");
- setResult(RESULT_OK,intent);
- finish();
- // 创建了intent,用于传递数据,没有指定任何活动。
- // 将传递的数据存放在intent中,调用setResult()方法,专门用于返回数据给上一个活动。
- // setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果
- // (一般只使用RESULT_OK或RESULT_CANCELED两个值);
- //
- // 第二个参数则把带有数据的intent传递回去,
- // 调用finish()方法销毁当前活动。
当返回上一个活动时,当前活动被销毁后会调用上一个活动的onActivityResult()方法,需要在上一个活动中重写方法得到返回的数据。
- @Override
- protected void onActivityResult(int requestCode1, int resultCode5, Intent data) {
- switch (requestCode1){
- case 1:
- if (resultCode5==RESULT_OK){
- String redata=data.getStringExtra("返回语句");
- Log.d("第一个活动得到数据:",redata);
- }
- break;
- default:
- }
- // onActivityResult()方法有三个参数,第一个参数requestCode1,即在启动活动时传入的请求码(1)。
- // 第二个参数resultCode5,即在返回数据时传入的处理结果(RESULT_OK)。
- // 第三个参数data,即携带着返回数据的intent。
- // 在一个活动中可能调用startActivityForResult()方法启动不同的活动,
- // 每个活动返回的数据都会回调到onActivityResult()方法中,
- // 所以在onActivityResult()方法中要检查requestCode1的值来判断数据来源。
在第二个活动如果用户表示通过点击按钮返回到上一个活动,而是通过按下手机的back键,数据是没有办法传输的,需要我们在第二个活动中重写onBackPressed()方法来解决:
- @Override
- public void onBackPressed() {
- Intent intent=new Intent();
- intent.putExtra("返回语句","back键数据返回");
- setResult(RESULT_OK,intent);
- finish();
- }
五、安卓高级开发控件
1.ListView 列表
ListView是最为常用的控件之一,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。下图是一个每项数据只有一行文本的ListView效果图,对于这类单一数据,用ArrayAdapter加载数据再合适不过,接下来一起学习一下。
布局界面只需要一个ListView,设置好宽高和id就够了。另外,还常用属性android:divider设置列表分割线的颜色,如透明色#00000000.
在MainActivity用id找到布局中的ListView之后,就是加载适配器的过程了:
可以看到使用过程无非三个步骤:数据源准备->适配器加载数据源->控件加载适配器,在关键的第二步对ArrayAdapter初始化中,提供的三个参数完成了在哪里显示、每一项数据如何显示(这里直接使用安卓提供好一个布局)、显示哪些数据及有多少项这些任务,再set到ListView上,就实现了一开始看到的界面效果。所以ListView只负责加载和管理视图,其他显示内容都是交给Adapter去做的。
当然ListView的每一项Item都是可以被监听的,监听器是OnItemClickListener,其中返回的参数position表示被点击的某项在整个List中的位置,从0起算,这样就能用ListView的getItemAtPosition()方法获取到被点击项的内容:
当点击第一项“wifi”时效果如下:
接下来再看一个页面效果:
在这个ListView能看到每个Item不再是简单的一行,有文字也有图片,这种格式复杂的数据就要用到SimpleAdapter了,还是在main.xml里准备好ListView控件,再回到MainActivity来学习如何用之前学会的三步骤来加载SimpleAdapter吧!
第一步准备数据源,可以看到数据源dataList是一个特定的泛型集合,这里String代表文字,Object代表图片,然后调用getData()初始化dataList。
每一个Map对应一项Item,为了方便用for循环让每个Item里图标都一样,文字内容递增就可以,然后添加到dataList,这样就完成一个有20项Item的List。这里注意Map键值对里的键名,后面会需要。
第二步适配器加载数据源,在此之前,需要给列表每一项做个布局item.xml,这个不难理解,因为在ArrayAdpter例子里我们直接使用系统提供的布局而已。注意要给出TextView和ImageView的id,马上就会用到。
现在又到了关键一步,SimpleAdapter初始化比较复杂,需要用到五个参数,前三个容易理解,后两个就是之前需要留心的两个要点。这一步实现了控件与数据的一一绑定。最后一步加载适配器就大功告成了!
现在再介绍ListView上常用的监听器OnScrollListener,用于监听滚动变化,当用户拉到列表最底下的时候可帮助视图在滚动中加载数据。现在为列表设置监听器listView.setOnScrollListener(this),并实现onScrollStateChanged ()、onScroll()方法。
这里重写第一个方法,能看到事件会返回一个scrollState,它有三个状态值,下图打印出详细描述。因为需要在视图一直滑动到底端给出新的Item,为dataList增添新的map之后,要用到adpter非常关键的方法notifyDataSetChanged()通知适配器数据发生了变化要重新加载数据,这再次印证之前所说数据的显示是适配器的工作而不是列表。
效果如下,可以看到当用户看完20项继续向下拖时就会有源源不断的新内容更新上来。
学完这两个常用适配器使用和适用情况之后,对比可看出ArrayAdapter使用起来明显简单许多,思考一个问题,ArrayAdapter的第二个参数如果不用系统提供的列表项布局而是自定义布局,是否也能做到图文并存的效果呢?答案是肯定的,只不过需要自定义一个适配器继承ArrayAdapter并重写一些方法了。下面就来学习如何定制一个ListView界面吧!
这次做一个更好看的界面,准备好小动物的图片就可以开始大展身手了!
回忆一下实例化一个ArrayAdapter时需要的三个参数,其中列表项布局以及适配器的适配类型都是要重新考虑的。那么先就从这开始准备吧!
每个Item都是由左边一张图片和右边一行文本组成的,下面代码中需要解释的是使用tools:的属性在我们预览能看到效果但不会出现在运行后的布局,方便我们提前看效果又不至于影响后续工作。
接着需要准备一个实体类Animal作为适配器的适配类型,这个类里提供动物图片和名称两个属性、用来初始化属性的构造方法以及对应的get方法即可。
2.Spinner 下拉列表
与ListView类似的,每个下拉列表项对应一个Item,列表项内容一般是文字,用ArrayAdapter就能做到,触类旁通,相信做一个下图所示的下拉列表已经难不倒你了!
选择系统提供的一个布局作为Spinnner的菜单样式,注意是设置在适配器上,这里给Spinner安装监听器是OnItemSelectListener,用适配器和列表都可以定位到某Item,完成后效果如下:
3.GridView 网格视图
从名字中能看出来GridView的特点,它使得每个Item以网格的形式展现,除此之外使用方式和ListView非常相似。下面准备用SimpleAdapter做一个这样的Demo:
GirdView本身还有些常用的属性: android:verticalSpacing(两列之间的间距),android:horizontalSpacing(两行之间的间距), android:numColumns(每行显示多少列,选值为auto_fit表示自动适应展示几列)。
接下来就是GridView绑定SimpleAdapter的过程了,不再细说,需要强调这里把图标和文字分别放在两个数组中且一一对应以便能通过循环得到数据源dataList。监听器是OnItemClickListener。
最后为了界面美观,在注册该活动时候设置theme是Black且NoTitleBar,注意被设置成android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"的活动一定继承的是android.app包下Activity,如果是V7兼容包下的AppCompatActivity会导致程序崩溃无法打开。点击运行来看看是不是达到上面的效果了呢?
其实除了这两个常用Adatper,还有一些Adapter也实用,下面通过ViewPager控件再来认识一个Adapter。
4.ViewPager 视图滑动切换工具
ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的视图(View、Fragment都可以),很多APP都用到这个功能,可见其重要程度,因此想用这点篇幅详解ViewPager是完全不够的,这里就仅仅给大家介绍用来帮助ViewPager管理View数据源的适配器PagerAdapter,感受一下风格各样的适配器。
首先在布局里导入v4包两个控件,其中PagerTabStrip是ViewPager子标签,包含在ViewPager里,这里用它作标题。
由于PagerAdapter是抽象类,使用时需要自定义子类。初始化时让这个适配器获取到两个数据源List:页卡List和标题List,之后重写几个方法更好的完善这个适配器的功能。
接着三步骤,在主活动准备好两个List,这里用View.inflate ()方法将布局转化成View对象,数据加载到自定义适配器上,adapter加载到ViewPager即可,又给ViewPager设置监听器OnPageChangeListener监听页卡是否发生变化。另外,我们还获取到控件PagerTabStrip去给标题做些美化工作。
最后效果如图,手指左右滑动就可以实现页面切换了。
其实所有这些Adapter都是从父类BaseAdapter扩展而来的,也就是说我们也可以根据自己的需要自定义一个Adapter继承BaseAdapter,然后具体实现下面4个方法:
由于adapter中含有要显示的数据集合,数据集合中元素个数即可被展示的View个数,每个数据的获取、每个Item View的样式都由adapter控制,每个position位置上数据都绑定到Item View上,这样数据和视图也就结合在一起了
六、学习过程总结与反思
在学习安卓开发的过程中,UI界面交互功能的实现方法是一个重要的内容。通过实际案例的学习和练习,我掌握了按钮点击、列表项点击、滑动操作以及菜单和对话框的实现方法。同时,在项目实践中不断遇到新的挑战和问题,通过查阅官方文档、参与社区讨论以及观看教学视频等方式,不断提升自己的技能水平。
持续改进措施有以下几点:
查阅官方文档:安卓官方文档提供了详尽的API说明和示例代码,是学习和解决问题的权威资源。
参与讨论:加入安卓开发者社区,通过论坛、微信群、QQ群等途径,与其他开发者交流经验和解决方案。
实战项目:通过参与实际项目开发,将所学知识应用到实践中,积累开发经验。
通过上述方法,我在安卓开发方面取得了长足的进步,并且能够更好地应对复杂的UI交互需求。未来,我将继续保持学习的热情,不断探索和掌握新的技术,提升自己的开发水平。