1. Spinner的功能与用法
Spinner是一个列表选择框(弹出一个菜单供用户选择)
Spinner和Galley都继承于AbsSpinner,AbsSpinner继承于AdapterView,所以它也表现出AdapterView的特征:只要为AdapterView提供Adapter即可。
如果开发者使用Spinner时已经可以确定下拉列表框里的列表项,则直接指定android:entries属性即可;如果程序需要在运行时动态决定Spinner的列表项,则需要使用Adapter为Spinner提供列表项
实例:
在界面布局文件下线性布局两个Spinner组件:
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/books"
android:prompt="@string/tip"
/>
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:prompt="@string/tip"
/>
第一个Spinner使用@array/books指定数组资源需在res/valus目录下使用xml文件定义:
<?xml version="1.0"encoding="utf-8"?>
<resources>
<string-array name = "books">
<item>如何阅读一本书</item>
<item>拆掉思维的墙</item>
<item>做最好的自己</item>
</string-array>
</resources>
第二个Spinner需在Activity中采用ArrayAdapter提供列表项:
public class SpinnerText extends Activity {
Spinner spinner;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.spinner_text);
//获取布局文件中的Spinner组件
spinner = (Spinner) findViewById(R.id.spinner);
String[] arr = {"中兴", "华为", "联想"};
//创建ArrayAdapter对象
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice, arr);
//为Spinner设置Adapter
spinner.setAdapter(adapter);
}
}
效果:
2.画廊视图(Gallery)的功能和用法
Gallery的父类也是:AbsSpinner,也是一个列表框,Gallery显示的是一个水平的列表选择框,允许用户通过拖动来查看上一个、下一个列表项。
实例:
界面布局线性ImageView组件和Gallery组件:
<!-- 定义一个ImageView组件 -->
<ImageView android:id="@+id/imageView"
android:layout_width="320dp"
android:layout_height="320dp"
/>
<!-- 定义一个Gallery组件 -->
<Gallery android:id="@+id/gallery"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:unselectedAlpha="0.6"
android:spacing="2pt"
/>
Activity代码添加一个Adapter对象,并绑定OnItemSelectedListener监听器,目的让ImageView显示Gallery选中的图片:
BaseAdapteradapter = new BaseAdapter()
{
@Override
public int getCount() {
return imageIds.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
//该方法返回的View代表了每个列表项
@Override
public View getView(int position, View convertView, ViewGroupparent) {
//创建一个ImageView
ImageView imageView = new ImageView(GalleryText.this);
imageView.setImageResource(imageIds[position]);
//设置ImageView的缩放类型
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
//为imageView设置布局参数
imageView.setLayoutParams(new Gallery.LayoutParams(75,100));
TypedArray typedArray =obtainStyledAttributes(R.styleable.Gallery);
imageView.setBackgroundResource(typedArray.getResourceId(
R.styleable.Gallery_android_galleryItemBackground, 0));
return imageView;
}
};
gallery.setAdapter(adapter);
gallery.setOnItemSelectedListener(new OnItemSelectedListener()
{
//当Gallery选项中项发生变化时触发该方法
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
imageView.setImageResource(imageIds[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
PS:Android中R.styleable无法解析时候的解决办法
程序编译时出错,提示说“R.styleable无法解析,或者它不是字段” 在网上查了下,说R.styleable在SDK1.5中已经不再支持,所以会出现这个错误。解决方法如下:
在res/values目录下新建styleable.xml,添加内容
<?xml version="1.0"encoding="utf-8"?>
<resources>
<declare-styleable name="Gallery">
<attr name="android:galleryItemBackground"/>
</declare-styleable>
</resources>
问题解决
(android已不再推荐使用Gallery组件。尽量少使用。)
效果:
3.AdapterViewFlipper的功能和用法
AdapterViewFlipper继承了AdapterViewAnimator,它也会显示Adapter提供的多个View组件,但每次只能显示一个View组件,程序可通过showPrevious()和showNext()方法控制该组件显示上一个、下一个组件。
AdapterViewFlipper可以在多个View切换过程中使用渐隐渐现的动画效果,还可以调用该组件startFlipper()控制它“自动播放”。
实例:
Xml布局文件包含一个AdpaterViewFlipper:
<AdapterViewFlipper
android:id="@+id/flipper"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:flipInterval="5000"
android:layout_alignParentTop="true"
/>
包含三个按钮:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:onClick="prev"
android:text="上一个"
/>
另外两个修改onClick,text即可```````
Activity代码,创建一个BaseAdapter对象,并创建三个按钮onClick事件提供处理方法
BaseAdapteradapter = new BaseAdapter()
{
@Override
public int getCount() {
return imageIds.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
//该方法返回的View代表了每个列表项
@Override
public View getView(int position, View convertView, ViewGroupparent) {
//创建一个ImageView
ImageView imageView = new ImageView(AdapterViewFlipperT.this);
imageView.setImageResource(imageIds[position]);
//设置ImageView的缩放类型
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
//为imageView设置布局参数
imageView.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
return imageView;
}
};
flipper.setAdapter(adapter);
}
public void prev(View source)
{
//显示上一个组件
flipper.showPrevious();
//停止自动播放
flipper.stopFlipping();
}
public void next(View source)
{
//显示下一个组件
flipper.showNext();
//停止自动播放
flipper.stopFlipping();
}
public void auto(View source)
{
//开始自动播放
flipper.startFlipping();
}
Ps:在源工程文件下直接改API version
程序编译时出现错误View requires API level 11 (current min is 8)
解决方法:
在工程下找到 AndroidManifest.xml 文件 打开它 修改成
<uses-sdk android:minSdkVersion="8" /> 就可了
效果:
4.StackView的功能和用法
StackView也是AdapterViewAnimator的子类,以叠加方式显示多个列表项
实例:
Xml布局文件创建一个StackView和两个按钮
<StackView
android:id="@+id/stackView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:loopViews="true"/>
Activity中创建一个SimpleAdapter和两个按钮的onCLick事件处理方法
//创建一个ListView对象,List对象的元素是Map
List<Map<String, Object>>listItems = new
ArrayList<Map<String,Object>>();
for(int i=0; i<imageIds.length; i++)
{
Map<String, Object> listItem = new
HashMap<String,Object>();
listItem.put("image", imageIds[i]);
listItems.add(listItem);
}
//创建一个SimpleAdapter
SimpleAdapter simpleAdapter = new SimpleAdapter(this,
listItems, R.layout.cell,
new String[]{"image"}, new int[]{R.id.image1});
stackView.setAdapter(simpleAdapter);
}
public void prev(View view)
{
//显示上一个组件
stackView.showPrevious();
}
public void next(View view)
{
//显示下一个组件
stackView.showNext();
}
PS:eclipse中clean的作用
由于eclipse的编译是基于时间戳的判断机制的。
因此当你按build all的时候有些eclipse认为时间戳没有改变的类不会被编译。
因此你可以先clean一下再编译。这个时候eclipse会将所有的以前编译信息清除然后编译。
eclipse --->project ----->clean...
选项将工程中的.class文件删除,同时重新编译工程,类似于jbuild中的rebuild
效果: