Android应用开发基础

1. Android中常用布局整理

1.1 LinearLayout(线性布局)

  • orientation:布局方向(horizontal 水平或 vertical 垂直)。
  • gravity:控制子元素在布局中的位置,如 center、left、right、top、bottom、center_vertical、center_horizontal 等。
  • layout_gravity:控制组件相对于父布局的位置,比如 center、center_vertical、center_horizontal 等。
  • weight:在布局中分配剩余空间的比例。
  • margin:组件外部的间距,可以有 marginLeft、marginRight、marginTop、marginBottom。
  • padding:组件内部的间距,包含内容与组件边界的间距。

1.2 RelativeLayout(相对布局)

  • layout_above:放置在指定元素之上。
  • layout_below:放置在指定元素之下。
  • layout_toLeftOf:放置在指定元素的左边。
  • layout_toRightOf:放置在指定元素的右边。
  • layout_alignParentTop:与父元素顶部对齐。
  • layout_alignParentBottom:与父元素底部对齐。
  • layout_alignParentLeft:与父元素左边对齐。
  • layout_alignParentRight:与父元素右边对齐。
  • layout_centerHorizontal:水平居中。
  • layout_centerVertical:垂直居中。
  • layout_centerInParent:在父元素中心居中。
  • layout_alignBaseline:与指定元素的基线对齐。
  • layout_alignStart:与指定元素的开始位置对齐。
  • layout_alignEnd:与指定元素的结束位置对齐。

1.3 FrameLayout(帧布局)

  • layout_gravity:控制子元素的位置,与 LinearLayout 中的 gravity 类似。
  • layout_marginTop、layout_marginBottom、layout_marginLeft、layout_marginRight:设置子视图的上、下、左、右外边距。
  • padding:设置子视图内部与边界的间隔。

帧布局是一种简单的布局,用于堆叠视图。默认情况下,所有的子视图都会被定位在布局的左上角,但可以通过使用 layout_gravity 属性来改变它们的位置。

2.Context

2.1 简介

Context 在Android应用开发中非常关键,它提供了一个窗口,让应用程序可以访问应用程序以外的资源、服务和系统级操作。

  1. 资源访问
    • 访问资源文件:使用 Context 可以访问 res 目录下的各种资源,如字符串、颜色和尺寸等。
    • 获取视图:在Activity中,你可以通过 findViewById 方法来获取布局文件中定义的视图。
  2. 权限检查
    • 运行时权限:从 Android 6.0 开始,可以调用 ContextcheckSelfPermission 方法来检查权限。
  3. 系统服务
    • 获取系统服务:可以通过 Context 获取系统级服务,如 LocationManagerWifiManager 等。
  4. ……

2.2 基础运用

2.2.1 通过context对象获取私有目录

私有目录也叫沙箱目录

1
context.getFilesDir().getPath()
1
2
3
4
5
6
7
8
9
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println(this.getFilesDir().getPath());
}
}

image-20240229235912218

使用this.getFilesDir().getPath(),是因为this指代当前的MainActivity对象,MainActivity本质是继承context的,所以可以通过this调用context相关的api

实际开发中,为了方便context对象的传递,建议使用以下写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.example.contextdemo1;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
System.out.println(mContext.getFilesDir().getPath());
}
}

3. 练习案例-登录并保存账密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.example.logindemo1;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

private EditText et_username;
private EditText et_password;
private CheckBox cb_rem;

private Context mContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
et_username = findViewById(R.id.et_username);
et_password = findViewById(R.id.et_password);
cb_rem = findViewById(R.id.cb_rem);
Button bt_login = findViewById(R.id.bt_login);

bt_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = et_username.getText().toString().trim();
String password = et_password.getText().toString().trim();
try {
login(mContext,username,password);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
}

private void login(Context mContext, String username, String password) throws IOException {
if(!(TextUtils.isEmpty(username) || TextUtils.isEmpty(password))){
Boolean loginResult = checkLogin(mContext,username,password);
System.out.println(cb_rem.isChecked());
if(cb_rem.isChecked() && loginResult.equals(true)){
mContext.openFileOutput("username.txt", Context.MODE_PRIVATE).write(username.getBytes());
mContext.openFileOutput("password.txt", Context.MODE_PRIVATE).write(password.getBytes());
}
}else {
Toast.makeText(mContext,"账号或密码不能为空",Toast.LENGTH_LONG).show();
}
}

private Boolean checkLogin(Context mContext, String username, String password) {
if(username.equals("admin")&&password.equals("123456")){
Toast.makeText(mContext,"登录成功",Toast.LENGTH_LONG).show();
return true;
}else{
Toast.makeText(mContext,"账号或密码错误",Toast.LENGTH_LONG).show();
return false;
}
}
}