Android 发展历程
Android 是一个基于Linux 内核的自由及开发源代码的操作系统
2005 年 8 月由Google收购注资
2007年11月发布Android的源代码
2008 年10月第一部Android智能手机发布,HTC公司制造
2011年 Android 位于世界第一
2013 Android 系统数量达到10亿台
App运行日志
SDK :软件开发工具包,将App源码编译为可执行的App应用
日志级别
Log.e:表示错误信息,比如可能导致程序崩溃的异常
Log.w:表示警告信息
Log.i:表示一般消息
Log.d:表示调试(debug)信息,可把程序运行时的变量值打印出来,方便跟踪调试
Log.v:表示冗余信息
Android App 基础
XML:布局文件
- id:控件编号
- layout_width:控件宽度
- layout_height:控件高度
- text:文本
内置了SQlite 数据库
工程结构
项目:一个项目下可以有多个模块
模块:编译运行App
- app(app模块)
- Gradle Scripts
工程目录
gradle :自动化构建工具,依赖、打包、部署、发布、各种渠道的差异管理工作
build.gradle
- 工程级别
- 模块级别
build.gradle (Module: Demo1.app)
// 插件的包 plugins { id 'com.android.application' } android { // 指定SDk版本号 33 就是Android API 33.0编译 compileSdk 33 defaultConfig { //app包名 applicationId "com.example.demo1" //app运行的最小SDK版本,28最少要到9.0以上运行 minSdk 28 //目标设备的版本号,最希望app运行在哪个版本上 targetSdk 33 //指定app的应用版本号 versionCode 1 //应用版本名称 versionName "1.0" //单元测试 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } //app的依赖信息 dependencies { //appcompat兼容库 版本号 implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' //单元测试编译的junit版本号 testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }
AndroidManifest.xml
清单文件
- 每个应用必须具有,文件名一模一样
- APP的配置信息
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.demo1"> <!--包名--> <application android:allowBackup="true" 是否备份 android:icon="@mipmap/ic_launcher" 指定显示的图标 android:label="@string/app_name" 指定显示的名称 android:roundIcon="@mipmap/ic_launcher_round" app的圆角图标 android:supportsRtl="true" 是否支持阿拉伯语言 / 波斯语 ,从左往右的文字排序 android:theme="@style/Theme.Demo1"> <!--显示的风格,材料设计--> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
- activity 是一个应用程序组件,提供一个屏幕,交互完成某个任务
- 活动页面的注册声明
设计规范
界面显示与逻辑处理
利用 XML (activity_main.xml)标记描绘应用界面,实用Java(MainActivity.class)代码写程序逻辑
创建完整页面:
layout目录下创建XML文件
创建与 XML 文件队友的java代码
在AndroidManifest.xml 中注册页面配置
活动页面
简单的页面调整
- 布局文件,两个布局文件 ,从 2 跳到 1
文本内容可以在string.xml 文件中设置,在布局文件中调用链接过来就可以完成
<resources> <string name="app_name">Demo1</string> <string name="demo02">Android DEV</string> </resources>
创建Java代码,在1 的Java代码中设置跳转代码
Button button = findViewById(R.id.dragPage); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 页面跳转 Intent intent = new Intent(); // 结合上下文 intent.setClass(MainActivity.this,MainActivity2.class); startActivity(intent); } });
注册页面 AndroidManifest.xml
添加一个activity标签
<activity android:name=".MainActivity2" />
简单控件
文本显示
设置文本内容
- XML 布局文件中:android :text 设置文本
<TextView android:id="@+id/view1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello"/>
Java代码中调用文本视图对象的 setText 方法设置文本
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置掌控的页面 setContentView(R.layout.activity_text_view); TextView view1 = findViewById(R.id.view1); view1.setText(R.string.hello); }
在两种方式中都尽量不要直接写文本内容
可以在 string.xml 文件中定义一个文本常量,再进行调用
<resources> <string name="app_name">SimpleControl</string> <string name="hello">你好世界未来与你相伴!!!</string> </resources>
设置文本大小
- XML 布局文件中:android :textSize 设置文本大小
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> 垂直布局 <TextView android:id="@+id/tv_px" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" android:textSize="30px"/> <TextView android:id="@+id/tv_dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" android:textSize="30dp"/> <TextView android:id="@+id/tv_sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" android:textSize="30sp"/> </LinearLayout>
Java代码中调用文本视图对象的 setTextSize 方法设置文本大小
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_text_size); TextView s1 = findViewById(R.id.tv_dp); s1.setTextSize(50); }
单位
px:手机屏幕最小显示单位,与设备的显示屏有关
图像元素,单个像素并不固定
dp(Dip):与设备无关的显示单位,只与屏幕的尺寸有关
长度单位
dp的UI 效果只在相同尺寸的屏幕上相同,如果屏幕尺寸差异过大,需要重新组dp适配
Dpi:像素密度
Density(密度):每平方英寸(2.542 cm2)的像素点数量
sp:专门设置字体大小,系统设置中可以调整字体大小
设置文本颜色
- XML 布局文件中:android :textSize 设置文本颜色
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tv_color1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" android:textColor="@color/black" android:background="@color/purple_500" android:textSize="32sp" /> <TextView android:id="@+id/tv_color2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" android:textColor="@color/green" android:background="@color/gray" android:textSize="30dp" /> </LinearLayout>
Java代码中调用文本视图对象的 setTextColor 方法设置文本颜色
import android.annotation.SuppressLint; import android.graphics.Color; import android.os.Bundle; import android.widget.TextView; public class TextColorActivity extends AppCompatActivity { @SuppressLint("ResourceAsColor") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_text_color); // 从布局文件获取id TextView viewColor1 = findViewById(R.id.tv_color1); // 设置系统自带的颜色 viewColor1.setTextColor(Color.RED); //设置文本背景颜色 viewColor1.setBackgroundColor(R.color.gray); //设置文本,是系统的颜色 viewColor1.setBackgroundColor(Color.GREEN); } }
颜色常量
<resources> <color name="purple_200">#FFBB86FC</color> <color name="purple_500">#FF6200EE</color> <color name="purple_700">#FF3700B3</color> <color name="teal_200">#FF03DAC5</color> <color name="teal_700">#FF018786</color> <color name="black">#FF000000</color> <color name="white">#FFFFFFFF</color> <color name="green">#058531</color> <color name="gray">#666666</color> </resources>
视图基础
视图的宽高
布局文件中设置宽:android:layout_with 高:android:layout_height
取值
- match_parent:表示与上级视图保持一致 (填充式)
- wrap_content:表示与内容自适应 (文本内容是多少就多大)
- 以dp为单位尺寸
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/black" android:text="@string/hello" android:textColor="@color/green" android:textSize="20sp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/gray" android:text="@string/hello" android:textColor="@color/green" android:textSize="20sp" /> <TextView android:layout_width="250dp" android:layout_height="50dp" android:background="@color/white" android:text="@string/hello" android:textColor="@color/green" android:textSize="20sp" /> </LinearLayout>
- 效果图:
Java代码设置宽高,确保 xml 布局文件中的 wrap_content
调用控件对象的 getLayoutParams() 方法,获取该控件的布局参数。
布局参数的 width 属性表示宽度,height 属性表示高度,修改这两个属性值。
调用控件对象的 setLayoutParams 方法,填入修改后的布局参数使之生效。
public class ViewBorderActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_border); TextView tv_wh = findViewById(R.id.wh); //获取布局参数 ViewGroup.LayoutParams params = tv_wh.getLayoutParams(); //修改布局参数中的宽高,默认dp,需要把dp转换为px数值 params.width = Util.dip2px(this,300); //设置布局参数 tv_wh.setLayoutParams(params); } }
Util.java
类
public class Util { // 根据手机分辨率 从 dp 转换 为px像素 ,通过上下文 public static int dip2px(Context context, float dpValue) { // 获取当前手机的像素密度(1dp = ?px) float scale = context.getResources().getDisplayMetrics().density; //四舍五入 return (int) (dpValue * scale + 0.5f); } }
设置视图间距
视图依赖继承关系
间距fang’shi
采用 layout_margin(外间距)属性,它指定了当前视图与周围平级视图之间的距离。
layout_margin、layout_marginLeft、layout_marginTop、layout_marginRight、layout_marginBottom
采用 padding(内间距)属性,它指定了当前视图与内部下级视图之间的距离。
padding、paddingLeft、paddingTop、 paddingRight、paddingBottom
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="300dp" android:background="#00AAF0" android:orientation="vertical"> <!--中间层布局背景颜色为黄色--> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="30dp" android:background="@color/yellow" android:padding="30dp"> 内层的视图与这个视图的间距 <!--最内层背景颜色--> <View android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/red"> </View> </LinearLayout> </LinearLayout>
设置视图的对齐方式
对齐方式
采用 layout_gravity 属性,它指定了当前视图相对于上级视图的对齐方式。
采用 gravity 属性,它指定了下级视图相对于当前视图的对齐方式。
两者的取值:
left、top、right、bottom
left | top :靠左靠上(左上角)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="300dp" android:background="@color/red" android:orientation="horizontal"> <!--第一个子布局背景为黄色色,它在上级视图中朝下对齐,它的下级视图则靠左下对齐--> <LinearLayout android:layout_width="0dp" android:layout_height="200dp" android:layout_gravity="bottom" android:layout_margin="15dp" android:layout_weight="1" android:background="@color/yellow" android:gravity="left|bottom" android:padding="10dp"> <View android:layout_width="100dp" android:layout_height="100dp" android:background="@color/teal_200"> </View> </LinearLayout> <!--第一个子布局背景为黄色色,它在上级视图中朝上对齐,它的下级视图则靠右上下对齐--> <LinearLayout android:layout_width="0dp" android:layout_height="200dp" android:layout_gravity="top" android:layout_margin="15dp" android:layout_weight="1" android:background="@color/yellow" android:gravity="right|top" 在外层设置内层的位置 android:padding="10dp"> <View android:layout_width="100dp" android:layout_height="100dp" android:background="@color/teal_200"> </View> </LinearLayout> </LinearLayout>
常用布局
线性布局 LinearLayout
排列方式
- orientation属性值为 horizontal 时,内部视图在水平方向从左往右排列。
- orientation属性值为 vertical 时,内部视图在垂直方向从上往下排列。
不指定orientation 的属性,默认为水平布局
权重布局 layout_weight
指的是线性布局的下级视图各自拥有多大比例的宽高
- 不是在LinearLayout节点设置,而在线性布局的直接下级视图设置,该下级视图占据的宽高比例
- layout_width = 0dp :表示水平方向宽高比例
- layout_height =0dp:表示垂直方向的宽高比例
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!--水平布局--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="50dp" android:layout_height="wrap_content" android:layout_margin="5dp" android:background="@color/green"> </TextView> <TextView android:layout_width="50dp" android:layout_height="wrap_content" android:layout_margin="5dp" android:background="@color/green"> </TextView> </LinearLayout> <!--垂直布局--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="50dp" android:layout_height="wrap_content" android:layout_margin="5dp" android:background="@color/red"> </TextView> <TextView android:layout_width="50dp" android:layout_height="wrap_content" android:layout_margin="5dp" android:background="@color/red"> </TextView> </LinearLayout> <!--水平权重布局--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <!--1/6--> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="5dp" android:layout_weight="1" android:background="@color/yellow"> </TextView> <!--5/6--> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="5dp" android:layout_weight="5" android:background="@color/yellow"> </TextView> </LinearLayout> <!--垂直权重布局--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="200dp" android:layout_height="0dp" android:layout_margin="5dp" android:layout_weight="1" android:background="@color/red"> </TextView> <TextView android:layout_width="200dp" android:layout_height="0dp" android:layout_margin="5dp" android:layout_weight="1" android:background="@color/red"> </TextView> </LinearLayout> </LinearLayout>
效果图
相对布局RelativeLayout
- 相对布局的下级视图位置有其他视图决定,确定下级视图的参照物
- 与该视图自身平级的视图
- 该视图的上级视图(也就是RelativeLayout)
- 默认在 RelativeLayout 内部左上角
位置:
<TextView android:id="@+id/parent1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/blue" android:text="上级位置" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/Re_center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="@color/gray" android:text="在上级中间" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/parent1_right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:background="@color/green" android:text="我在上级的右边" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/parent_bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@color/green" android:text="在上级下面" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/parent_bottom_center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerInParent="true" android:background="@color/yellow" android:text="在上级中间下面" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/bottom_right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:layout_centerInParent="true" android:background="@color/green" android:text="在上级右下角" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/center_left" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/Re_center" android:layout_toLeftOf="@id/Re_center" android:background="@color/red" android:text="在中间左边" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/center_right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/Re_center" android:layout_toRightOf="@id/Re_center" android:background="@color/red" android:text="在中间右边" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/center_top" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/Re_center" android:layout_alignLeft="@id/Re_center" android:background="@color/red" android:text="在中间上边" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/center_bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/Re_center" android:layout_alignRight="@id/Re_center" android:background="@color/red" android:text="在中间下边" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/parent_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:background="@color/yellow" android:text="上级垂直中间" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/parent_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:background="@color/yellow" android:text="在上级中间" android:textColor="@color/black" android:textSize="15sp" /> <TextView android:id="@+id/right_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@id/parent1_right" android:layout_centerVertical="true" android:background="@color/yellow" android:text="右边垂直中间" android:textColor="@color/black" android:textSize="15sp" />
网格布局 GridLayout
- 网格布局多行多列的表格布局
- 默认从左往右、从上往下
- columnCount 属性:网格列数,每行能放多少个视图
- rowCount属性:网格行数,每列能放多少个视图
设置一个两行两列的
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:columnCount="2" android:rowCount="2"> <TextView android:layout_width="0dp" 列的对齐权重 android:layout_height="wrap_content" android:layout_columnWeight="1" 列的权重 android:layout_margin="2dp" android:background="@color/red" android:gravity="center" android:text="红色" android:textColor="@color/black" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_columnWeight="1" android:layout_margin="2dp" android:background="@color/green" android:gravity="center" android:text="绿色" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_columnWeight="1" android:layout_margin="2dp" android:background="@color/blue" android:gravity="center" android:text="蓝色" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_columnWeight="1" android:layout_margin="2dp" android:background="@color/purple_200" android:gravity="center" android:text="紫色" /> </GridLayout>
滚动布局 ScrollLayout
ScrollView :
垂直方向滚动视图
layout_width = match_content
android:layout_height=“wrap_content”
HorizontalScrollView:
水平方向滚动视图
layout_width = “wrap_content”
android:layout_height = match_content
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!--水平方向滑动--> <HorizontalScrollView android:layout_width="wrap_content" android:layout_height="200dp"> <!--水平线性布局,设置两个子视图--> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent"> <View android:layout_width="500dp" android:layout_height="match_parent" android:background="@color/green" /> <View android:layout_width="50dp" android:layout_height="match_parent" android:background="@color/yellow" /> </LinearLayout> </HorizontalScrollView> <!--垂直方向滑动--> <ScrollView android:layout_width="250dp" android:layout_height="wrap_content"> <!--水平线性布局,设置两个子视图--> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="500dp" android:background="@color/blue" /> <View android:layout_width="match_parent" android:layout_height="500dp" android:background="@color/purple_200" /> </LinearLayout> </ScrollView> </LinearLayout>