Android 学习(三)下: UI 控件

来源:互联网 发布:mac安装dmg文件失败 编辑:程序博客网 时间:2024/06/05 15:07
·
·点此进入上篇:
Android 学习(三)上: UI 控件
·
·
·
·
·AnalogClock和DigitalClock
// 获得当前的时间,获得小时和分钟Calendar calendar = Calendar.getInstance();hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);minute = calendar.get(Calendar.MINUTE);// 获得当前的秒year = calendar.get(Calendar.YEAR);monthOfYear = calendar.get(Calendar.MONTH);dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
public void onClick(View v) {    switch (v.getId()) {    case R.id.button1:        TimePickerDialog timePickerDialog = new TimePickerDialog(Main.this,                new MyTimePickerDialog(), hourOfDay, minute, true);        timePickerDialog.show();// 显示对话框        break;    case R.id.button2:        DatePickerDialog datePickerDialog = new DatePickerDialog(Main.this,                new MyDatePickerDialog(), year, monthOfYear, dayOfMonth);        datePickerDialog.show();// 显示对话框        break;    }}public class MyDatePickerDialog implements        DatePickerDialog.OnDateSetListener {    public void onDateSet(DatePicker view, int year, int monthOfYear,            int dayOfMonth) {        Toast.makeText(Main.this, "year:" + year + "monthOfYear:" + monthOfYear + "dayOfMonth:" + dayOfMonth, 1).show();    }}public class MyTimePickerDialog implements        TimePickerDialog.OnTimeSetListener {    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {        Toast.makeText(Main.this, "hourOfDay:" + hourOfDay + "minute:" + minute, 1).show();    }}
·ProgressBar:
OnCreate下:
// 如何设置窗口有刻度的效果requestWindowFeature(Window.FEATURE_PROGRESS);requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);setContentView(R.layout.main);progressBar = (ProgressBar) this.findViewById(R.id.progressbar);setProgressBarVisibility(true);setProgressBarIndeterminate(true);setProgress(3500);
public void onClick(View v) {    // TODO Auto-generated method stub    switch (v.getId()) {    case R.id.button1:        progressBar.setProgress((int) (progressBar.getProgress() * 1.2));        progressBar.setSecondaryProgress((int) (progressBar                .getSecondaryProgress() * 1.2));        break;    case R.id.button2:        progressBar.setProgress((int) (progressBar.getProgress() * 0.8));        progressBar.setSecondaryProgress((int) (progressBar                .getSecondaryProgress() * 0.8));        break;    }}
·RatingBar 评分控件
OnCreate下
ratingBar.setMax(100);// 设置最大刻度ratingBar.setProgress(20);// 设置当前的刻度ratingBar.setOnRatingBarChangeListener(this);
@Overridepublic void onRatingChanged(RatingBar ratingBar, float rating,        boolean fromUser) {    // TODO Auto-generated method stub    int progress = ratingBar.getProgress();    Toast.makeText(Main.this, "progress:" + progress + "rating:" + rating,            1).show();}
·ScrollView 垂直滚动控件
<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent" android:layout_height="wrap_content">    <LinearLayout android:layout_width="fill_parent"        android:orientation="vertical" android:layout_height="fill_parent">        <TextView android:layout_width="wrap_content"            android:layout_height="wrap_content" android:text="滚动视图"            android:textSize="30dp"></TextView>    </LinearLayout></ScrollView>
·HorizontalScrollView 水平滚动控件
<?xml version="1.0" encoding="utf-8"?><HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent" android:layout_height="wrap_content">    <LinearLayout android:orientation="horizontal"        android:layout_width="fill_parent" android:layout_height="fill_parent">        <ImageView android:layout_width="wrap_content"            android:layout_height="wrap_content" android:src="@drawable/item1"></ImageView>    </LinearLayout></HorizontalScrollView>
·Gallery 画廊控件
·只能显示一行,而且支持水平滑动效果
package com.android.mygallery; import android.app.Activity;import android.content.Context;import android.content.res.TypedArray;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Gallery;import android.widget.ImageView; public class Main extends Activity {    /** Called when the activity is first created. */    private Gallery gallery;    private ImageAdapter imageAdapter;    // 声明图片的数组    private int[] resIds = { R.drawable.item1, R.drawable.item2,            R.drawable.item3, R.drawable.item4, R.drawable.item5,            R.drawable.item6, R.drawable.item7, R.drawable.item8,            R.drawable.item9, R.drawable.item10, R.drawable.item11,            R.drawable.item12, R.drawable.item13, R.drawable.item14,            R.drawable.item15 };    // android的适配器    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        gallery = (Gallery) this.findViewById(R.id.gallery);        imageAdapter = new ImageAdapter(this);        gallery.setAdapter(imageAdapter);    }    public class ImageAdapter extends BaseAdapter {        private Context context;        int mGralleyItemBackground;// 使用简单的计数器,填充背景图片        public ImageAdapter(Context context) {            this.context = context;            // 读取属性            TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);            mGralleyItemBackground = typedArray.getResourceId(                    R.styleable.Gallery_android_galleryItemBackground, 0);        }        @Override        public int getCount() {            // TODO Auto-generated method stub            return Integer.MAX_VALUE;        }        @Override        public Object getItem(int position) {            // TODO Auto-generated method stub            return resIds[position];        }        @Override        public long getItemId(int position) {            // TODO Auto-generated method stub            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            // TODO Auto-generated method stub            // 自定义的适配器,需要用自定义的布局来显示,通常android的通用布局是不能满足我们的需求            // 可以手工创建一个View视图,也可以inflate填充一个XML            // 从数据源中根据position 获得每一个Item的值,填充到指定的XML布局中            // View convertView 是一个旧的布局,如果没有新的布局填充的时候,将使用旧的布局            // 当前的布局,会被追加到父布局中            ImageView imageView = new ImageView(context);            imageView.setImageResource(resIds[position % resIds.length]);            imageView.setScaleType(ImageView.ScaleType.FIT_XY);            imageView.setLayoutParams(new Gallery.LayoutParams(136, 88));            imageView.setBackgroundResource(mGralleyItemBackground);            return imageView;        }    }}
·PopupWindow
·ØPopupWindow 可以创建类似对话框风格的窗口,使用PopupWindow创建对话框风格的窗口只要实现两个步骤即可:
·Ø1、调用PopupWindow的构造器创建PopupWindow对象
·Ø2、调用PopupWindowshowAsDropDown(View view)方法将PopupWindow作为view的组件的下拉组件显示出来,或者调用PopupWindowshowAtLocation方法将PopupWindow在指定的位置显示出来。
·
·ImageSwitcher图片切换控件
·ØImageSwitcher控件可以用在不同的图像之间切换,其中切换的过程可以采用动画的方法,如淡入淡出的效果。
·ØImageSwitcher需要一个图像工厂(ViewFactory)来创建用于显示图像的ImageView对象,因此我们需要一个实现android.widget.ViewSwitcher.ViewFactory接口的类。
·
·GridView网格控件
·ØGridView控件用于显示一个网格图像, GridView主要是用在一些相册的布局显示图片。
·ØGridView采用的是二维表的方式显示单元格,就需要设置二维表的行和列。设置GridView的列可以使用<GridView>标签的columnWidth属性。也可以使用GridView类的setColumnWidth方法来设置列数,
·ØGridView中的单元格会根据列数自动拆行显示,因此不需要设置GridView的行数,但是需要设置android:numColumns属性。否则GridView只会显示一行。
·
·Spinner下拉列表控件
·ØSpinner控件用于显示一个下拉列表,该控件在装载数据的时候需要创建一个Adapter适配器对象。并在创建Adapter对象过程中指定要装载的数据是数组或者是List对象的数据
·1.MyAdapter.java
package com.android.adapter;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.android.myspinner.R;public class MyAdapter {    public MyAdapter() {}    public static List<String> getData() {        List<String> list = new ArrayList<String>();        list.add("北京");        list.add("上海");        list.add("广州");        return list;    }    public static List<Map<String, Object>> getListMaps() {        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();        Map<String, Object> map1 = new HashMap<String, Object>();        map1.put("ivLogo", R.drawable.calendar);        map1.put("applicationName", "日历");         Map<String, Object> map2 = new HashMap<String, Object>();        map2.put("ivLogo", R.drawable.eoemarket);        map2.put("applicationName", "eoemarket客户端");        list.add(map1);        list.add(map2);        return list;    }}
·2.OnCreate当中实现:
spinner = (Spinner) this.findViewById(R.id.spinner);List<String> list = MyAdapter.getData();ArrayAdapter<String> adapter = new ArrayAdapter<String>(Main.this,        android.R.layout.simple_spinner_item, list);spinner.setAdapter(adapter);spinner2 = (Spinner) this.findViewById(R.id.spinner2);// List<Map<String,Object>>List<Map<String, Object>> listmaps = MyAdapter.getListMaps();SimpleAdapter simpleAdapter = new SimpleAdapter(Main.this, listmaps,        R.layout.item, new String[] { "ivLogo", "applicationName" },        new int[] { R.id.imageview, R.id.textview });spinner2.setAdapter(simpleAdapter);spinner2.setOnItemSelectedListener(new OnItemSelectedListener() {    @Override    public void onItemSelected(AdapterView<?> parent, View view,            int position, long id) {        // TODO Auto-generated method stub        String appName = ((Map<String, Object>) spinner2                .getItemAtPosition(position)).get("applicationName")                .toString();        setTitle(appName);    }    @Override    public void onNothingSelected(AdapterView<?> parent) {    }});
·TabHost标签控件
Ø如果在屏幕上要放置很多的控件,可能一个屏放不下,除了使用滚动视图的方式外,还可以使用标签控件对屏幕进行分页显示,当单击标签控件的不同标签时,会显示当前标签的内容,
android系统中一个标签可以是一个View或者是Activity
ØTabHost是标签控件的核心类,也是一个标签的集合,每一个标签是TabHost.TabSpec对象。通过TabHost类的addTab的方法添加多个TabHost.TabSpec对象。
·
·ViewStub惰性装载控件
Ø之前我们介绍过<include>标签,该标签可以再布局文件中引用另外一个布局文件,这种方式是在布局文件中固定导入,使用起来不是很方便。
ØViewtSub的功能和<include>的功能类似,也是实现引用另外一个布局。但是唯一不同的是ViewStub并不会马上装载引用布局文件,
只有在调用了ViewStub.inflateViewStub.setVisibility(View.VISIBILE)方法ViewStub才会装载引用的控件。
·
·ViewPager多页面滑动效果: 略
·
·ListView列表控件
ØAndroid中的列表控件飞创灵活,可以自定义每一个列表项,实际上每一个列表项就是一个View
Android定义了3个列表控件:ListViewExpandableListViewSpinner,其中Spinner就是在Windows中常见的下拉列表框。
ØListView控件用于列表的形式显示数据, ListView控件采用MVC模式将前端显示和后端数据进行分离。
也就是说, ListView控件在装载数据时并不是直接使用ListView.add或者类似的方法添加数据,而是需要指定一个Adapter对象。
该对象相当于MVC模式中的C(控制器,Controller)ListView相当于MVC模式中的V(视图,View),用于显示数据。为ListView提供数据的List或数组相当于MVC模式中的M(模型,Model)
ØListView控件中通过Adapter对象获得需要显示的数据,在创建Adapter对象时需要指定要显示的数据(List或数组对象)
因此,要显示的数据与ListView之间通过Adapter对象进行连接,同时又互相独立,也就是说,ListView只知道显示的数据来自Adapter,并不知道这些数据来自List还是数组。
Ø对于数据本身来说,只是知道将这些数据添加到Adapter对象中,并不知道这些数据会被用于ListView控件或其他控。


ØMVC好处:MVC把应用程序的逻辑层与界面是完全分开的,最大的好处是:界面设计人员可以直接参与到界面开发,程序员就可以把精力放在逻辑层上。
而不是像以前那样,设计人员把所有的材料交给开发人员,由开发人员来实现界面。
Eclipes工具中开发Android采用了更加简单的方法,设计人员在AnroidDraw中设计界面,以XML方式保存,在Eclipes中直接打开就可以看到设计人员设计的界面。
逻辑处理的代码则放在src文件夹下。让程序员更专注与业务。
Ø1) 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。
Ø同时便于后期界面的修改。逻辑中与界面对应的id不变化则代码不用修改,大大增强了代码的可维护性。
Ø2) 控制层(Controller)Android的控制层的重任通常落在了众多的Acitvity的肩上,这句话也就暗含了不要在Acitivity中写代码,
要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
Ø3) 模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。就是应用程序中二进制的数据。
<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">                <LinearLayout android:layout_width="match_parent"                                android:layout_height="wrap_content" android:orientation="horizontal">                                <TextView android:id="@+id/pname" android:layout_width="wrap_content"                                                android:layout_height="wrap_content" android:layout_marginLeft="3dp"                                                android:layout_weight="1" android:textSize="15sp" android:text="产品名称" />                                 <TextView android:id="@+id/price" android:layout_width="wrap_content"                                                android:layout_height="wrap_content" android:layout_marginLeft="3dp"                                                android:layout_weight="1" android:textSize="15sp" android:text="产品价格" />                                 <TextView android:id="@+id/address" android:layout_width="wrap_content"                                                android:layout_height="wrap_content" android:layout_marginLeft="3dp"                                                android:layout_weight="1" android:textSize="15sp" android:text="产品产地" />                </LinearLayout>                <ListView android:layout_width="wrap_content"                                android:layout_height="wrap_content" android:id="@+id/listview" /></LinearLayout>
·MyDataSource.java
package com.android.android_listview;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class MyDataSource {    public MyDataSource() {}    public static List<Map<String, String>> getMaps() {        List<Map<String, String>> listMaps = new ArrayList<Map<String,String>>();        Map<String, String> map1 = new HashMap<String, String>();        map1.put("pname", "西瓜");        map1.put("price", "$2.30");        map1.put("address", "广西");        Map<String, String> map2 = new HashMap<String, String>();        map2.put("pname", "香蕉");        map2.put("price", "$9.30");        map2.put("address", "浙江");             Map<String, String> map3 = new HashMap<String, String>();        map3.put("pname", "苹果");        map3.put("price", "$99.99");        map3.put("address", "USA");                listMaps.add(map1);        listMaps.add(map2);        listMaps.add(map3);        return listMaps;    }}
·MainActivity.java
package com.android.android_listview;import java.util.List;import java.util.Map;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.ListView;import android.widget.SimpleAdapter;public class MainActivity extends Activity {    private ListView listView;    private SimpleAdapter adapter;    private List<Map<String, String>> data = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView = (ListView) this.findViewById(R.id.listview);        data = MyDataSource.getMaps();        adapter = new SimpleAdapter(MainActivity.this, data,                R.layout.activity_main, new String[] { "pname", "price",                        "address" }, new int[] { R.id.pname, R.id.price,                        R.id.address });        listView.setAdapter(adapter);    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }}
·
·
·
Over


1 0
原创粉丝点击