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);
@Override
public 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


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。