- 相框设计 :ImageView 的堆叠作用
- 相框设计 :ImageButton 的堆叠作用
- 自定义下拉菜单 :Spinner 与setDropDownViewResource
- 动态添加╱删除的Spinner 菜单 : ArrayList 与Widget 的依赖性
14. 专业相框设计
1)ImageView 的堆叠应用
利用 ImageView 的堆叠,将上例中的实现不同相框的更换
示例代码
① 新建工程
② 准备三张png 图片
③ 修改main.xml 布局,添加UI 元素
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout //使用的是绝对布局
android:id="@+id/widget34"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
><!--创建第一个ImageView (第二层图片)-->
<ImageView
android:id="@+id/myImageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="0px"
android:layout_y="36px"
/>
<!--创建第二个ImageView (第一层图片)-->
<ImageView
android:id="@+id/myImageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="0px"
android:layout_y="36px"
/>
<!--创建第一个Button -->
<Button
android:id="@+id/myButton1"
android:layout_width="105px"
android:layout_height="66px"
android:text="pic1"
android:layout_x="9px"
android:layout_y="356px"
/>
<!--创建第二个Button -->
<Button
android:id="@+id/myButton2"
android:layout_width="105px"
android:layout_height="66px"
android:text="pic2"
android:layout_x="179px"
android:layout_y="356px"
/>
</AbsoluteLayout>
④ 修改mainActivity.java
package zyf.Ex_Ctrl_7;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class Ex_Ctrl_7 extends Activity {
// Called when the activity is first created.
// 声明Button、ImageView 对象
private ImageView mImageView01;
private ImageView mImageView02;
private Button mButton01;
private Button mButton02;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 取得Button、ImageView 对象
mImageView01 = (ImageView) findViewById(R.id.myImageView1);
mImageView02 = (ImageView) findViewById(R.id.myImageView2);
mButton01 = (Button) findViewById(R.id.myButton1);
mButton02 = (Button) findViewById(R.id.myButton2);
// 设置ImageView 背景图
mImageView01.setImageDrawable(getResources().getDrawable(R.drawable.right));
mImageView02.setImageDrawable(getResources().getDrawable(R.drawable.photo));
// 用OnClickListener 事件来启动
mButton01.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
// 当启动后, ImageView 立刻换背景图
mImageView01.setImageDrawable(getResources().getDrawable(R.drawable.right));
}
});
mButton02.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
mImageView01.setImageDrawable(getResources().getDrawable(R.drawable.left));
}
});
}
}
⑤ 结果
2)ImageButton 的堆叠应用
利用 ImageButton 的背景图和按键响应,将上例中的 ImageView 和 Button 结合到一起,通过堆叠 ImageButton 实现相框的更换。
示例代码
① 新建项目
② 准备三张png 图片
③ 修改main.xml 布局,添加UI 元素
④ 修改mainActivity.java
package zyf.Ex_Ctrl_7_B;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
public class Ex_Ctrl_7_B extends Activity {
// Called when the activity is first created.
//声明ImageButton
private ImageButton back_Imagebutton,photo_Imagebutton;
private boolean Tag=true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//从XML中获取控件对象
back_Imagebutton=(ImageButton)findViewById(R.id.myImageButton_Back );
photo_Imagebutton=(ImageButton)findViewById(R.id.myImageButton_Photo );
//设置默认的背景图片
back_Imagebutton.setBackgroundResource(R.drawable.left);
photo_Imagebutton.setBackgroundResource(R.drawable.photo);
//给ImageButton设置事件监听器
photo_Imagebutton.setOnClickListener(new ImageButton.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Tag=!Tag;
//更改背景图片
if(Tag){
back_Imagebutton.setBackgroundResource(R.drawable.right);
}else{
back_Imagebutton.setBackgroundResource(R.drawable.left);
}
}
});
}
}
⑤ 结果
15. 自定义下拉菜单
Spinner 标签: 定义一个下拉菜单。
setDropDownViewResource :为自定义下拉菜单设置样式。
示例代码
① 新建项目,在res 目录下新建一个anim 文件夹,存放动画效果用,在其中新建一个my_anim.xml 文件
② 在res 目录下的layout 文件夹中新建一个myspinner_dropdown.xml 文件,用来存放下拉菜单弹出内容的布局
③ 修改main.xml,添加UI 元素
④ 定义一个下拉菜单
⑨ mainActivity.java 完整代码
package zyf.Ex_Ctrl_8;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
public class Ex_Ctrl_8 extends Activity {
// Called when the activity is first created.
private static final String[] countriesStr ={ " 北京市", " 上海市", " 天津市", " 重庆市" };
private TextView myTextView;
private Spinner mySpinner;
private ArrayAdapter<String> adapter;
Animation myAnimation;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 载入main.xml Layout
setContentView(R.layout.main);
// 以findViewById() 取得对象
myTextView = (TextView) findViewById(R.id.TextView_Show);
mySpinner = (Spinner) findViewById(R.id.spinner_City);
//取得Animation 定义在res/anim 目录下
myAnimation = AnimationUtils.loadAnimation(this, R.anim.my_anim);
adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, countriesStr );
// myspinner_dropdown 为自定义下拉菜单样式定义在res/layout 目录下
adapter.setDropDownViewResource(R.layout.myspinner_dropdown);
// 给下拉菜单添加内容Adapter适配器
mySpinner.setAdapter(adapter);
//下拉菜单弹出的内容选项被选中事件处理
mySpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) {
// TODO Auto-generated method stub
// 将所选mySpinner 的值带入myTextView 中
myTextView.setText(setText("您选择的是:"+ countriesStr [arg2]);
// 将mySpinner 显示
arg0.setVisibility(View.VISIBLE);
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
myTextView.setText("NONE");
}
});
//下拉菜单弹出的内容选项触屏事件处理
mySpinner.setOnTouchListener(new Spinner.OnTouchListener(){
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
// 将mySpinner 运行Animation
v.startAnimation(myAnimation);
// 将mySpinner 隐藏
v.setVisibility(View.INVISIBLE);
return false;
}
});
//下拉菜单弹出的内容选项焦点改变事件处理
mySpinner.setOnFocusChangeListener(new Spinner.OnFocusChangeListener(){
public void onFocusChange(View v, boolean hasFocus) {
// TODO Auto-generated method stub
}
});
}
}
⑩ 结果
关键点
1. Android 控件之 Spinner
Spinner是一个每次只能选择所有项的一个项的控件。它的项来自于与之相关联的适配器中。
详见:http://blog.sina.com.cn/s/blog_4b3c1f950100qzqt.html
2. 适配器 Adapter
一个Adapter的对象扮演一个桥梁的角色。这个桥梁连接着一个 AdapterView 和它所包含的数据 。
详见:http://blog.sina.com.cn/s/blog_4b3c1f950100qzro.html
3. AdapterView
AdapterView 是内容由 Adapter 来决定的视图类。
参见子类 ListView、GridView、Spinner 和 Gallery 等。
16. 动态添加╱删除的Spinner 菜单
核心代码
// mainActivity.java,实现动态添加和删除
public class Ex_Ctrl_9ME extends Activity implementsButton.OnClickListener,Spinner.OnItemSelectedListener
{
// Called when the activity is first created.
//声明程序使用的对象
private TextView show_yourChoice_TextView;
private EditText input_City_EditText;
private Button Add_Button, Del_Button;
private Spinner city_Spinner;
private ArrayAdapter<String> arrayAdapter;
private String[] cities;
private String addString;
private List<String> cityList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置主屏显示布局为main.xml
setContentView(R.layout.main);
//findViewByID()获取XML中的UI元素
show_yourChoice_TextView = (TextView) findViewById(R.id.TextView_Show_yourChoice );
input_City_EditText = (EditText) findViewById(R.id.EditView_Input);
Add_Button = (Button) findViewById(R.id.Button_ADD);
Del_Button = (Button) findViewById(R.id.Button_DEL);
city_Spinner = (Spinner) findViewById(R.id.Spinner_Slecte);
//初始化字符串数组
cities = new String[] { "Android", "BlackBerry", "J2ME","Symbian","Broncho", "LinuxMobile","Palm","WindwosMobile" };
//初始化List实例ArrayList的对象
cityList = new ArrayList<String>();
//遍历,把字符串数组添加到ArrayList中
for (int i = 0; i < cities.length; i++) {
cityList.add(cities[i]);
}
// 这里应该使用List<> ,如果使用String[]则会出错
//初始化下拉菜单的内容适配器
arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, cityList);
//设置下拉菜单显示内容的风格
arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item );
//给下拉菜单对象添加内容适配器
city_Spinner.setAdapter(arrayAdapter);
//默认启动时文本标题显示
show_yourChoice_TextView.setText(arrayAdapter.getItem(0));
//默认启动时下拉菜单第一项被选中
city_Spinner.setSelection(0);
//为按钮添加点击事件监听器
Add_Button.setOnClickListener(this);
Del_Button.setOnClickListener(this);
//为下拉菜单添加选项选中事件监听器
city_Spinner.setOnItemSelectedListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
//区别按钮来进行不同动作
case R.id.Button_ADD:
//显示Toast提示
Toast.makeText(this, "添加", Toast.LENGTH_SHORT).show();
//获得输入框中的将要添加的字符串
addString = input_City_EditText.getText().toString();
//遍历,比较是否和下拉菜单中内容重复
for (int i = 0; i < arrayAdapter.getCount(); i++) {
if (addString.equals(arrayAdapter.getItemId(i))) {
return; //重复了,则跳出
}
}
//如果添加字符串不为""
if (!addString.equals("")) {
//添加进适配器中
arrayAdapter.add(addString);
//获取刚刚添加进的字符串位置
int post = arrayAdapter.getPosition(addString);
//设置刚刚添加进的下拉菜单内容被选中
city_Spinner.setSelection(post);
//清空输入框
input_City_EditText.setText("");
}
break;
case R.id.Button_DEL:
if (city_Spinner.getSelectedItem() != null) {
// 删除mySpinner 的值
arrayAdapter.remove(city_Spinner.getSelectedItem().toString());
// 将myEditText 清空
input_City_EditText.setText("");
if (arrayAdapter.getCount() == 0) {
// 将myTextView 清空
Toast.makeText(this, "删完了", Toast.LENGTH_SHORT).show();
show_yourChoice_TextView.setText("");
}
}
break;
default:
break;
}
}
//下拉菜单选项被选中事件处理
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
// TODO Auto-generated method stub
show_yourChoice_TextView.setText(arrayAdapter.getItem(arg2));
}
//未被选中事件处理
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
//添加Menu菜单进行退出操作
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add("Exit");
return super.onCreateOptionsMenu(menu);
}
//Menu菜单退出
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
finish();
return super.onOptionsItemSelected(item);
}
}
关键点
1. Adapter 与AdapterView 之间的依赖性
数据 – adapter – adapterView
在对Adapter 进行数据增减时,会直接反应发到adapterView上。?那对原始数据 list 有影响吗 ?