资源的类型和使用
1. 任何资源文件应该存放在 /res/ 目录中的子目录中,不应直接存放在 /res/ 目录中,否则容易出现编译错误。
2. 如果需要更新或修改配置的资源文件,应该直接到对应的 /res/子目录 中的对应的配置文件中修改。
/res/animator/
存放:用于定义属性动画的 XML 文件。/res/anim/
存放:用于定义渐变动画的 XML 文件。/res/color/
存放:用于定义颜色状态列表的 XML 文件。/res/animator/
存放:用于定义属性动画的 XML 文件。/res/drawable/
存放:图片文件,位图文件,或者对应的可使用的 XML 文件。/res/mipmap/
存放:适用于不同启动器图标密度的可绘制对象文件。一般用于存放 ICON 文件。/res/layout/
存放:用于定义用户界面布局的 XML 文件。/res/menu/
存放:用于定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件。/res/raw/
存放:要以原始形式保存的任意文件。/res/values/
存放:包含字符串、整型数和颜色等简单值的 XML 文件。一般指的是属性配置参数及控件组件显示的文字。/res/xml/
存放:可以在运行时通过调用 Resources.getXML() 读取的任意 XML 格式配置文件。
字符串,颜色,尺寸
案例:字符串,颜色,尺寸的具体定义和使用
就是在对应的xml文件中添加内容就可以了
Drawable
案例:使用图片资源
图片放在Drawable中,引用加@
案例:使用State List 制作按钮按下变色的效果
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--非按下状态的颜色-->
<item
android:state_pressed="false"
android:color="#ff000000"/>
<!-- 按下状态的颜色-->
<item
android:state_pressed="true"
android:color="#ffff0000"/>
</selector>
(一)android:drawable
这个属性是必须的,为当前控件指定资源。(二)android:state_pressed
布尔值。true指当用户点击或者触摸该控件的状态。默认为false;一般用于设置按钮颜色/图片的设置。(三)android:state_focused
布尔值。ture指当前控件获得焦点时的状态。默认为false;一般用于EdiText。(四)android:state_hovered
布尔值。true表示光标移动到当前控件上的状态。默认为false;光标是否悬停,通常与state_focused 相同,它是4.0的新特性,一般用于EdiText。(五)android:state_selected
布尔值。true表示被选择的状态,例如在一个下拉列表中用方向键下选择其中一个选项。
这个和focus的区别,selected是focus不充分的情况。比如一个listview获得焦点(focus),而用方向键选择了其中的一个item(selected)(六)android:state_checkable
布尔值。ture表示可以被勾选的状态。这个仅在当控件具有被勾选和不被勾选的状态间转换时才起作用。(七)android:state_checked
布尔值。true表示当前控件处于被勾选(check的状态)(八)android:state_enabled
布尔值。true表示当前控件出于可用的状态。比如可以被点击(九)android:state_activated
布尔值。true表示当前控件被激活的状态。
android:state_window_focused
布尔值。true表示当前控件出于最前端时,应用窗口获得焦点的状态。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity2d28">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="Click me"
android:textColor="@drawable/drawable"/>
</LinearLayout>
案例:使用shape Drawable制作圆形矩形的编辑框
android:shape="rectangle"形状为矩形 <gradient/>定义渐变色 android:startColor="#999999"渐变起始颜色 android:endColor="#ffffff"渐变结束颜色 android:angle="0"渐变角度 0代表从左到右,90代表从上到下 <corners/>定义角为圆角 <stroke/>定义线的颜色和宽度
Style
案例:使用style统一设置文字的大小和颜色
style好处就是减少代码的工作量
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TextStyle">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#00ff00</item>
</style>
</resources>
国际化
案例:制作同样的按钮在不同的语言环境下的显示
国际化是值同一个应用在不改变逻辑结构的情况下,在不同语言环境中可以有不同的显示。例如将手机的语言环境切换为英文,许多应用会自动显示为英语。以字符串资源为例,实现国际化创建values文件夹,values文件夹的命名方式为values-语言码-r国家码,例如values-zh-rCN代表简体中文,values-en-rUS代表美式英语
事件处理和消息传递
案例:Handler基于回调事件的处理
package com.example.commoncontrols2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity2d27 extends AppCompatActivity {
private final int MSG_ID=1001;
private TextView txt;
private MyHandler mHandler=new MyHandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_activity2d27);
txt=(TextView) findViewById(R.id.txt);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
int num=new Random().nextInt(1000);
Message msg=new Message();
msg.what=MSG_ID;
msg.obj=num;
mHandler.sendMessage(msg);
}
},1000,1000);
}
private class MyHandler extends Handler {
public void handleMessage(Message msg){
switch (msg.what){
case MSG_ID:
{
int num=(Integer)msg.obj;
txt.setText("The num is"+num);
break;
}
default:
super.handleMessage(msg);
break;
}
}
}
}
每隔一秒生成一个随机数
private MyHandler mHandler=new MyHandler(); 定义一个Handler对象
new Timer().schedule(new TimerTask() {使用Timer启动一个定时任务
@Override
public void run() {
int num=new Random().nextInt(1000);生成一个随机数
Message msg=new Message();//定义一个消息体
msg.what=MSG_ID;//设置消息ID
msg.obj=num;//设置消息内容
mHandler.sendMessage(msg);//使用Handler发送消息
}
},1000,1000);//每隔一秒执行一次 一个是延迟 第二个是隔一秒
private class MyHandler extends Handler继承Handler类