小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
文章目录
课程到这里我们讲了许多 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:minWidth和android: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
屏幕尺寸自适应
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>