//array/
然后在在arrays.xml中使用<string-array>或者<integer-array>标签定义数组:<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="languages">
<item>c语言</item>
<item>java </item>
<item>php</item>
<item>xml</item>
<item>html</item>
</string-array>
<integer-array name="reminder_methods_values" translatable="false">
<item>1</item>
<item>2</item>
<item>3</item>
</integer-array>
</resources>
在java代码中引用
Resources res =getResources();
String[] languages = res.getStringArray(R.array.languages);
String[] reminder_methods = res.getIntArray(R.array.reminder_methods_values);
在xml中引用
这里以spinner控件为例,因为spinner的entries属性刚好需要的是数组资源
<Spinner
android:id="@+id/spinner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/languages"
/>
注意上面引用的时候是@array。
//attrs/
添加文件attrs.xml,位于res\values目录下<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="myView">
<attr name="textColor" format="color"/>
<attr name="textSize" format="dimension"/>
</declare-styleable>
</resources>
创建自定义控件,继承 某 控件,组合控件
//自定义新控件/
自定义继承控件还好说,但是继承view所有的都要自己写就麻烦很多。下面是简单的继承viewpublic class MyView extends View {
private Paint mPaint;
private static final String mString = "Welcome to Mr Wei's blog";
public MyView(Context context) {
super(context);
mPaint = new Paint();
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
TypedArray a = context.obtainStyledAttributes(attr, R.styleable.myView);//TypedArray是一个数组容器
float textSize = a.getDimension(R.styleable.myView_textSize, 30);//防止在XML文件里没有定义,就加上了默认值30
int textColor = a.getColor(R.styleable.myView_textColor, 0xFFFFFFFF);//同上,这里的属性是:名字_属性名
myPaint.setTextSize(textSize);
myPaint.setColor(textColor);
a.recycle();//我的理解是:返回以前取回的属性,供以后使用。以前取回的可能就是textSize和textColor初始化的那段
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//设置填充
mPaint.setStyle(Style.FILL);
//画一个矩形,前俩个是矩形左上角坐标,后面俩个是右下角坐标
canvas.drawRect(new Rect(10, 10, 100, 100), mPaint);
mPaint.setColor(Color.BLUE);
//绘制文字
canvas.drawText(mString, 10, 110, mPaint);
}
}
//XML中的命名空间/
Android自定义控件的属性,在xml中使用自己自定义的attr的时候,其中有一步就是要自定义一个xml的命名空间后然后再给自定义属性赋值,现在发现不知道什么时候开始Android把这个改了,现在发现可以统一用
xmlns:app="http://schemas.android.com/apk/res-auto"
而不是原来的:
xmlns:app="http://schemas.android.com/apk/App的Package名"
xmlns:tools="http://schemas.android.com/tools"
这些属性用于渲染布局,而不会影响到程序运行。也就是说只在预览布局时出现,在程序运行时相当于该属性不存在。
///组合控件//
1,activity中使用平常的布局layoutA2,layoutA中有自定义控件com.lgq.view.ItemTextView如下,带有公共属性,还有自定义属性app:***,
使用app:***需要在根控件中添加xmlns:app="http://schemas.android.com/apk/App的Package名"
<com.lgq.view.ItemTextView
android:id="@+id/mobile_number_itv"
app:item_edit_hint="请输入手机号"
app:item_lable="手机号">
</com.chinasoft.wubafd.view.ItemTextView>
3,app:**后面的属性,来自attrs中的定义的属性,如下:
<resources>
<declare-styleable name="item_text_view">
<attr name="item_lable" format="string|integer"></attr>
<attr name="item_edit_hint" format="string|integer"></attr>
</declare-styleable>
</resources>
4,那么这些属性是怎么添加到自定义控件当中的呢,请看:我下面是做组合控件的使用,不是做一个新的控件。
定义一个MyView继承你的布局文件(如:LinearLayout)
MyView的构造函数中inflate一个布局,进行控制:
<pre name="code" class="java"> //填充布局R.layout.item_text_view,就是简单的布局
LayoutInflater.from(context).inflate(R.layout.item_text_view, this, true);
//得到布局中的控件
itemLable = (TextView) findViewById(R.id.item_lable);
//得到atrrs中命名的item_text_view的属性集合控制
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.item_text_view);
//获得item属性的值
CharSequence lableText = typedArray.getText(R.styleable.item_text_view_item_lable);
//把属性设置到某个控件
if (lableText != null)
itemLable.setText(lableText);
//记得要关闭
typedArray.recycle();
5.这样就可以用一个控件,控制,多个控件。
//dimens/
1,尺寸控制。2,同时可以做屏幕适配控制,和drawable的原理是一样的。创建多个文件,适应不同分辨率。网上有很多自动生成的教程。
http://blog.csdn.net/ocean20/article/details/23353663
//strings/
1,一般用法String mess = getResources().getString(R.string.mess_1);
<string name="exchange_txt_hint"><Data><![CDATA[请使用<font color="#ff0000"><b>%1$s</b></font>牛兑换<font color="#00ff00"><b>%2$s</b></font>%3$s 上网时长]]></Data></string>
tv = (TextView) findViewById(R.id.tv);
String exchange = getResources().getString(R.string.exchange_txt_hint);
tv.setText(Html.fromHtml(exchange));
<string name="hello_Box">hello & Box</string>
实际应该写成:<string name="hello_Box">hello & Box</string>
<string name="baoxiang">您今天打了%1$d局,还差%2$d局可获得%3$s!</string>
%1$d表达的意思是整个name=”baoxiang”字符串中,第一个整型
String text = String.format(getResources().getString(R.string.baoxiang), 2.18,"银宝箱");
结果您今天打了 2 局,还差 18 局可获得 银宝箱 !
//color/
颜色控制//style/
样式控制,命名,以及继承1,控件样式:单个控件属性统一监控
2,主题样式:app样式监控