Android入门知识

283 阅读6分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

文章目录


课程到这里我们讲了许多 Java 的知识,也学习了 Android 的许多控件使用,当然也完成了几个小小的项目,这一篇文章将补充一些琐碎的关于安卓的知识。

当新建一个 Android 项目时

在这里插入图片描述

Name
项目名称

Package Name
包名,存放 java 类,文件夹名称,默认情况下,此软件包名称也会成为您的应用 ID。也就是安卓设备上的唯一的一个标识,同一个安卓设备上,同一个包名的程序只能有一个,后安装的一定会覆盖之前的。

发布应用后,不得更改应用 ID。否则会被市场视为不同应用。

虽然应用 ID 看起来就像传统的 Java 软件包名称一样,但应用 ID 的命名规则限制性更强一些:

  • 必须至少包含两段(一个或多个圆点)。
  • 每段必须以字母开头。
  • 所有字符必须为字母数字或下划线 [a-zA-Z0-9_]。

Save location
项目存放位置

Language
选择希望 Android Studio 在为新项目创建示例代码时使用的语言。

Minimum SDK
最低支持的SDK版本。希望应用支持的最低 API 级别。当选择较低的 API 级别时,应用可以依赖的现代 Android API 会更少,但能够运行应用的 Android 设备的比例会更大。当选择较高的 API 级别时,情况正好相反。

Android 项目启动流程
由于是入门课程,我们用最简单能理解的语言说一下。
1、检索项目清单( AndroidManifest.xml )文件,找到<application>节点下,带有<intent-filter> <action...Main><category...LANUCHER>配置的<activity>节点
2、根据找到的<activity>节点的android:name属性,确定需要实例化的 Activity 类
3、自动调用 Activity 类的 onCreate() 方法
4、加载setContentView()方法中参数对应的布局

关于布局和控件

控件命名
例如 TextView,全小写,以下划线分隔,开头为控件缩写,

android:id="@+id/tv_username"

@+id如果没有此id则创建
@id引用id

写相对布局时,顺序可能有调整,所以最靠谱的办法是用@+id

layout_gravity 和 gravity
layout_gravity 控件在布局中的位置
gravity 控件内容在控件中位置
具体可以看 blog.csdn.net/u010356768/…

页面布局注意
页面嵌套层级越少越好,最多不超过 7 级。

RGB和ARGB
RGB 是使用 # 作为前缀,使用 6 位 十六 进制数表示的颜色
ARGB 在 RGB 颜色基础上,用左侧 2 位十六进制,ff 表示完全不透明,00 表示完全透明

Button
默认的 Button 控件被设置了android:minWidthandroid:minHeight

这里写图片描述
设置minHeight="0dp"
这里写图片描述

去掉标题栏
预览时,要想效果和最终效果主题一致,可以更换主题,例如去掉标题栏,可以选择有 noactionbar 或者 notitlebar 的主题
在这里插入图片描述
selector使用
Android中drawable使用总结

ImageView

<ImageView
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:contentDescription="@null"
 	android:src="@android:drawable/alert_dark_frame"/>

@android:是引用安卓自带的资源

android:contentDescription是图片的文字描述,可以不设置,或者设置为“@null"

scaleType为图片缩放,当图片和控件大小不符时有效

1、正常尺寸的 ImageView

<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@null"
        android:src="@mipmap/ic_launcher" />

在这里插入图片描述

2、设置了长宽的 ImageView

<ImageView
    android:layout_width="100dp"
    android:layout_height="200dp"
    android:contentDescription="@null"
    android:src="@mipmap/ic_launcher"/>

在这里插入图片描述

3、设置了 scaleType=“fitXY” 的 ImageView。把图片按照指定的大小在 ImageView中显示,拉伸显示图片,不保持原比例,填满ImageView

<ImageView
    android:layout_width="100dp"
    android:layout_height="200dp"
    android:contentDescription="@null"
    android:scaleType="fitXY"
    android:src="@mipmap/ic_launcher"/>

在这里插入图片描述

4、设置了 android:scaleType=“matrix” 的 ImageView。不改变原图的大小,从 ImageView 的左上角开始绘制,超出部分做剪切处理
在这里插入图片描述
5、设置了 scaleType=“fitStart” 的 ImageView。把原图按照比例放大缩小到 ImageView 的高度,显示在 ImageView 的 start(前部/上部)
在这里插入图片描述
6、设置 scaleType=“fitEnd” 的 ImageView。把原图按照比例放大缩小到 ImageView 的高度,显示在 ImageVIew 的 end(后部/尾部/底部)
在这里插入图片描述
7、设置了 scaleType=“center” 的 ImageView。把原图按照比例放大缩小到 ImageView 的高度,显示在 ImageView 的 center(中部/居中显示)
在这里插入图片描述
8、android:scaleType=“centerInside” 以原图正常显示为目的,如果原图大小大于 ImageView 的size,就按照比例缩小原图的宽高,居中显示在 ImageView 中。如果原图 size 小于 ImageView 的 size,则不做处理居中显示图片。在这里插入图片描述
9、设置了 scaleType=“centerCrop” 的 ImageView。以原图填满 ImageView 为目的,如果原图 size 大于 ImageView 的 size,则与 center_inside 一样,按比例缩小,居中显示在 ImageView 上。如果原图 size 小于 ImageView 的 size,则按比例拉升原图的宽和高,填充 ImageView 居中显示。
在这里插入图片描述

