推荐学习网站

安卓开发者平台:https://developer.android.com/
安卓开发者社区:https://android-developers.googleblog.com/

安卓的四大组件

安卓的四大组件,Activity、Service、BroadcastReceiver、ContentProvider提供应用之间的访问接口(很少自定义,主要系统提供)

Activity

相当于Swing编程中的JFrame控件,与其不同的是JFrame本身可以设置布局管理器,不断地向其添加组件,而Activity只能通过setContentView(View)来显示布局文件中已经定义的组件。Activity就像一个界面管理员,用户在界面上的操作是通过Activity来管理的。

生命周期

  • onCreate(Bundle savedInstanceState):该方法在Activity的实例被Android系统创建后第一个被调用。通常在该方法中设置显示屏幕的布局、初始化数据、设置控件被点击的事件响应代码。
  • onRestart():回到最上边的界面,再次可见时执行(可见)。
  • onStart():在Activity可见时执行(可见)。
  • onResume():Activity获取焦点时执行(可见)。
  • onPause():Activity失去焦点时执行(不可见)。
  • onStop():用户不可见进入后台时执行(不可见)。
  • onDestroy():Activity销毁时执行。

创建一个Activity的具体步骤:

  1. 定义一个类继承自android.app.Activity或其子类。
  2. 在res/layout目录下创建一个activity_main.xml文件,用于创建Activity的布局。
  3. 在app/manifests目录下的AndroidManifest.xml清单文件中注册Activity(Android Studio自动创建在源码的根目录)。
  4. 重写Activity的onCreate()方法,并在该方法中使用setContentView(R.layout.activity_main)加载指定的布局文件。

AndroidManifest.xml清单文件

AndroidManifest.xml清单文件是一个整个安卓应用程序的全局描述文件

其中包含:

  • 包含在Android Studio中的根目录:/AndroidStudioProjects/MyFristApplication/app/src/main/
  • 应用程序的名称图标、包含组件等信息进行描述和说明
  • 声明应用程序的包名
  • 描述应用程序组件,包括组成的应用程序四大组件
  • 声明应用程序的权限

Android UI编程基础

Android的Widget组件一定要放入一个容器当中
写完布局文件一定要:setContentView(R.layout.activity_main);,其中activity_main是自己定义的xml文件的名称
使用容器布局中的组件:but=findViewById(R.id.button);

常见的Android界面布局

  • LinearLayout
  • RelativeLayout
  • TableLayout
  • AbsoluteLayout

要使用Android的界面布局,首先要在布局文件中声明,例如:src/main/res/layout/activity_main.xml

线性布局(LinearLayout)

常用的属性说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<LinearLayout
android:layout_width="match_parent" #设置宽度将于外包裹的父类一致
android:layout_height="match_parent" #设置高度将于外包裹的父类一致
android:orientation="vertical" #方向vertical垂直默认水平horizontal排列方式决定了组件之间左右摆放还是上下摆放vertical为上下摆放
android:gravity="center_horizontal" #其中的内容水平居中
android:gravity="center" #其中的内容完全居中
android:gravity="center_vertical" #其中的内容垂直居中
android:layout_marginTop="100dp" #相当于网页设计margin上边框
android:layout_marginLeft="25dp" #(左边框
android:layout_marginRight="25dp" #(右边框
android:layout_marginBottom="300dp" #(下边框)

>

</LinearLayout>

表格布局(TableLayout)

TableLayout继承了LinearLayout,本质上依旧是线性布局,其可以使用所有LinearLayout所有xml属性
其中的表格有多少列完全取决于其中最多列数的行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:shrinkColumns="0,1" #表格中可收缩的列12列
android:stretchColumns="0,1" #表格中可伸展的列12列
android:collapseColumns="*" #需要隐藏所有列

>
<TableRow>
<Button android:layout_span="2"/> #此组件占据多少行
<Button android:layout_column="1"/> #此组件显示在第一列【这个我也搞不懂】
</TableRow>

</TableLayout>

相对布局

咳咳,这个好难理解,后面再说

绝对布局

AbsoluteLayout是通过指定确切的XY坐标来指定组件的位置
其中的位置坐标原点位于整个Android手机屏幕的左上角,组件的在坐标上描述成点的位置也在组件的左上角

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<AbsoluteLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintTop_toTopOf="parent">


