0
点赞
收藏
分享

微信扫一扫

7.Android学习之资源访问(二)

非常帅气的昵称吧 2022-04-13 阅读 47

目录

7.资源访问(二)

4.布局资源(layout)

5.数组资源(array)

5-1.定义数组资源文件

5-2.使用数组资源

6.图像资源

6-1.Drawable资源

6-2.mipmap资源


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/文件名
举报

相关推荐

0 条评论