Android基础知识

来源:互联网 发布:淘宝购物付款流程图 编辑:程序博客网 时间:2024/05/21 22:34

总结

一、CommonLayout

1、LinearLayout  线性布局

对于布局或者控件来说,设置高度、宽带时,值有4种:

属性:android:orientation="vertical"设置子控件的排序顺序

  值有两种:vertical垂直  horizontal水平

 

2、RelativeLayout相对布局(使用最多的一种布局)

常用属性:

第一类:其属性值为truefalse

android:layout_alignParentLeft="true"   //贴紧父元素的左边缘

android:layout_centerHorizontal="true"  //水平居中

第一类:其属性值必须为id的引用名"@id/id_name"

android:layout_below="@id/btn01"        //在某元素的下方

android:layout_alignBaseline="@id/btn02"//本元素和某元素的基线对齐

android:layout_toStartOf="@id/btn03"   //从在某元素的开始

    android:gravity=""放在里面的子控件的位置(多个值用“|”隔开)

android:layout_gravity=""本身的位置

 

3、FrameLayout帧布局|框架布局

使用FrameLayout布局时,默认情况下后面放的控件会把前面控件覆盖

 

二、CommonLayout布局优化

1)、优化层次的结构(越浅越好,例如:借助merge标签合并相同元素)

2)、优化对象个数(越少越好)

3)、优化布局的可重用性(借助include标签)

4)、优化对象的加载时机(延迟加载,借助ViewStub)

5) 

三、CommonLayout扩展

1、ScrollView垂直滚动

 继承自FramLayout 垂直滚动:

              里面不允许直接放TextView等,可以放布局里面放TextView...

 

2、HorizontalScrollView水平滚动

 android:scrollbars="none"设置没有滚动条;

3、TextSwitcher(文本切换器)

4、ImageSwitcher(图片切换器)

构建或者获得ImageSwitcher对象、

   设置View工厂(setFactory)、

   设置动画Animation、

   显示图片(setImageResourse() ),如果是SD卡(Image)

四、Adapter Layout

应用场合:由具体的Adapte Layout对象决定,常用的AdapterLayout对象有:

1、ListView (以列表形式显示数据)

2、GridView(以网格形式显示数据)

3、Spinner(以下拉列表形式显示数据)

4、ViewPager(以分页形式显示数据)

5、 ........

Adapter Layout的构成及原理分析:

1、AdapterLayout对象(负责显示)

2、Adapter对象(构建Item)

3、Context 对象(资源访问对象)

4、View对象(呈现item数据)

5、Data对象(代表数据)

 

Adapter Layout(ListView)

ListView应用的基本实现

1、ListView对象的构建(item)

2、ArrayAdapter对象的构建(数组适配器)

3、ListView关联adapter

代码:

//系统的布局文件

        ListView lsv=(ListView) findViewById(R.id.lsId);

        ArrayAdapter<String> adapter =new ArrayAdapter<String>(

                this,

                R.layout.eg,//样式(可从系统获取)

                R.id.text01  //样式的ID

                ,list);

        //ListView关联Adapter

        lsv.setAdapter(adapter);

 

静态方法构建Adapter

部分代码:

//静态方法构建Adapter

ArrayAdapter<CharSequence> adapter=ArrayAdapter.createFromResource(

this,

R.array.itemarray,//在textArrayResId(res/values/strings.xml)

android.R.layout.simple_list_item_1);

 

ListView中的Adapter:Simple

SimpleAdapter:(List<?Extends Map<String,?>)?号代表任意类型;

第一个?必须是Map类型的子类;

 

adapter扩展及优化

1、自定义适配器:当官方给定的adapter不能满足我们需求时,我们可以自己定义adapter;我们自己定义的adapter需要直接或间接的继承BaeAdapter(代码量比较大),或者继承BaseAdapter的子类(稍微简单一些);然后根据实际的需要重写相关方法;其他的方法类似,只是注意:getView()方法不同;

定义一个类继承BaseAdapter抽象类,重写抽象类中的抽象方法;根据需要确定该适配器的构造方法的参数,然后ListView关联该适配器;

重用convertView的目的是减少ItemView的构建

减少findViewByid方法执行次数;(思路是对查找到的对象进行记录,如何记录?)应用场合是:数据量比较大的时候,数据量少的时候并没有此必要;

