关于View和Widget的一些属性,请参见“Android中文翻译组——Android中文API——android.widget合集(中)”
有些属性是一些控件特有的
有些属性是冲突的,根据优先级决定是否有效
TextView中比较重要的有:
1、能在文字的各个方向展示一张图片,省却了布局的一些麻烦
android:drawableBottom | 在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。 |
android:drawableLeft | 在text的左边输出一个drawable,如图片。 |
android:drawableRight | 在text的右边输出一个drawable,如图片。 |
android:drawableTop | 在text的正上方输出一个drawable,如图片。 |
android:drawablePadding | 设置text与drawable(图片)的间隔,与drawableLeft、drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。 |
代码还可以通过textView.setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)方法设定上下左右的图像
2、文字过长时的处理
android:ellipsize | 设置当文字过长时,该控件该如何显示。有如下值设置:”start”—–省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动) |
跑马灯效果
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:focusable="true"
android:focusableInTouchMode="true"
必须设为单行显示
focusable是切换得到的焦点,focusableInTouchMode是手指点击获得焦点,
这两项也要设置才能实现跑马灯效果
3、设置文字宽度
android:ems | 设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度 |
4、选中高亮颜色
android:shadowColor | 指定文本阴影的颜色,需要与shadowRadius一起使用。 |
5、autoLink TextView中出现网页、邮箱、电话等时自动识别,打开连接或拨号
android:autoLink | 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all) |
android:linksClickable | 设置链接是否点击连接,即使设置了autoLink。 |
android:textColorLink | 文字链接的颜色. |
6、使用Html
TextView textView = (TextView)findViewById(R.id.textView);
textView.setText(Html.fromHtml("<br>Hi<br><img src=\"***\">"));
Any <img> tags in the HTML will display as a generic replacement image which your program can then go through and replace with real images.
图片下载需要耗时,会显示替代图片,直到你自己覆盖这个图片
Html.fromHtml还有一个方法
public static Spanned fromHtml (String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler)
Any <img> tags in the HTML will use the specified ImageGetter to request a representation of the image (use null if you don't want this) and the specified TagHandler to handle unknown tags (specify null if you don't want this).
处理<img>标签和任何未知的标签
Html.ImageGetter imageGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
if(source != null) {
// 这样可以将图片插入到文字中间
BitmapDrawable returnDrawable = (BitmapDrawable)getResources().getDrawable(R.drawable.image);
// BitmapDrawable必须要设置 setBounds
returnDrawable.setBounds(0, 0, returnDrawable.getIntrinsicWidth(), returnDrawable.getIntrinsicHeight());
return returnDrawable;
} else {
return null;
}
}
};
Html.TagHandler tagHandler = new Html.TagHandler() {
// 读取每一个标签,遇到未知标签时进行处理
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
Toast.makeText(MainActivity.this, tag, Toast.LENGTH_SHORT).show();
}
};
TextView textView = (TextView)findViewById(R.id.textView);
textView.setText(Html.fromHtml("<br>Hi<br><img src=\"***\">", imageGetter, null));
7、Span机制:SpannableStringBuilder和SpannableString灵活拼接字符串
TextView textView = (TextView)findViewById(R.id.textView);
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("大家好,今天天气不错哦!");
// 除了ImageSpan,还有其他的各种设置颜色、蒙版、点击事件等等的Span类 ,都在android.text.style包中
ImageSpan imageSpan = new ImageSpan(MainActivity.this, R.drawable.image);
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "点击", Toast.LENGTH_SHORT).show();
}
};
// ImageSpan设置的图片会插在4和5的位置之间,第四个参数在Spanned类中有说明
// setPan的第四个参数是是否包含起始/结束的点
spannableStringBuilder.setSpan(imageSpan, 4, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// ClickableSpan设定0-4之间的点击事件
spannableStringBuilder.setSpan(clickableSpan, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannableStringBuilder);
Button中比较重要的有
1、点击变换的背景图片,设置一个selector
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:state_focused="true" android:drawable="@drawable/button_bg_01_press" />
<item android:state_pressed="false" android:state_focused="true" android:drawable="@drawable/button_bg_01_press" />
<item android:state_pressed="true" android:state_focused="false" android:drawable="@drawable/button_bg_01_press" />
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/button_bg_01" />
<item android:drawable="@drawable/button_bg_01" />
</selector>
这里要注意:
最后一条表示:什么属性都不设的时候总是用button_bg_01
但是这个代码逻辑的实现是使用的if-else方式,
所以如果这条语句放在最前面的话就会无论如何都不会变换
所以,如果要设置什么属性都不带的状态时,一定要放在最后,或者直接不要使用
2、onClick、onLongClick这些点击事件的本质是onTouchEvent
如果同时设置了onClick和onLongClick事件,那么默认情况下长按时两个方法都会被调用
可以再onLongClick事件执行完毕后return true;表示事件已经被处理,这样就不会调用onClick事件了
ToggleButton中比较重要的有:
1、onCheckedChangeListenner与onCheckedChanged方法
2、xml属性:android:textOn, android:textOff,
background + selector
或者在OnCheckedChangeListener中切换背景图
CheckBox中比较重要的有:
1、onCheckedChangeListener与onCheckedChanged方法
RadioGroup中比较重要的有:
1、RadioGroup中包含若干个RadioButton
2、
RadioGroup radioGroup = (RadioGroup)findViewById(R.id.radioGroup);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId){
case R.id.radio0:
break;
case R.id.radio1:
...
default:
break;
}
}
});
详细出处参考:http://www.jb51.net/article/34180.htm
3、
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@null"
android:drawableLeft="@android:drawable/btn_star"/>
android:button选项设置为@null,能把RadioButton的默认图标(圆点)隐藏
android:drawableLeft可以自己设定图片的样式
可以使用自己的图片,也可以使用系统自带的图片,如这段示例代码中的
系统自带图片的位置在源码目录\frameworks\base\core\res\res的相关drawable目录中
4、RadioGroup可以当做工具条
Adapter模式
1、
数据源:一组数据的集合
2、常用的Android adapter
最基本的是Adapter的接口,下面分为了ListAdapter和SpinnerAdapter两个接口
BaseAdapter同时实现了这两个接口,所以是一般自己定义Adapter的基类
3、步骤
(1)建立数据源
(2)建立adapter
(3)建立adapter - source连接
(4)绑定adapter到界面组件
Spinner中比较重要的有:
1、建立一个基本的Spinner
<Spinner
android:id="@+id/planets_spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
<item>Jupiter</item>
<item>Saturn</item>
<item>Uranus</item>
<item>Neptune</item>
</string-array>
</resources>
Spinner spinner = (Spinner) findViewById(R.id.spinner);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.planets_array, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);
public class SpinnerActivity extends Activity implements OnItemSelectedListener {
...
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
// An item was selected. You can retrieve the selected item using
// parent.getItemAtPosition(pos)
}
public void onNothingSelected(AdapterView<?> parent) {
// Another interface callback
}
}
2、xml中的属性
android:prompt 弹出的选择框的标题
android:entries 绑定数据(一般不用这个)
3、OnItemSelectedListener中包含onItemSelected和onNotiongSelected方法
public class SpinnerActivity extends Activity implements OnItemSelectedListener {
...
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
// An item was selected. You can retrieve the selected item using
// parent.getItemAtPosition(pos)
}
public void onNothingSelected(AdapterView<?> parent) {
// Another interface callback
}
}
4、自定义Adapter
package com.primemobi.PrimeToday.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
/**
* Created by Administrator on 14-1-14.
*/
public class UserAdapter extends BaseAdapter {
List<User> mUsers;
Context mContext;
public UserAdapter(Context context, List<User> users){
mContext = context;
mUsers = users;
}
@Override
public int getCount() {
return mUsers.size();
}
@Override
public Object getItem(int position) {
return mUsers.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// convertView : The old view to reuse, if possible.
convertView = LayoutInflater.from(mContext).inflate(R.layout.***, null);
TextView textView = (TextView)convertView.findViewById(R.id.textView);
// ....
return convertView;
}
}
ProgressBar中比较重要的有:
1、 横向进度条是因为使用了系统样式
style="?android:attr/progressBarStyleHorizontal"
定义在\frameworks\base\core\res\res\values\attrs.xml中
2、
public class MyActivity extends Activity {
private static final int PROGRESS = 0x1;
private ProgressBar mProgress;
private int mProgressStatus = 0;
private Handler mHandler = new Handler();
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.progressbar_activity);
mProgress = (ProgressBar) findViewById(R.id.progress_bar);
// Start lengthy operation in a background thread
new Thread(new Runnable() {
public void run() {
while (mProgressStatus < 100) {
mProgressStatus = doWork();
// Update the progress bar
mHandler.post(new Runnable() {
public void run() {
mProgress.setProgress(mProgressStatus);
}
});
}
}
}).start();
}
}
3、
android:progress 一级进度
android:secondaryProgress 二级进度(例如视频缓存时用)
SeekBar中比较重要的有:
1、android:thumb 设定拖动按钮(进度拖动块)的图片
2、OnSeekBarChangeListener下的方法:
onStartTrackingTouch、onProgressChanged、onStopTrackingTouch
SeekBar seekBar = (SeekBar)findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
QuickContactBadge中比较重要的有:
这是继承自ImageView的控件,类似contact头像
点击了会像通讯录一样弹出拨打电话或者短消息
QuickContactBadge quickContactBadge = (QuickContactBadge)findViewById(R.id.quickContactBadge);
// String phoneNumber
// boolean lazyLookup : 设为true的话点击才会查询
quickContactBadge.assignContactFromPhone("12345678901", true);
找到的话会显示手机号为12345678901的用户的通讯录页面
找不到的话会提示添加手机号到联系人
RatingBar中比较重要的有:
OnRatingBarChangeListener 中的 onRatingChanged方法
EditText中比较重要的有:
1、获取焦点
<EditText android:layout_width="fill_parent" android:layout_height="wrap_content">
<requestFocus></requestFocus>
</EditText>
android:inputMethod 弹出的输入法是哪一个,填应用包名
3、android:numeric 切换数字输入法
android:digital 显示的内容是数字
4、在drawable中自定义shape
<?xml version="1.0" encoding="utf-8"?>
<!-- 定义一个矩形圆形,颜色为红色,愿景为5dp半径 -->
<!-- shape也有相关属性,android:shape中可以定义形状为line/oval/rectangle/ring -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 拐角,可以设置统一拐角圆半径,也可以单独设置 -->
<corners android:radius="5dp"></corners>
<solid android:color="#FF0000" ></solid>
</shape>
5、EditText的android:drawableLeft设置的图是包含在EditText内部的
AutoCompleteTextView中比较重要的有:
1、
public class CountriesActivity extends Activity {
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.countries);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line, COUNTRIES);
AutoCompleteTextView textView = (AutoCompleteTextView)
findViewById(R.id.countries_list);
textView.setAdapter(adapter);
}
private static final String[] COUNTRIES = new String[] {
"Belgium", "France", "Italy", "Germany", "Spain"
};
}
每一行的布局这里用到的是系统自带的,可以由用户自己定义
2、在xml中也有一些特殊的属性
ListView中比较重要的有:
1、xml中的属性
android:divider 分隔线的设置
android:choiceMode 有singleChoice和multiplChoice选项,设置多选还是单选(配合系统定义的view)
2、继承自ListActivity可以通过getListView()获取一个内置的ListView,但是用起来并不灵活
3、onItemClick和onItemSelect的区别:select是获得焦点就执行
4、观察者模式(发布—订阅模式)
Subject是被观察者的接口,Observer是观察者的接口
ConcreteSubject和ConcreteObserver分别是两个接口的实现类
就如同Adapter的notifyDataSetChanged()一样,当数据发生变化是通知ListView
查看这一部分的源码:
首先看到ArrayAdapter的源码,发现它的notifyDataSetChanged里面调用的是父类的方法
查看BaseAdapter的源码
我们看到有一个DataSetObservable类的对象,这个类继承自Observable,这就是我们的被观察者了
(Adapter本身不是被观察者,而是Adapter里的DataSetObservable对象是被观察者)
DataSetObservable的源码
调用了每个观察者的onChanged的方法(这个方法实现在Java中的Observer类中)
查看ListView的代码,setAdapter方法
我们发现是绑定了一个AdapterDataSetObserver的对象的,这个类是ListView的一个内部类
被调用onChanged时,会调用AdapterView下同名类的方法
我们发现其实notifyDataSetChanged的时候,是有重新requestLayout的
5、Cursor Adapter
// 数据集
Cursor cursor = getContentResolver().query(Contacts.Phones.CONTENT_URI, null, null, null, null);
// Cursor Adapter
SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this,
R.layout.list_item, cursor,
new String[]{Contacts.Phones.NAME, Contacts.Phones.NUMBER},
new int[]{R.id.text1, R.id.text2});
ExpandableListView中比较重要的有:
1、可以继承ExpandableListActivity实现,同继承自ListActivty
2、需要分别设置group和child的数据源和layout,同时group的布局还分为展开和闭合两种
GridView中比较重要的有:
1、好吧,也确实没什么可写的,看看xml中的相关属性吧
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show();
}
});
}
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
return imageView;
}
// references to our images
private Integer[] mThumbIds = {
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7
};
}
ScrollView中比较重要的有:
1、ScrollView也是一个FrameLayout,由于FrameLayout 是一个容器,并且有且仅有一个子元素
所以ScrollView也只能有一个子元素,通常用LinearLayout
2、通常将其放在根元素上(命名空间xmlns应该放到根元素上)
3、android:scrollbarThumbVertival android:scrollbarTrackVertical可以设置侧边进度条样式
4、有时需要获取滑动到的位置(等以后实验补上)
SlidingDrawer中比较重要的有:
1、
<SlidingDrawer
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:handle="@+id/handle"
android:content="@+id/content">
<ImageView
android:id="@id/handle"
android:layout_width="88dip"
android:layout_height="44dip" />
<GridView
android:id="@id/content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</SlidingDrawer>
SlidingDrawer的属性android:handle和android:content是指向两个组件(例如包含在内的ImageView和GridView)的
android:handle是SlidingDrawer关闭时打开的按钮的
android:content是SlidingDrawer打开时的页面的的界面
2、SlidingDrawer的一些属性
android:animationOnClick 打开的动画效果(也可以调用系统自带的,有些可能没效果)
3、事件的监听:OnDrawerOpenListener和OnDrawerCloseListener(滑动完成才调用)
4、SlidingDrawer关闭时的界面设置在外面就可以,或者在SlidingDrawer的background中设定一个布局
TabHost中比较重要的有:
1、TabHost是整个页面,包含Tab页跟每页的内容,是一个整的控件,继承自FrameLayout
而TabWidget是只有Tab页部分(头部分)的空间,继承自LinearLayout
2、布局
3、可以继承TabActivty实现
4、TabHost.TabSpec设定每一页,添加到TabHost(每一页内容都是个Activity,通过Intent传入)
添加每一页到TabHost就可以了,setCurrentTab设置当前显示哪一页
5、onTabChanged,处理一些切换页面的事件
WebView中比较重要的有:
1、loadData、loadDataWithBaseUrl、loadUrl等方法加载内容
ImageView中比较重要的有:
1、ImageButton继承自ImageView,但是会自动加上Button的背景,只要设置了background就能消掉
(ImageButton的图片跟ImageView一样,是通过android:src属性设置上的)
Gallery中比较重要的有:
1、
Gallery gallery = (Gallery)findViewById(R.id.gallery);
gallery.setAdapter(new ImageAdapter());
gallery.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
});
ImageSwitcher中比较重要的有:
1、ImageSwitcher、ImageSwitcher 本质上都是ViewSwitcher,
ImageSwitcher的很多方法和属性都在父类的ViewSwitcher中
2、ImageSwitcher一般都是与Gallery配合使用,下面放Gallery展示小图,上面用ImageSwitcher展示图片
3、可以设置android:inAnimation 和 android:outAnimation效果
4、
ImageSwitcher imageSwitcher = (ImageSwitcher)findViewById(R.id.imageSwitcher);
// 必须要设置一个工厂,返回一个View
imageSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
return new ImageView(MainActivity.this);
}
});
imageSwitcher.setImageResource(mImages[mIndex]);
ImageSwithcher只是一个容器,需要setFactory返回一个View
源码:
DatePicker中比较重要的有:
1、配置显示时间,年份范围等等属性
2、有一个初始化方法
init(int year, int monthOfYear, int dayOfMonth, OnDateChangedListener onDateChangedListener)
3、init初始化方法,传入初始化时间,以及一个Listener监测日期改变
DatePicker datePicker = (DatePicker)findViewById(R.id.datePicker);
Calendar calendar = Calendar.getInstance();
datePicker.init(calendar.get(Calendar.YEAR) + 1,
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
}
});
下面开始讲解布局
公共属性
控件外部的相关属性都有layout_前缀
而空间内部的相关属性都不带
1、layout_width,layout_height
注意:父子控件layout属性不要相互依赖
2、layout_weight 是一个float型的参数
如果设为0,表示不拉伸,否则按照比重分配剩余空间进行拉伸
这样如果平行有两个控件,比如一个TextView和EditText,
TextView长度固定,需要EditText填满整个一行
只需要将TextView的layout_weight属性设为0,或者直接不设置该属性
将EditText的layout_weight的属性随便设置,例如设为1,
则由EditText独自分配所有剩余的空间
说明:layout_weight分配的是空间中分配给空间后的剩余控件的比重
3、gravity 有子对象针对子对象,没有子对象针对空间内部内容起作用
layout_gravity是该控件在父对象控件中的位置
4、layout_margin 是控件外部的间距
padding是控件内部的间距
FrameLayout中比较重要的有:
FrameLayout is designed to block out an area on the screen to display a single item.
Generally, FrameLayout should be used to hold a single child view, because it can be difficult to organize child views in a way that's scalable to different screen sizes without the children overlapping each other.
You can, however, add multiple children to a FrameLayout and control their position within the FrameLayout by assigning gravity to each child, using the android:layout_gravity
attribute.
RelativeLayout中比较重要的有:
既然是相对的,就要有参照物
1、layout_above 系列:与其他控件的位置关系(以哪个对象为参照物)
2、layout_alignLeft系列:与其他控件的对齐关系
3、layout_alignParentLeft系列:与父控件的对齐关系
TableLayout中比较重要的有:
1、不用指定TableRow的layout_width和Layout_height,默认指定
2、如果TableRow的parent不是TableLayout,则会转为水平的LinearLayout
3、TableLayout属性
CollapseColumns:哪些列缩起
ShrinkColumns:哪些列拉伸(完全按照宽度全部展开)
StretchColumns:哪些列拉伸(分配剩余控件排布,超过长度会自动换行,不会超出屏幕范围)
4、TableRow.LayoutParams属性
android:layout_column :控件放到第几列
android:layout_span:控件横跨几列
Fragment中比较重要的有:
<include>其他界面中比较重要的有:
titlebar.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width=”match_parent”
android:layout_height="wrap_content"
android:background="@color/titlebar_bg">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/gafricalogo" />
</FrameLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:background="@color/app_bg"
android:gravity="center_horizontal">
<include layout="@layout/titlebar"/>
<TextView android:layout_width=”match_parent”
android:layout_height="wrap_content"
android:text="@string/hello"
android:padding="10dp" />
...
</LinearLayout>