目录
7.资源访问(二)
4.布局资源(layout)
布局资源是Android 中最常用的一种资源。
在Android中,将布局资源文件放置在res\layout目录下,布局资源文件的根元素通常为各种布局管理器,在该布局管理器中,放置各种View组件或是嵌套的其他布局管理器。
布局文件创建完成后,可以在Java代码或是XML文件中使用。在Java代码中,可以通过下面的语法格式访问布局文件:
[<package>.]R.layout.<文件名>
例如,在MainActivity的onCreate() 方法中,可以通过下面的代码指定该Activity 应用的布局文件为main.xml:
setContentView(R.layout.activity_main);
在XML文件中,可以通过下面的语法格式访问布局资源文件:
@[<package>:]layout.文件名
例如,如果要在一个布局文件main.xml中包含另一个布局文件image.xml,可以在main.xml文件中使用下面的代码:
<include layout="@layout/image" />
5.数组资源(array)
同Java一样,Android中也允许使用数组。但是在Android中,不推荐在Java文件中定义数组,而是推荐使用数组资源文件来定义数组。
5-1.定义数组资源文件
数组资源文件要放置在res\values目录下。在使用Android Studio创建Android 项目后,并没有在values目录下自动创建数组资源文件,需要手动创建(例如arrays.xml) 。定义数组时XML资源文件的根元素是<resources></resources>标记,在该元素中可以包括以下3个子元素:
◆<array> 子元素:用于定义普通类型的数组。
◆<integer-array>子元素:用于定义整数数组。
◆<string-array>子元素:用于定义字符串数组。
注:创建数组资源文件的方法可参考3-2小节中的创建尺寸资源文件的方法。
无论使用哪一个子元素,都可以在子元素的起始标记中使用name属性定义数组名称,并且在子元素的起始标记和结束标记中间使用<item></item>标记定义数组元素。
例如,要定义一个名称为listitem.xml的数组资源文件,并在该文件中添加一个名称为“listItem”、包括3个数组元素的字符串数组,可以使用下面的代码:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<string-array name="listItem" tools:ignore="ExtraTranslation">
<item>账号管理</item>
<item>手机号码</item>
<item>辅助功能</item>
</string-array>
</resources>
5-2.使用数组资源
定义数组资源后,就可以在Java或XML文件中使用该数组资源了。
◆在Java文件中使用数组资源的语法格式如下:
[<package>.]R.array.数组名
例如,在MainActivity中,要获取名称为“listItem” 的字符串数组,可以使用下面的代码:
String[] arr=getResources().getStringArray(R.array.listItem);
◆在XML文件中使用数组资源的基本语法格式如下:
@[<package>:]array/数组名
例如,在定义ListView组件时,通过字符串数组资源为其指定android:entries 属性的代码如下:
<ListView
android:id="@+id/listView1"
android:entries="@array/listItem"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
例:
res\values\arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 颜色数组-->
<integer-array name="bgcolor">
<item>0xBBE24A83</item>
<item>0xBB318AD6</item>
<item>0xBBD73943</item>
<item>0xBBE69A08</item>
<item>0xBBBD9663</item>
<item>0xBBD45ABC</item>
<item>0xBB4AA6D6</item>
<item>0xBB8064D2</item>
<item>0xBBF7A81E</item>
</integer-array>
<!-- 文字数组-->
<string-array name="word">
<item>微信</item>
<item>通讯录</item>
<item>QQ</item>
<item>相机</item>
<item>时钟</item>
<item>备忘录</item>
<item>音乐</item>
<item>互联网</item>
<item>邮件</item>
</string-array>
</resources>
MainActivity.java
package com.example.arrayresource;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar=getSupportActionBar();
actionBar.hide();
//文本框组件ID
int[] tvid={R.id.main_tv1,R.id.main_tv2,R.id.main_tv3,R.id.main_tv4,
R.id.main_tv5,R.id.main_tv6,R.id.main_tv7,R.id.main_tv8,R.id.main_tv9,};
//获取背景颜色数组
int[] color=getResources().getIntArray(R.array.bgcolor);
//获取显示文字数组
String[] word=getResources().getStringArray(R.array.word);
//通过for循环为每个文本框设置背景颜色和显示文字
for(int i=0;i<9;i++){
TextView tv=(TextView) findViewById(tvid[i]);
tv.setBackgroundColor(color[i]);
tv.setText(word[i]);
}
}
}
bug:我一开始颜色数组的item节点下写的是#BBE24A83,会报错,改成0xBBE24A83才没有报错了!!!
6.图像资源
6-1.Drawable资源
Drawable资源是Android应用中使用最广泛、灵活的资源。它不仅可以直接使用图片作为资源,而且可以使用XML文件作为资源,只要一个XML文件可以被系统编译成Drawable子类的对象,那么该XML文件就可以作为Drawable资源。
注: Drawable 资源保存在res\drawable 目录中,实际上,为了适应不同的屏幕分辨率,通常下将其保存在res\drawable-mdpi、res\drawable-hdpi、 res\drawable-xhdpi 等目录下,这几个目录需要用户手动创建。其中,res\drawable-mdpi 保存的是中等分辨率的图片; res\drawable-hdpi 保存的是中等分辨率的图片;res\drawable-xhdpi保存的是超高分辨率的图片。
1.图片资源
在Android中,不仅可以将扩展名 .png、.jpg 和 .gif 的普通图片作为图片资源,而且可以将扩展名为 .9.png的9-Patch图片作为图片资源。扩展名为 .png、.jpg 和 .gif的普通图片较常见,它们通常是通过绘图软件完成的。
9-Patch图片是一种被特殊处理过的 png图片,通常用作背景。与普通图片不同的是,使用9-Patch图片作为屏幕或按钮的背景时,当屏幕尺寸或者按钮大小改变时,图片可自动缩放,不会失真或变形。
例如,在制作聊天界面时,如果使用.png、.jpg等普通格式的图片作为收发消息的背景图,那么图片被拉伸后就会出现变形或失真,而使用9-Patch图片就可以完美地解决这个问题。
通过Android Studio生成扩展名为.9.png 的图片具体步骤如下:
(1)将需要生成扩展名为.9.png的图片复制到Drawable目录下,然后选中要制作为9-Patch图片的图片,单击鼠标右键,在弹出的快捷菜单中选择Create 9-Patch file选项,将显示Save As .9.png(保存.9图片)对话框,在该对话框中选择要保存的目录,再修改.9图片名称,如图7.11 所示。单击OK按钮后,Drawable 目录结构的效果如图7.12所示。
注:生成的9-Patch图片名称不能与普通图片名称相同,否则使用后程序将出错。
在使用图片资源时,首先将准备好的图片放置在res\drawable-xxx目录中,然后就可以在Java文件或XML文件中访问该资源。在Java代码中,可以通过下面的语法格式访问图片:
[<package>.]R.drawable.<文件名>
注:Android中不允许图片资源的文件名中出现大写字母,且不能以数字开头。
例如,在MainActivity中,通过图片资源为ImageView组件设置要显示的图片,可以使用下面的代码:
ImageView iv=(ImageView)findViewById(R.id.imageView1);
iV.setImageResource(R.drawable.head);
在XML文件中,可以通过下面的语法访问图片资源:
@[<package>.]drawable/文件名
例如,在定义ImageViev组件时,通过图片资源为其指定android:src属性,也就是设置要显示的图片,具体代码如下:
<ImageView
android:id="@+id/imageView1"
android:src="@drawable/head"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
注:在Android应用中,使用9-Patch图片时不需要加扩展名 .9.png。例如, 要在XML文件中使用一个名称为“mrbiao.9.png" 的9-Patch图片,可以使用@drawable/mrbiao来实现。
2.StateListDrawable 资源
StateListDrawable资源是定义在XML文件中的Drawable对象,能根据状态来呈现不同的图像。例如,一个Button组件存在多种不同的状态(pressed、enabled或focused等),使用StateListDrawable资源可以为按钮的每个状态提供不同的按钮图片。
StateListDrawable资源文件同图片资源一样,也是放在res\drawable目录中。StateListDrawable 资源文件的根元素为<selector></selector>,在该元素中可以包括多个<item></item>元素。每个Item元素可以设置以下两个属性。
◆android:color 或android:drawable:用于指定颜色或Drawable资源。
◆android:state_xxx:用于指定一个特定的状态,常用的状态属性如表7.3所示。
表8.3 StateListDrawable支持的常用状态属性
状态属性 | 描述 |
---|---|
android:state_active | 表示是否处于激活状态,属性值为true或false |
android:state_checked | 表示是否处于选中状态,属性值为true或false |
android:state_enabled | 表示是否处于可用状态,属性值为true或false |
android:state_first | 表示是否处于开始状态,属性值为true或false |
android:state_focused | 表示是否处于获得焦点状态,属性值为true或false |
android:state_last | 表示是否处于结束状态,属性值为true或false |
android:state_middle | 表示是否处于中间状态,属性值为true或false |
android:state_pressed | 表示是否处于被按下状态,属性值为true或false |
android:state_selected | 表示是否处于被选择状态,属性值为true或false |
android:state_window_focused | 表示窗口是否已经得到焦点状态,属性值为true或false |
创建一个根据编辑框是否获得焦点来改变文本框内文字颜色的StateListDrawable资源,名称为“edittext_focused.xml”,可以使用下面的代码:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:color="#f60" android:state_focused="true" />
<item android:color="#0a0" android:state_focused="false" />
</selector>
创建一个StateListDrawable资源后,可以将该文件放置在res\drawable目录下,然后在相应的组件中使用该资源即可。例如,要在编辑框中使用名称为“edittext_focused.xml” 的StateListDrawable资源,可以使用下面的代码:
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/edittext_focused"
android:text="请输入文字”/>
例:
activity_main.xml
<?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"
android:orientation="vertical"
android:paddingLeft="20dp"
android:paddingRight="20dp"
tools:context=".MainActivity">
<ImageView
android:id="@+id/main_touxiang"
android:src="@drawable/touxiang"
android:layout_gravity="center_horizontal"
android:layout_marginTop="80dp"
android:layout_width="100dp"
android:layout_height="100dp"/>
<TextView
android:id="@+id/main_username"
android:text="1234567890"
android:layout_gravity="center_horizontal"
android:textSize="18sp"
android:layout_marginTop="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/main_password"
android:layout_marginTop="10dp"
android:drawableLeft="@drawable/lock"
android:drawableRight="@drawable/close"
android:password="true"
android:drawablePadding="10dp"
android:hint="请输入密码"
android:textSize="22sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/main_login"
android:text="登录"
android:enabled="false"
android:background="@drawable/button_enable"
android:textColor="@color/white"
android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/main_tv2"
android:layout_gravity="center_horizontal"
android:text="登录遇到问题?"
android:textColor="#3949A1"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/main_tv3"
android:layout_gravity="center_horizontal"
android:text="更多"
android:textColor="#3949A1"
android:layout_marginTop="25dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
res\drawable\button_enable.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/green" android:state_enabled="true"/>
<item android:drawable="@drawable/green_mint" android:state_enabled="false"/>
</selector>
MainActivity.java
package com.example.drawableresource;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar=getSupportActionBar();
actionBar.hide();
//获取密码编辑框
final EditText editText=(EditText) findViewById(R.id.main_password);
//获取登录按钮
final Button button=(Button) findViewById(R.id.main_login);
//为编辑框设置监听事件
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if(editText.length()>0){//判断编辑框内输入文字时
button.setEnabled(true);//登录按钮为可用状态
}else {//编辑框内没有文字时
button.setEnabled(false);//登录按钮为不可用状态
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
}
注:头像图片采用的是普通PNG图片,设置固定尺寸不可拉伸,而登录按钮背景图片采用
StateListDrawable资源,可以根据按钮的状态自动改变。
6-2.mipmap资源
在使用Android Studio 创建Android项目时,res 目录下有一个mipmap文件夹。
◆在Java代码中,可以通过下面的语法格式访问mipmap资源:
[<package>.]R.mipmap.<文件名>
◆在XML文件中,可以通过下面的语法访问mipmap资源:
@[<package>:]mipmap/文件名