部分代码:

 * 此方法用于构建item(包饺子)listview中每显示一个item就 会调用一次此方法

     */

    @Override

    public View getView(intposition, ViewconvertView, ViewGroupparent) {

        Log.i("TAG", "getView.convertView=" + convertView);

        // 1.item view (饺子皮对象)

        View v = null;

        ViewHolder vh = null;

        if (convertView ==null) {

            // 构建Item view对象(饺子皮)

            v = View.inflate(getContext(),R.layout.list_item_02,null);

            // 构建viewholder,借助此对象记录item view中子元素的位置

            vh = new ViewHolder();

            vh.imageView = (ImageView)v.findViewById(R.id.imageView1);

            vh.textView = (TextView)v.findViewById(R.id.textView1);

            // item view关联view holder

            v.setTag(vh);//每个view都有此方法

        } else {

            v = convertView;// 实现ConvertView对象的重用

            vh = (ViewHolder) v.getTag();

        }

        // 2.item data (饺子馅)

        City c = getItem(position);

        // 3.set item data to item view(包饺子,对号入座)

        // 将city中的数据放到对应位置

        vh.imageView.setImageURI(Uri.fromFile(new File(c.getLogo())));

        vh.textView.setText(c.getName());

        return v;// 包好的饺子

    }

    /** 要借助此类型的对象记录itemview中子元素的位置 */

    class ViewHolder {

        ImageView imageView;

        TextView textView;

    }

ListView的点击事件:

点击(短按)事件:(OnItemClickListener)点击ListView的item时会执行该事件;

onItemClick(AdapterView<?> parent, Viewview,intposition,longid)

Parent:点击的ListView(父类引用指向子类对象)

View:被点击的item;

Position:当前应用中的item的位置;

Id:当前应用中的id的值;

 

parent.getItemAtPosition(position);根据此方法获得该item位置的信息;

 

让选中位置高亮显示(设置选中的是文本,选中时变蓝色,否则是白色):

//设置模式(单选)

lsvNav.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

parent.getSelectedItemPosition();选中的位置;

刷新:parent.getAdapter().notifyDataSetChanged();

重写getView()方法;

public View getView(intposition, ViewconvertView, ViewGroupparent) { //包饺子(父类以实现的)

TextView tv=(TextView) super.getView(position,convertView,parent);

    //获得选中的位置

    int checked=lsvNav.getCheckedItemPosition();

    if(position==checked){

        tv.setTextColor(Color.BLUE);                  

    }else{

        tv.setTextColor(Color.WHITE);

    }

    return tv;

 

ListView中元素的排序:

实现:对数据集中的数据进行排序;其次刷新排序以后的结果(刷新ListView列表页面);

 

ListView中元素的分块显示:

要求:数据量比较小,且是一次性加载完成;数据已经有序;

实现方式:①对元素进行排序;②每个Item都添加一个TextView显示;③隐藏部分Item对象的首字母的显示;

部分代码(排序及分块显示):

// 4.实现分块显示

// 4.1获得当前位置的section(块)的ASCII

int section = getSectionForPosition(position);

// 4.2获得section(块)在listview中最小位置

int minPos = getPositionForSection(section);

// 4.3隐藏非最小位置section对应的nameKey

if (position ==minPos) {

    vh.nameKey_tv.setVisibility(View.VISIBLE);

} else {

    vh.nameKey_tv.setVisibility(View.GONE);

}

// 获得当前位置的section(块)的ASCII

private int getSectionForPosition(intposition) {

// 获得当前位置中的item,获得nameKey,获得nameKey的第一个首字母的大写字母

    return getItem(position).getNameKey().toUpperCase().charAt(0);

    }

 

// 获得section(块)在listview中的最小位置

public int getPositionForSection(intsection) {

// 遍历所有位置

    for (inti = 0,count = getCount();i <count;i++) {

        int sec = getSectionForPosition(i);

        if (sec ==section) {

            return i;// minPos找到最小的位置

        }

    }

    return -1;//没有找到

    }

 

ListView中元素的右侧导航;

    ①应用场合:数据有分块显示的场合;

    ②实现方式:在页面中添加一个listView;实现右侧ListView中数据的显示;

    ③点击右侧ListView列表定位具体分块;

去掉分割线:android:divider="@null"

ListView中:setSelectionFromTop(position,y);方法;y:偏移量;

部分代码(点击右侧导航栏中的大写字母跳到相应的城市位置)

public voidonItemClick(AdapterView<?> parent, Viewview,intposition,longid) {

        // 4.1获得点击的item内容(section)

        String item = (String) parent.getItemAtPosition(position);

        // 4.2获得item对应的section

        int section = item.charAt(0);

        // 4.3根据此section获得在citys列表中的section的最小位置

        int minPos = cityAdapter.getPositionForSection(section);

        // 4.4设置此citys列表的顶端显示为section的最小位置

        if (minPos == -1) return;

        lsv.setSelectionFromTop(minPos, 0);// 0表示没有偏移

        // 通知更新(高亮显示)

        adapter.notifyDataSetChanged();

        }

});

 

ExpandableListView扩展的ListView

一个特殊的ListView,是ListView的一个扩展;实现了一种抽屉功能;可以拉开也可以合上;可以对ListView中的内容进行分组,并可以实现分组的展开或者收起操作。

设置默认位置展开  :elsv.expandGroup(0);

设置默认位置收起  :elsv.collapseGroup(0);

 

Spinner(下拉列表):会以下拉列表的形式显示

