Android高级应用开发(基础篇) - stage6 - 学习笔记(中)

来源:互联网 发布:网络监控4根网线接法 编辑:程序博客网 时间:2024/06/07 06:28

关于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、onCheckedChangeListenneronCheckedChanged方法


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;                }            }        });


去除RadioButton前面的圆点adioButton.setButtonDrawable(android.R.color.transparent); 

详细出处参考: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 layoutArrayAdapter<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 appearsadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// Apply the adapter to the spinnerspinner.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>



2、android:inputType 输入文本类型

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>



0 0