·
·点此进入上篇:
·
·
·
·
·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、调用PopupWindow的showAsDropDown(View view)方法将PopupWindow作为view的组件的下拉组件显示出来,或者调用PopupWindow的showAtLocation方法将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.inflate或ViewStub.setVisibility(View.VISIBILE)方法ViewStub才会装载引用的控件。
·
·ViewPager多页面滑动效果: 略
·
·ListView列表控件
?Android中的列表控件飞创灵活,可以自定义每一个列表项,实际上每一个列表项就是一个View,
在Android定义了3个列表控件:ListView、ExpandableListView和Spinner,其中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