第 8 章 视图组(ViewGroup)和布局(Layout)的使用
8.2 几种独立使用的视图组
网页视图(WebView)是一个功能强大且常用的控件,它具有许多很好的特性,例如对 js 的支持,可用于 制作简易浏览器等。
参考示例程序:WebView1(ApiDemo=>Views=>WebView)
源代码:com/example/android/apis/view/WebView1.java 布局文件:webview_1.xml
WebView 程序的运行结果如图所示:
图 WebView 程序的运行结果
WebView 的类扩展关系如下所示:
=> android.view.View
=> android.view.ViewGroup
=> android.widget.AbsoluteLayout => android.webkit.WebView
WebView 本身扩展了 AbsoluteLayout(绝对布局),因此也是一个 ViewGroup,但是 WebView 不用于包 含其他的视图,而是像一个普通的控件一样使用。
布局文件 webview_1.xml 的内容片断如下:
<WebView android:id="@+id/wv1"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
/>
<WebView android:id="@+id/wv2"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
/>
<WebView android:id="@+id/wv3"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
/>
事实上,在本例中是使用了若干个 WebView 标签来实现显示的功能,每一个 WebView 标签显示为屏幕中 一行的内容。
Java 源代码中的部分内容如下所示:
wv = (WebView) findViewById(R.id.wv1);
wv.loadData("<a href='x'>Hello World! - 1</a>", mimeType, encoding);
WebView 的作用是可以在 Android 中支持一个 HTML 格式的元素。由此,虽然 WebView 也是一个视图组,
但是从使用上基本等同普通的控件。
8.2.2.旋转按钮
旋转按钮(Spinner)是具有类似菜单的按钮,可以选择其中的一项,一般可以使用单向和双向的箭头进行 选择。
参考示例程序:Spinner1(ApiDemo=>Views=>Spinner)
源代码:com/example/android/apis/view/Spinner1.java
=> aandroid.widget.AdapterView<T extends android.widget.Adapter>
=> aandroid.widget.AbsSpinner => aandroid.widget.Spinner
AdapterView<> 是 一 个 视 图 的 模 板 , 它 本 身 扩 展 了 ViewGroup , 具 体 的 内 容 由 其 中 定 义 的 android.widget.Adapter 类来确定。AbsSpinner 扩展了 AdapterView<>,Spinner 又扩展了 AbsSpinner。
在本例的 Java 源代码中,内容如下所示:
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.spinner_1);
Spinner s1 = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.colors, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(adapter);
Spinner s2 = (Spinner) findViewById(R.id.spinner2);
adapter = ArrayAdapter.createFromResource(this, R.array.planets, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s2.setAdapter(adapter);
}
setAdapter()是 AdapterView<>中的函数,通过建立一个 ArrayAdapter< CharSequence >将所需要的内容设置 到其中。res/values/array.xml 中定义的字符串数组(string-array)colors 表示 Spinner 中的内容。
<string-array name="colors">
<item>red</item>
simple_spinner_item 和 simple_spinner_dropdown_item 是 Android 中默认的样式,Android 中的 Spinner 在调用的 时候,会显示为一弹出的窗口,其中包含了各个选项。
8.2.3.文本切换器
文本切换器(TextSwitcher)是 Android 中一个集成化较高的控件,可以在多个文本之间切换,还可以设置 动画的效果。
参考示例程序:TextSwitcher1(ApiDemo=>Views=>TextSwitcher)
源代码:com/example/android/apis/view/TextSwitcher1.java 布局文件:text_switcher_1.xml
TextSwitcher1 程序的运行结果如图所示:
图 TextSwitcher1 程序的运行结果 这个示例的布局文件 text_switcher_1.xml 如下所示:
<Button android:id="@+id/next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/text_switcher_1_next_text" />
<TextSwitcher android:id="@+id/switcher"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
图的中间部分表示了一个文字切换器,使用 TextSwitcher 来实现。具体显示的内容由当前的 Activity 实现 ViewSwitcher.ViewFactory 接口来完成,实现其中的 makeView()方法,返回一个 TextView 类型。
TextSwitcher 类的扩展关系如下所示:
=> android.view.View
=> android.view.ViewGroup => android.widget.FrameLayout => android.widget.ViewAnimator => android.widget.ViewSwitcher => android.widget.TextSwitcher 本示例中为 TextSwitcher 类设置了动画:
public class TextSwitcher1 extends Activity implements ViewSwitcher.ViewFactory, View.OnClickListener {
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.text_switcher_1);
mSwitcher = (TextSwitcher) findViewById(R.id.switcher);
mSwitcher.setFactory(this);
Animation in = AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
Animation out = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
mSwitcher.setInAnimation(in);
mSwitcher.setOutAnimation(out);
// ...
updateCounter();
} }
这 里 是 mSwitcher.setFactory(this) 设 置 了 所 使 用 的 ViewSwitcher.ViewFactory 接 口 , 这 个 接 口 由 当 前 的 TextSwitcher1 活动来继承实现,主要实现其中的 makeView()函数:
public View makeView() {
TextView t = new TextView(this);
t.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
t.setTextSize(36);
return t;
}
makeView()函数的返回类型是 View,如果在 TextSwitcher1 中使用,要求返回的类型为 TextView。
这个示例中主要变化的内容,是通过 TextSwitcher 类的 setText()函数来完成的:
private void updateCounter() {
mSwitcher.setText(String.valueOf(mCounter));
}
8.2.4.图像切换器
图像切换器(ImageSwitcher)和文本切换器类似,但是显示的内容是多个图片中的一个。
参考示例程序:ImageSwitcher1(ApiDemo=>Views=>ImageSwitcher)
源代码:com/example/android/apis/view/ImageSwitcher1.java 布局文件:image_switcher_1.xml
ImageSwitcher1 程序的运行结果如图 26 所示。
图 ImageSwitcher1 程序的运行结果 这个示例的布局文件 text_switcher_1.xml 如下所示:
<ImageSwitcher android:id="@+id/switcher"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
/>
<Gallery android:id="@+id/gallery"
android:background="#55000000"
android:layout_width="fill_parent"
android:layout_height="60dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:gravity="center_vertical"
android:spacing="16dp"
ImageSwitcher 具体显示的内容也是由当前的 Activity 实现 ViewSwitcher. ViewFactory 接口来完成的,实现其中的 makeView()方法,返回一个 ImageView 类型。
public class ImageSwitcher1 extends Activity implements
AdapterView.OnItemSelectedListener, ViewSwitcher.ViewFactory { @Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.image_switcher_1);
mSwitcher = (ImageSwitcher) findViewById(R.id.switcher);
mSwitcher.setFactory(this);
mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
i.setScaleType(ImageView.ScaleType.FIT_CENTER);
i.setLayoutParams(new mageSwitcher.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
return i;
} }
这个示例的下面部分是一个 Gallery(android.widget.Gallery,Android 中另外一个控件,扩展 AbsSpinner 实现,与 Spinner 为兄弟关系)。为了实现这个类中的内容,本例中还实现了一个 ImageAdapter 类。