<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="20dp" #绝对位置x坐标
android:layout_y="512dp" #绝对位置y坐标
android:text="用户名:"
android:textColor="#50ff46"
android:textSize="15pt" />
</AbsoluteLayout>

事件处理

匿名内部类的方式设置一个按钮的事件处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MainActivity extends AppCompatActivity {
private Button but;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
but=findViewById(R.id.button);
but.setOnClickListener(new View.OnClickListener(){ //匿名内部类直接继承了一个名为View.OnClickListener的接口,千万不能理解为它继承的是一个类中的方法

@Override
public void onClick(View v) {

}
});
}
}

实验&课程&网上查找笔记

Android Studio 中的res/drawble图片不能有大写字母,mipmap(响应式布局) 是分设备尺寸选择合适图片的文件夹
res/values/colors.xml 是用来设置内容显示颜色的

设置一个底部消息气泡

1
2
3
4
5
6
7
8
9
10
11
12

private EditText userName;
private EditText passwd;

StringBuffer srt=new StringBuffer();

String userNa=userName.getText().toString();
String passWd=passwd.getText().toString();

srt.append(userNa);
srt.append(passWd);
Toast.makeText(MainActivity.this,srt,Toast.LENGTH_LONG).show(); //生成消息气泡的函数,其中参数(设置在哪个Activity显示,显示的内容,显示的时间)

两个Activity之间的跳转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//方法一 我就直接这种简单的了
/*Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);*/

//方法二
Intent intent = new Intent();
intent.setClass(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});

设置输入框中的提示文字

1
2
3
4
5
6
7
8
9
<EditText
android:id="@+id/editTextTextPersonName"
android:layout_width="match_parent"
android:layout_height="54dp"
android:ems="10"
android:inputType="textPersonName"
android:hint="用户名" #xml文件中设置Ediitext的提示文字
android:textHintColor="#fff" #xml文件中设置Ediitext的提示文字的颜色
/>

Android中的dp、sp与px换算关系

基本概念

  • px: 像素(pixel),设备上的物理像素点。
  • dp:跟dip是同一个概念,与屏幕物理像素点无关,而是基于屏幕密度抽象单位,被称作“设备独立像素”,会随着屏幕的密度进行自动的大小调整。
  • sp: 专用于文字大小的设置,可根据字体大小首选项进行缩放。
  • inch: 英寸,1英寸 = 2.54厘米。
  • dpi: 屏幕像素密度, 单位英寸上像素点的数量。
  • 分辨率: 是指横纵方向上的像素点数,单位是px。一般是纵向像素*横向像素,比如1920 * 1080
  • 屏幕尺寸: 屏幕对角线的长度,单位是inch。比如我们平时常说的5寸手机,是指手机屏幕的对角线长度为5英寸。

换算关系

谷歌定义的屏幕不同大小类别:

level dpi scale resolution
ldpi 120 0.75 320*240
mdpi 160 1 480*320
hdpi 240 1.5 800*480
xhdpi 320 2 1280*720
xxhdpi 480 3 1920*1080
xxxhdpi 640 4 2560*1440

android.util.TypedValue类提供了一个函数,提供所有单位与px的换算关系。

  • dpi如何计算? dpi,英文全称dot per inch,是指每英寸上的像素点个数。 计算公式:dpi=√(X²+Y²)/Z (其中 X:纵向的像素个数;Y:横向的像素个数;Z:屏幕尺寸)

  • scale是如何计算的? 定义以160dpi作为基准,当前设备的dpi/160dpi = scale值。也就是当设备的dpi为160时1dp=1px.

  • dp与px如何转换? 计算公式:pxs = dps * (dpi/160), 比如:320dpi的设备,10dp转换为px为 10 *(320/160)px = 20 px,即320dpi下10dp=20px.

  • 1dp到底等于多长呢? 假设设备的dpi=320, 是指320px对应的长度为1英寸, 那么1px=1/320 英寸。再根据前面的公式, 1dp = (320/160) px = 2px。故1dp对应的长度为2 * (1/320)英寸,即1/160英寸。 同理,假设设备的dpi =N,那么1dp = (N/160) px = (N/160) * (1/N) inch = 1/160 inch,再加上前面提到的近似,可以得出结论为1dp约等于1/160英寸。