资源:放在res目录。
大纲:
- 字符串
- 颜色
- 尺寸
- 布局
- 数组
- 图像:drawable、mipmap
- 主题和样式
- 菜单:选项菜单、上下文菜单
- Android程序国际化
一、字符串资源
- 定义字符串资源文件,
“用<string>来定义”
- 使用字符串资源:在XML文件中或在Java文件中
定义:特别注意是小写的!!!
<string name="app_name">Demo</string>
app_name为字符串名称,Demo为字符串即显示文字。
XML中使用:
android:text="@string/motto"
@string/字符串名称
在Java中使用,也称动态设置:
textView.setText(getResources().getString(R.string.motto));
或textView.setText(R.string.motto)
或String s = getResources().getString(R.string.hello);
只有对字符串赋值时,需要使用getResources();一般方法中字符串作为参数的话,直接使用R.string.xxx的格式就可以了。
实例:实现一个Windows Phone风格的方格子界面,通过字符串资源设置文字
效果:
代码太简单了就不写了。
二、颜色资源
颜色值的定义:
#+透明度+R+G+B
若不指定透明度,则为完全不透明。
- 定义颜色资源文件。
‘用<color>定义’
- 使用颜色资源。XML/JAVA
在XML中使用:
android:textColor="@color/title"
在Java中使用:
textView.setTextColor(getResources().getColor(R.color.title));
三、尺寸资源
dp:设备独立像素,用于设置边距和组件大小
sp:可伸缩哦像素,用于设置字体大小。
定义尺寸资源文件:<dimen>
在XML中使用:
android:textSize="@dimen/title"
在Java中使用:
textView.setTextSize(getResources().getDimension(R.demen.title));
四、布局资源
在Java文件中使用:
setContentView(R.layout.activity_main);
在布局文件xml中使用:需要一个布局文件包含另一个布局文件。
<include layout="@layout/image"
五、数组资源
数组:具有相同数据类型的一组数据的集合。
android中支持使用数组,但不推荐在Java文件中定义数组,而是推荐使用数组资源文件进行定义。
定义数组资源文件:
<array>子元素,定义普通类型的数组,元素类型可为颜色、字符串、尺寸资源。
<integer-array>子元素,元素为整数,可为各个进制的整数。
<string-array>子元素,元素为字符串。
创建一个array.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="listitem">
<item>可爱</item>
<item>嘻嘻</item>
<item>啦啦</item>
</string-array>
</resources>
在XML文件中使用:
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/listitem"
android:id="@+id/listview"></ListView>
在Java文件中使用:
String[] arr=getResources().getStringArray(R.array.listitem);
六、Drawable资源
两大类:
- 图片资源
- StateListDrawable资源,状态列表资源。
注:android中图片资源不可有大写字母,且不能以数字开头!
.9.png图片制作:
1、androidsdk→tools→draw9patch。
设置可缩放区域
2、在AS中右击图片选择Create 0-patch file。
七、StateListDrawable资源(状态列表资源)
StateListDrawable为定义在XML文件中的Drawable对象,实现不同状态呈现不同图像。
定义StateListDrawable资源文件:Drawable右击→New→Drawable resource xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:color="#f60"></item>
<item android:state_focused="false" android:color="#0a0"></item>
</selector>
XML中使用:点击时(获得焦点)橙色,否则绿色。
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="卡哇伊"
android:textColor="@drawable/edittext_focused"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@drawable/edittext_focused"
android:text="可爱"
/>
实例:模拟登陆微信页面,要求使用9-patch图片作为按钮的背景,并让按钮背景随状态变化而改变。
效果:(懒得P登录二字上去啦!)
创建StateListDrawable资源文件:button_enabled.xml文件
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:drawable="@drawable/green2"/>
<item android:state_enabled="false" android:drawable="@drawable/green1"/>
</selector>
activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@drawable/wechat"
tools:context="com.example.asus.demo.MainActivity">
<TextView
android:layout_width="370dp"
android:layout_height="wrap_content"
android:text="2920292029"
android:layout_marginLeft="40dp"
android:layout_marginTop="130dp"/>
<EditText
android:id="@+id/edittext"
android:layout_width="370dp"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:inputType="textPassword"
android:layout_marginLeft="40dp"
android:layout_marginTop="170dp"
/>
<Button
android:id="@+id/button"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="50dp"
android:background="@drawable/button_enabled"
android:enabled="false"
android:layout_gravity="center_horizontal"/>
</RelativeLayout>
MainActivity.java文件
package com.example.asus.demo;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button button= (Button) findViewById(R.id.button);
final EditText editText= (EditText) findViewById(R.id.edittext);
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) {
}
});
}
}
八、mipmap资源
mipmap一般放应用图标,可以提高图片渲染速度和质量。
mipmap和drawable的区别
mipmap存放应用程序启动图标
drawable存放背景、作为修饰等文件。
即除了启动图标,基本上都放在drawable中。
九、主题资源
用于窗口的主题样式。
除了使用Android提高的主题,还可自定义主题资源。
定义主题资源文件在res→values→styles中进行定义,用style进行定义。
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
<!-- 自定义主题资源,样式继承自AppTheme。特别注意name和parent中间要有空格,否则报错。-->
<style name="bgTheme" parent="@style/AppTheme">
<item name="android:windowNoTitle"></item>
<item name="android:windowBackground">@drawable/t4</item>
</style>
</resources>
主题资源的使用:
在manifest.xml文件中使用:
android:theme="@style/bgTheme"
在Java文件中使用:
setTheme(R.style.bgTheme);
特别注意:在java中设置,要在setContentview之前使用,否则将不起作用。
九、样式资源
样式也用style来定义。
主题和样式两者的区别:
- 主题:设置整个app或窗口样式
- 样式:设置组件的样式
样式资源的定义,在res→values→styles中进行定义,用style进行定义。
<!-- 设置文字大小和颜色,用两个Item标记,name为修改属性,两个Item中间为属性值-->
<style name="title">
<item name="android:textSize">30sp</item>
<item name="android:textColor">#06F</item>
</style>
<style name="content" parent="title">
<item name="android:textSize">18sp</item>
</style>
Style可继承,方便更改。如上例,更改颜色时,只需更改一个。
实例:模拟今日头条的新闻页面,实现使用样式资源设置新闻内容的样式。
效果:
style.xml文件
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
<style name="black">
<item name="android:textStyle">bold</item>
<item name="android:textColor">@color/black</item>
</style>
<style name="black_center" parent="black">
<item name="android:layout_gravity">center_horizontal</item>
</style>
</resources>
activtity_main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.asus.demo5.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="3月起明令禁止网络暴力人肉搜索等违法活动"
android:layout_margin="5dp"
style="@style/black"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="3月1日起,《网络信息内容生态治理规定》开始实行。规定明确,网络信息内容服务使用者和生产者、平台,不得开展网络暴力、人肉搜索、深度伪造、流量造假、操纵账号等违法活动。"
android:layout_margin="5dp"
/>
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/tu1"
android:layout_margin="5dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="新闻主播报道"
style="@style/black_center"
/>
</LinearLayout>
十、菜单资源
常见菜单:选项菜单、上下文菜单。
菜单资源文件通常放在res中的menu中,android默认不创建menu目录,故自建:右击res→New→directory。
然后在右击menu→new→menu xml→取名字.xml。创建成功
定义菜单文件:title为显示文字。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="message" android:title="消息"></item>
<item android:id="home" android:title="首页"></item>
<item android:id="help" android:title="帮助"></item>
<item android:id="feedback" android:title="我要反馈"></item>
</menu>
1、创建选项菜单
选项菜单:手机菜单键或小圆点弹出的菜单项。
菜单项的创建有两种方式:
1、通过R.menu创建
getMenuInflater().inflate(R.menu.main, menu);
2、通过menu直接添加
menu.add(Menu.NONE, ITEM_ID, 3, “设置字体样式”);
//参数的含义: 参数一 组别 如果不分组就用 Menu.NONE
//参数二:id :Android根据ID来确定不同的菜单
//参数三:顺序 菜单的显示顺序
//参数四: 菜单项的显示文本
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater =new MenuInflater(this);
menuInflater.inflate(R.menu.menu, menu); //通过R.menu添加
return super.onCreateOptionsMenu(menu);
}
2、创建上下文菜单
即长按2s以上时弹出的菜单。
注册上下文菜单的方法: registerForContextMenu()
添加上下文菜单的方法:在OnContextCreate中,
MenuInflater inflater=new MenuInflater(this);
inflater.inflate(R.menu.menu, menu);
实例:长按朋友圈文字,弹出上下文菜单
效果:
menu.xml文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_copy" android:title="复制"></item>
<item android:id="@+id/menu_collect" android:title="收藏"></item>
<item android:id="@+id/menu_tran" android:title="翻译"></item>
<item android:id="@+id/menu_report" android:title="举报"></item>
</menu>
MainActivity.java文件
package com.example.asus.demo;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
private TextView introduce;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//为文本框注册上下文菜单
introduce= (TextView) findViewById(R.id.text);
registerForContextMenu(introduce);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
MenuInflater inflater=new MenuInflater(this);
inflater.inflate(R.menu.menu, menu);
}
//重写onContextItemSelected()方法,指定各个菜单项被选择时,所应做的处理。
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId())
{
case R.id.menu_copy:
Toast.makeText(MainActivity.this, "已复制", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_collect:
Toast.makeText(MainActivity.this, "已收藏", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_tran:
Toast.makeText(MainActivity.this, "已翻译", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_report:
Toast.makeText(MainActivity.this, "已举报", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
}