语言的国际化自适应

当切换 Android 设备语言环境时,App中显示的文字语言自动切换。
在 res 下创建各种需要自适应的语言对应的文件夹,例如 values-zh,则当设备语言环境是中文时,会优先使用 values-zh 文件夹下配置的字符串资源。
在 values 系列文件夹下用于配置的任何 xml 文件,都不需要关心文件名本身,只需要使用正确的节点即可。例如 strings.xml 文件也可以改名为任何合法的文件名,不影响正常运行。

实现语言国际化自适应的文件夹名称的命名规则是 “values-语言简称”,每种语言的简称是固定的,可自行百度。

如果需要区分每种语言的使用的地区,则 values 文件夹的命名格式为 “values-语言简称-r地区简称”,其中语言简称全部小写,地区简称全部大写,例如:values-zh-rCN

屏幕尺寸自适应

dp转px和屏幕适配

style样式

不使用样式,就会有很多重复代码,不利于维护和管理,这是 style 就有了用武之地,使用样式的优点是,重复代码被抽取,有利于维护。

Android 的样式一般定义在 res/values/styles.xml 文件中,其中有一个根元素<resource>,而具体的每种样式定义则是通过其下的子标签<style>来完成,<style>通过添加多个<item>来设置样式不同的属性。

另外,样式是可以继承的,可通过<style>标签的parent属性声明要继承的样式,也可通过点前缀(.)继承,点前面为父样式名称,后面为子样式名称。点前缀方式只适用于自定义的样式,若要继承 Android 内置的样式,则只能通过 parent 属性声明。

    <Button
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:text="Button"
        android:background="@drawable/button_selector"/>

改为使用style样式

在values文件夹下的style.xml文件中修改

    <style name="buttonBackground">
        <item name="android:background">@drawable/button_selector</item>
    </style>
    <Button
        style="@style/buttonBackground"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:text="Button"
        />

简单登录界面实现

在这里插入图片描述
xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="20dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:text="用户名" />

        <EditText
            android:id="@+id/et_username"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:text="密码" />

        <EditText
            android:id="@+id/et_password"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:inputType="textPassword" />
    </LinearLayout>

    <Button
        android:id="@+id/btn_login"
        android:layout_width="100dp"
        android:layout_height="45dp"
        android:layout_gravity="center_horizontal"
        android:background="@drawable/button_selector"
        android:enabled="false"
        android:text="登录" />

</LinearLayout>

MainActivity

public class MainActivity extends AppCompatActivity {
    //[开发步骤]
    //1、声明控件,尽量使用 private
    private EditText etUsername;
    private EditText etPassword;
    private Button btnLogin;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //2、初始化控件
        etUsername = findViewById(R.id.et_username);
        etPassword = findViewById(R.id.et_password);
        btnLogin = findViewById(R.id.btn_login);

        //4、创建内部类的对象,并配置"提交按钮"
        InnerOnClickListener listener = new InnerOnClickListener();
        btnLogin.setOnClickListener(listener);

        InnerTextWatcher textWatcher = new InnerTextWatcher();
        etUsername.addTextChangedListener(textWatcher);
        etPassword.addTextChangedListener(textWatcher);
    }

    //3、使用成员内部类的语法,声明内部类,实现点击监听器的接口
    private class InnerOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            //5、实现监听方法
            String username = etUsername.getText().toString().trim();
            String password = etPassword.getText().toString();

            //常量写在左边,也许 username 为空
            if ("admin".equals(username) && "admin888".equals(password)) {
                Toast.makeText(MainActivity.this, "登录成功#^_^#", Toast.LENGTH_SHORT).show();
                return;
            } else {
                Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
                return;
            }
        }
    }

    private class InnerTextWatcher implements TextWatcher {

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            String username = etUsername.getText().toString().trim();
            String password = etPassword.getText().toString();
            btnLogin.setEnabled(username.length() >= 4 && password.length() >= 4);
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    }
}

button_selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/shape_button_disable" android:state_enabled="false" />
    <item android:drawable="@drawable/shape_button_pressed" android:state_pressed="true" />
    <item android:drawable="@drawable/shape_button_normal" />
</selector>

shape_button_disable

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="5dp" />
    <gradient
        android:endColor="#cccccc"
        android:startColor="#999999" />
</shape>

shape_button_normal

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="5dp" />
    <gradient
        android:endColor="#87CEFA"
        android:startColor="#4169E1" />
</shape>

shape_botton_pressed

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="5dp" />
    <gradient
        android:endColor="#87CEFA"
        android:startColor="#4169E1" />
</shape>