两级联动:在spinner1中设置setOnItemSelectedListener事件,重写事件中onItemSelected方法

部分代码:(点击spinner1时,spinner2中数据会和spinner1中数据对应)

public voidonItemSelected(AdapterView<?> parent, Viewview,intposition,longid) {

                childCity.clear();

                //获得数据

                childCity.addAll(Arrays.asList(qu[position]));

                //更新列表

                childAdapter.notifyDataSetChanged();

            }

 

GridView

网格的形式显示数据,首先也需要借助adapter将对应的数据构建成item,然后显示

拉伸图片:iv.setScaleType(ScaleType.FIT_XY);

设置网格中的列数:gd.setNumColumns(2);//设置列数

 

GridView中选择器Selector设置

一般与view对象的状态结合使用,大多数是应用于view背景或字体;

注:背景和字体分开写selector

选择器的创建:

目录:res/drawable/selector.xml

访问:android:background="@drawable/grid_item_selector_01"

格式:

<selectorxmlns:android="http://schemas.android.com/apk/res/android">

   <itemandroid:drawable="@color/gray"               android:state_pressed="true"></item>

   <itemandroid:drawable="@color/white"

android:state_pressed="false"></item>

</selector>

字体颜色的设置(选择文本是,文本的颜色改变):

创建:

目录:values/color.xml

访问: android:background="@drawable/grid_item_color_01"

格式:

<resources>

    <color name="white">#ffffffff</color>

    <color name="gray">#ffeeeeee</color>

</resources>

<selectorxmlns:android="http://schemas.android.com/apk/res/android">

    <itemandroid:color="#ffffffff"  android:state_pressed="true"></item>

</selector>

 

ViewPager分页

ViewPager以分页形式显示数据,它在显示这些数据是,首先会借助adapter将数据构建成item,然后显示。

实现:获得viewpager对象(Android.support.v4.viewpager)

 构建adapter(BannerAdapter extends PagerAdapter)

 关联adapter

 添加监听事件

部分代码(广告条(滑动是跳转)):

//构建PagerAdapter

        public int getCount() {

            return 2;//两个页面跳转

        }

        @Override

        public boolean isViewFromObject(View arg0, Objectarg1) {

            return arg0==arg1;//两个参数相等时实现跳转

        }

        @Override

        public Object instantiateItem(ViewGroup container,intposition) {        //item view

            ImageView iv=new ImageView(SecondActivity.this);

            iv.setScaleType(ScaleType.FIT_XY);//拉伸图片

            //item data

            int pager_iv=pagerImage[position];

            iv.setImageResource(pager_iv);

            container.addView(iv);

            returniv;

        }

}

 

页面指示器的设置(广告条下的小圆点)

1)定义一个线性布局

2)在线性布局中动态添加imageview(几个小圆点)

3)在页面滑动时动态修改页面指示器imageview的状态(enable状态)

4)点击页面指示器小圆点跳转到不同的页面

(viewpager.setCurrentItem(position))

 

延时加载(自动跳转):

部分代码(广告条,不用滑动,自动跳转)

//延迟加载器

    handler.postDelayed(new Runnable() {

    @Override

    public void run() {

        index++;

        vPager.setCurrentItem(index%2);//index%2表示加载2个页面时,%只能是0或者1,在两个页面之间跳转

        handler.postDelayed(this, 1000);//回调自身方法,实现循环跳转

    }

    }, 1000);//1000表示1000毫秒(1秒)之后自动跳转

 

扩展:Button按钮选择器的设置

Selector(引入两个shape)

<shape xmlns:android="http://schemas.android.com/apk/res/android">

<!-- 借助此元素定义view的颜色 -->

    <solid android:color="#ff996600" />

    <!-- 借助此元素定义view的进行角度设置 -->

    <cornersandroid:radius="8dp"/>

    <!-- <stroke />描边 -->

</shape>

目录:res/drawable/shap_01.xml

   res/drawable/shap_01.xml

 

跳转页面并将下个页面的信息回传给本页面

部分代码(点击button按钮跳转到CityActivity页面,然后在CityActivity中选择完信息之后跳回到button页面,在button上显示选择的信息):

public void onClick(View v){

    //启动Activity跳转返回结果

    startActivityForResult(new Intent(this, CityActivity.class),100);

    }

    /**通过此方法获得返回的数据*/

    @Override

protected void onActivityResult(intrequestCode,intresultCode, Intentdata) {//判断请求码和响应码是否

        if(requestCode==100&&resultCode==200){

            //获得回传回来的数据

            String cityName=data.getStringExtra("cityname");

            click_btn.setText(cityName);

        }

    }

// 设置跳转回传数据给启动此activity的那个activity

        // 将要回传的数据封装到intent

        Intent intent = new Intent();

        // 获得要回传的数据

        intent.putExtra("cityname",citys.getName());

        // 设置响应码及回传数据

        setResult(200, intent);

        // 关闭当前页面

    finish();

 

0 0
原创粉丝点击