Android布局介绍
线性布局
Android线性布局(LinearLayout)是Android开发中最常用的布局之一。它可以将容器中的组件按照水平或垂直方向进行排列。
通过android:orientation
属性来控制方向,设置为水平方向(horizontal)或垂直方向(vertical)。
一般使用在只设计水平或者垂直分布等简单的布局
常用的一些属性:
layout_weight
:用于设置组件在布局中的权重,实现比例分配空间。baselineAligned
:用于控制布局管理器与其子元素的基线是否对齐。divider
:在垂直布局中设置两个组件之间的分隔条。gravity
:设置布局管理器内组件的对齐方式,如居中、靠左、靠右等。
使用案例:
eg1:创建一个水平方向的线性布局,其中包含两个按钮,一个文本视图,并且要求按钮和文本视图水平居中。
eg2:创建一个垂直方向的线性布局,并且希望其中的两个文本视图按照一定比例分配空间。
注意:当使用layout_weight
时,通常需要将对应方向的layout_width
或layout_height
设置为0dp
,以便让系统根据权重自动计算尺寸。
约束布局
Android约束布局(ConstraintLayout)是一种灵活的布局方式,旨在解决嵌套布局带来的性能问题,并提供更高效的界面设计手段。
优点:它通过约束条件来定义视图之间的关系,实现复杂的布局设计,而无需多层嵌套,使得布局设计更加灵活多变。
一般使用在复杂的布局当中。
使用案例:
eg1:用户登录界面设计
通过设置控件之间的约束关系,确保它们在不同屏幕尺寸和分辨率下都能保持合适的布局和间距。
eg2:实现链式布局
在这个例子中,我们有三个按钮:Start、End和Center。Start和End按钮被固定在屏幕的边,Center按钮在Start和End按钮之间,并且它们三个都处在父视图的顶部和底部。当父视图的大小或形状发生变化时,ConstraintLayout会自动调整这三个按钮的位置以保持它们之间的关系。
表格布局
- Android的表格布局(TableLayout)是继承自LinearLayout,因此其本质仍然是线性布局管理器。
- 每次向TableLayout中添加一个TableRow,该TableRow即为一个表格行,且TableRow也是容器,可以不断地添加其他组件。
帧布局
帧布局(FrameLayout)是Android中最简单的布局方式。它将视图(View)一帧一帧地叠加到一起,类似于Photoshop中的图层概念;在帧布局中,后添加的视图会覆盖先添加的视图,视图按照添加的顺序依次叠加。
帧布局通常用于需要视图叠加效果的场景,或者作为一个容器来显示单个视图。
基本使用:
相对布局
相对布局(RelativeLayout)是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式。
它可以实现控件间的相对定位,如相对于父容器或相对于其他控件进行定位。
案例:
eg:标签在顶部并且与左边对齐,文本输入框位于标签下方并且与标签对齐,按钮分别位于输入框下方和右侧。
以上就是这几种布局的介绍了!
Android的常用控件
用控件的介绍:
- 文本框(TextView):用于显示文本信息。 可以通过XML布局文件设置其样式、大小和颜色等属性。
- 编辑框(EditText):允许用户输入和编辑文本,可以设置输入类型(如数字、文本、密码等)和监听文本变化。
- 按钮(Button):允许用户通过点击来执行操作。可以设置按钮的文本、背景和点击效果。
- 单选按钮(RadioButton):允许用户从一组选项中选择一个。RadioGroup用于包裹多个RadioButton,确保一次只能选择一个。
- 复选框(checkbox):允许用户选择多个选项。每个CheckBox都可以单独被选中或取消选中。
- 图片控件(ImageView):显示用户的头像信息或者展示商品等
这面是我们的xml文件的代码展示,创建了一个简单的登录界面,包含了用户名和密码输入框、记住我复选框、用户类型选择(用户和管理员)以及登录按钮。当用户点击登录按钮时,会触发登录逻辑。
注意:把所有控件都加上id,后面可以在activity中获取到控件进行使用。
下面看看写完的效果:
现在来看逻辑代码:
在上面可以看到,通过findbyId找到控件,判断值是否为空,不为空就算登录成功,点击登录后在Log日志中查看结果
注意:此处为模拟登录,实际以自己登录逻辑!!!!
简单了解android的Activity与Intent
Android中的Activity
有一个明确的生命周期,由系统控制。了解这个生命周期对于开发高效、稳定的Android应用至关重要。Activity
的生命周期主要包括以下几个阶段:
Activity的生命周期
- onCreate(): 当
Activity
第一次被创建时调用。这是初始化设置的好地方,如设置UI视图和加载数据。 - onStart(): 在
Activity
即将对用户可见之前调用。 - onResume(): 在
Activity
开始与用户交互之前调用。此时,Activity
处于活动状态并位于任务堆栈的顶部。 - onPause(): 当另一个
Activity
启动或当前Activity
不再可见时调用。这是保存数据或状态的好地方。 - onStop(): 当
Activity
不再可见时调用。这通常发生在启动一个新的Activity
或当用户返回到主屏幕或切换到其他应用时。 - onDestroy(): 在
Activity
被销毁之前调用。这是释放资源的好地方,如关闭文件、数据库连接等。 - onRestart(): 在
Activity
已经停止后,再次启动前调用。
onCreate()
方法是每个 activity 都必须实现的方法。您可使用 onCreate()
方法为 activity 执行所有一次性初始化,相应 activity 会被视为“已创建”。
注意:替换 onCreate()
方法时,您必须调用父类实现来完成 activity 的创建,因此您必须立即调用 super.onCreate()
。这也适用于其他生命周期回调方法。
系统会在调用 onCreate()
之后立即调用 onStart()
生命周期方法。onStart()
运行后,您的 activity 会显示在屏幕上。与为初始化 activity 而仅调用一次的 onCreate()
不同,onStart()
可在 activity 的生命周期内由系统多次调用。
注意:onStart()
需要与相应的 onStop()
生命周期方法配对使用。如果用户启动您的应用后又返回设备的主屏幕,相应 activity 会停止,并且不会再在屏幕上显示。
后续更多可参考官方文档:activity 生命周期的阶段 | Android Developers
Intent的跳转方式:
Intent
是Android中用于请求操作的一个消息对象,可以用于启动Activity
、Service
或发送广播。当用于启动Activity
时,有几种常见的跳转方法:
显式:这种方式明确指定了要启动的Activity
的类名
可以通过Intent
的putExtra()
方法向目标Activity
传递额外数据。这些数据可以是基本数据类型、字符串、序列化对象等。
隐式:这种方式不直接指定要启动的Activity
,而是通过定义Action
、Category
、Data
等属性来匹配系统中可以处理该Intent
的Activity
。
高级控件
在Android开发中,高级控件是构建复杂和动态用户界面时不可或缺的工具。以下是一些Android高级控件的概述,按照不同的功能和类型进行分类:
- 滚动和视图容器控件:
ScrollView
:用于显示超出屏幕大小的内容,并提供垂直滚动功能。它通常包含一个子视图,如LinearLayout
或RelativeLayout
。HorizontalScrollView
:与ScrollView
类似,但提供水平滚动功能。ViewPager
:用于在多个视图之间水平滑动切换,常用于实现图片轮播或页面导航。
- 列表和网格控件:
ListView
:以列表形式展示数据项,支持垂直滚动。它通常与适配器(如ArrayAdapter
、SimpleAdapter
等)一起使用,以将数据源与视图绑定。GridView
:以网格形式展示数据项,常用于展示图片或图标。RecyclerView
:一个更强大和灵活的列表/网格控件,支持水平和垂直滚动,以及复杂的布局和动画效果。
- 其他常见的高级控件:
Spinner
:一个下拉列表控件,允许用户从预定义的选项中选择一个值。ProgressBar
:用于显示操作进度的控件,可以是水平的或圆形的。TabLayout
:与ViewPager
结合使用,实现带有标签页的界面导航。DrawerLayout
:一个导航抽屉控件,通常用于展示侧边栏或导航菜单。
- 自定义控件:
- Android还支持开发者创建自定义控件,以满足特定需求。这通常涉及继承现有的视图类(如
View
、ViewGroup
等),并重写其绘制和事件处理逻辑。
- Android还支持开发者创建自定义控件,以满足特定需求。这通常涉及继承现有的视图类(如
案例:
(1)HorizontalScrollView与ScrollView类似,但是支持水平方向上的滚动。以下是一个简单的HorizontalScrollView案例:
HorizontalScrollView常见属性及方法
常见属性:
android:fillViewport:设置是否要求子视图填充HorizontalScrollView的可视区域。默认值为true,在子视图不足以填充水平空间时,会拉伸子视图使得水平空间被填满。
android:overScrollMode:设置滚动边界效果模式。可选值有"always"(总是显示边界阴影效果)、"never"(永不显示边界阴影效果)和"ifContentScrolls"(仅当内容发生滚动时显示边界阴影效果)。
android:scrollbars:设置滚动条的显示方式。可选值有"horizontal"(只显示水平滚动条)、"vertical"(只显示垂直滚动条)和"none"(不显示滚动条)。
android:scrollbarStyle:自定义滚动条的风格。可选值有"default"(系统默认风格)、"insideInset"(滚动条在内部偏移位置显示)和"outsideInset"(滚动条在外部偏移位置显示)。
常见方法:
scrollTo(int x, int y):滚动到指定的坐标位置。其中x表示水平方向上的滚动位置,y表示垂直方向上的滚动位置。
smoothScrollTo(int x, int y):平滑地滚动到指定的坐标位置。与scrollTo()相比,该方法会有一个过渡效果,使得滚动更加平滑。
fullScroll(int direction):滚动到指定方向的边界。direction可选值为View.FOCUS_LEFT(滚动到最左边)、View.FOCUS_RIGHT(滚动到最右边)和View.FOCUS_FORWARD(按照指定方向进行滚动)。
computeHorizontalScrollRange():获取水平滚动范围的总长度。
setSmoothScrollingEnabled(boolean enabled):设置是否启用平滑滚动效果。
总结
使用HorizontalScrollView时,需要根据实际需求和内容的水平滚动性质来设置布局结构和子视图。通过合理处理布局和内容,可以为用户提供流畅且舒适的水平滚动体验。
(2)RecyclerView是进阶版的ListView,可以实现ListView的纵向滑动。
在要展示的页面添加RecyclerView
准备数据创建bean
创建适配的布局页面
创建适配布局的适配器RecyclerViewAdapter继承RecyclerView.Adapter<T>,重写相关方法,其中:
- T为内部类ViewHolder继承,用于RecyclerView.ViewHolder,传入参数为适配布局的View实例
- 构造方法用于接收并维护数据
- onCreateViewHolder()加载适配布局传入ViewHolder并返回,viewType用于和getItemViewType()根据不同数据返回对应布局,如设置Header
- onBindViewHolder()用于将控件和数据进行绑定
- getItemCount()用于返回数据长度
修改Activity,为RecyclerView设置布局方向和适配器
以上就可以实现了左边RecyclerView的展示和tab点击,以下是效果图
总结
RecyclerView是Android开发中一个强大且灵活的UI控件,用于在有限的空间内展示大量数据集。
Android菜单与对话框设计
在Android开发中,菜单(Menus)和对话框(Dialogs)是两种常见的用户界面元素,它们为用户提供与应用程序交互的直观方式。以下是关于Android菜单与对话框的详细解释和用法:
对话框(Dialogs)
AlertDialog用法:
- 创建一个对话框生成器AlertDialog.Builder对象
- 设置AlertDialog.Builder对象的属性,图标,标题,内容等
- 调用create()方法创建一个对话框AlertDialog
- 调用AlertDialog的show()方法显示对话框
- 调用AlertDialog的dismiss()方法关闭对话框
AlertDialog.Builder对象的常用属性讲解
- 设置对话框的图标: setIcon(R.mipmap.ic_launcher)
- 设置对话框标题:setTitle("系统警告")
- 设置对话框内容: setMessage("电量过低,一分钟后将自动关机!")
- 设置点击对话框外的区域是否关闭对话框: setCancelable(false)
- 设置对话框按钮功能(系统提供的对话框有三个按钮。不设置则不显示,点击按钮后对话框会自动关闭
setNegativeButton("否", new DialogInterface.OnClickListener() {...})
setNeutralButton("中", new DialogInterface.OnClickListener() {...})
setPositiveButton("是", new DialogInterface.OnClickListener() {...})
使用案例:
在点击加入购物车后会弹出对话框来确定是否加入
总结
对话框是Android中用于显示重要信息或请求用户输入的小窗口。它们通常会打断用户的正常操作,直到用户与对话框交互。
菜单(Menus)
选项菜单 OptionsMenu
创建menu的xml文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- 菜单可以嵌套 但顶多允许含有一层子菜单-->
<!--
showAsAction:always 直接在标题栏显示 never 不显示 有图标就显示图标
-->
<item
android:id="@+id/m1"
android:title="选项1"
app:showAsAction="always"/>
<item
android:id="@+id/m2"
android:title="选项2"/>
<item
android:id="@+id/m3"
android:title="选项3"/>
<item
android:id="@+id/m4"
android:title="选项4">
<menu>
<item android:title="子菜单1"/>
<item android:title="子菜单2"/>
<item android:title="子菜单3"/>
<item android:title="子菜单4"/>
</menu>
</item>
</menu>
在需要添加选项菜单的布局对应的activity中重写 onCreateOptionsMenu 方法加载选项菜单-此时是MainActivity
getMenuInflater().inflate(R.menu.option,menu); // 加载菜单资源
// 创建optionMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 加载菜单资源
getMenuInflater().inflate(R.menu.option,menu);
return true;
}
重写 onCreateOptionsMenu 方法,利用以上类添加选项菜单,菜单项序号是指菜单项的位置
// 创建optionMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
/* 纯代码设计
* Menu 类 SubMenu 子菜单类*/
/* Menu 类参数:组id 菜单项 id 菜单项序号 菜单项名称 */
menu.add(1,1,3,"菜单1");
menu.add(1,2,2,"菜单2");
SubMenu subMenu = menu.addSubMenu(1,3,1,"子菜单的主菜单");
subMenu.add(2,22,1,"子菜单2");
subMenu.add(2,11,2,"子菜单1");
return true;
}
上下文菜单
创建xml文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/ctx1"
android:title="上下文菜单item1" />
<item
android:id="@+id/ctx2"
android:title="上下文菜单item2" />
<item
android:id="@+id/ctx3"
android:title="上下文菜单item3" />
<item
android:id="@+id/ctx4"
android:title="上下文菜单item4" />
<item
android:title="上下文菜单item5">
<menu>
<item
android:id="@+id/z_ctx1"
android:title="子菜单item1" />
<item
android:id="@+id/z_ctx2"
android:title="子菜单item2" />
<item
android:id="@+id/z_ctx3"
android:title="子菜单item3" />
</menu>
</item>
</menu>
在activity_main.xml里添加一个按钮用以打开上下文菜单
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/ctx_btn"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="打开contextMenu"/>
</LinearLayout>
在 activity_main.xml 布局对应的 activity 中的 onCreate() 方法中进行注册
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ContextMenu 上下文菜单的使用
// 1.注册
registerForContextMenu(findViewById(R.id.ctx_btn));
}
创建 - 覆盖父类的 onCreateContextMenu 方法,加载菜单资源
// 2.创建contextMenu
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.context,menu);
}
覆盖父类的 onContextItemSelected 方法
// 3.contextMenu 菜单项选项操作
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
return super.onContextItemSelected(item);
}
菜单原文链接:https://blog.csdn.net/weixin_43244083/article/details/135732833
总结
做菜单时菜单项应该简洁明了,避免使用冗长的描述或不必要的选项,遵循Android的设计规范和最佳实践,确保菜单在应用程序中的外观和行为保持一致,确保菜单易于使用和理解,避免复杂的交互流程或隐藏的操作,为菜单项添加图标可以提高用户的识别速度和易用性。确保图标清晰且与操作相关,在设计菜单时,要考虑用户当前所处的上下文环境,以便提供相关的操作选项。
Android Studio学习过程的反思与持续改进
在Android Studio的学习过程中,我深刻体会到了技术学习的挑战与乐趣。刚开始,我面临着复杂的编程环境和大量的新概念,常常感到力不从心。但随着时间的推移,我逐渐适应了这种节奏,并在实践中不断加深对Android开发的理解。
反思我的学习过程,我发现持续的学习和实践是关键。仅仅阅读文档或观看教程是不够的,必须亲自动手编写代码,才能在遇到问题时快速找到解决方案。此外,我还学会了利用社区资源和论坛,与其他开发者交流心得,这极大地丰富了我的学习体验;然而,我也意识到自己在时间管理和学习规划上还有待提高。有时我会因为某个难题而陷入困境,浪费了大量时间。为了改进这一点,我开始制定更明确的学习计划,并设定了短期和长期的学习目标。这帮助我更好地把握学习节奏,避免了无谓的浪费时间。
在未来的学习中,我将继续保持这种反思和持续改进的态度。我将更加注重基础知识的巩固和深入学习,同时也会积极探索新的技术趋势和解决方案。