Android开发之《Android应用开发揭秘》UI事件汇总
/*
* Android开发之《Android应用开发揭秘》UI事件汇总
* 北京Android俱乐部群:167839253
* Created on: 2011-12-01
* Author: blueeagle
* Email: liujiaxiang@gmail.com
*/
思想跑毛是很可怕的,最近去尝试了下创业,结果碰了一鼻子灰,公司乱七八糟的项目搞的焦头烂额。各种没有心情。还好,现在沉淀下来,继续android开发的征程。
以下是Android应用开发揭秘这本书第四章的关于UI的事件处理的总结。基本上都是可以复用的代码。存着日后方便。
1.EditView控件的setOnKeyListener方法。点击上下左右键或者中间键的时候可以出发该方法。代码如下。
myEditView.setOnKeyListener(new EditText.OnKeyListener(){ @Override public boolean onKey(View v, int keyCode, KeyEvent event) { myTextView.setText("文本框中内容是:"+myEditView.getText().toString()); return false;// TODO Auto-generated method stub } });2.RadioButton控件和RadioGroup控件的组合使用,代码如下:
myRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // TODO Auto-generated method stub if(checkedId == myRadioButton3.getId()) { DisplayToast("正确答案:"+myRadioButton3.getText()+"恭喜你回答正确"); } else { DisplayToast("回答错误"); } } });
3.CheckBox控件的使用,代码如下:
4.Button控件的使用,代码如下:
myButton1.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { } });
4.Spinner控件的使用,代码如下:
5.AutoCompleteTextView的使用,代码如下:
private static final String[] autoString = {"abcd1","abcd212","32123","32open","32add","android","windows","iphone","linux","mydirve","msnbmw","wocaonimalegebi"}; private ArrayAdapter<String> myAdapter1; private AutoCompleteTextView myAutoCompleteTextView; myAdapter1 = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,autoString); myAutoCompleteTextView = (AutoCompleteTextView)findViewById(R.id.myAutoCompleteTextView); myAutoCompleteTextView.setAdapter(myAdapter1); 6.DatePicker、TimePicker以及Button的使用,代码如下: myCalendar1 = Calendar.getInstance(); myTextView = (TextView)findViewById(R.id.myTextView); myDatePicker = (DatePicker)findViewById(R.id.datePicker1); myTimePicker = (TimePicker)findViewById(R.id.timePicker1); myButton1 = (Button)findViewById(R.id.button1); myButton2 = (Button)findViewById(R.id.button2); //将日历初始化为当前系统时间,并设置其事件监听 myDatePicker.init(myCalendar1.get(Calendar.YEAR), myCalendar1.get(Calendar.MONTH), myCalendar1.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // 当日期更改时,在这里处理。 // myCalendar1.set(year, month, day); } }); //获取TimePicker对象设置为24小时显示。 myTimePicker.setIs24HourView(true); //监听时间改变 myTimePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { // TODO Auto-generated method stub // 当时间改变时,在这里处理。 //myCalendar1.set(year, month, day, hourOfDay, minute); } }); //-----------按钮事件---------// myButton1.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { // 下面的NEW 是新建了一个调整日历的对话框 new DatePickerDialog(AndroidUnleashed001Activity.this,new DatePickerDialog.OnDateSetListener(){ @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // TODO Auto-generated method stub //设置日历 } },myCalendar1.get(Calendar.YEAR),myCalendar1.get(Calendar.MONTH), myCalendar1.get(Calendar.DAY_OF_MONTH)).show(); } }); myButton2.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { //下面的NEW 是新建了一个调整时间的对话框 new TimePickerDialog(AndroidUnleashed001Activity.this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { // TODO Auto-generated method stub } }, myCalendar1.get(Calendar.HOUR_OF_DAY), myCalendar1.get(Calendar.MINUTE),true).show(); } }); }7.Menu的使用,代码如下:
1.XML方式实现
XML代码可以写成:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/style_submenu" android:title="笔迹样式"> <menu> <group android:id="@+id/style_group" android:checkableBehavior="single"> <item android:id="@+id/style" android:orderInCategory="1" android:title="铅笔" /> <item android:id="@+id/style" android:orderInCategory="2" android:title="钢笔" /> <item android:id="@+id/style" android:orderInCategory="3" android:title="毛笔" /> </group> </menu> </item> <item android:id="@+id/color_submenu" android:title="笔迹颜色"> <menu> <group android:id="@+id/color_group" android:checkableBehavior="single"> <item android:id="@+id/color" android:orderInCategory="0" android:title="蓝色" /> <item android:id="@+id/color" android:orderInCategory="1" android:title="绿色" /> <item android:id="@+id/color" android:orderInCategory="2" android:title="青色" /> <item android:id="@+id/color" android:orderInCategory="3" android:title="红色" /> </group> </menu> </item> <item android:id="@+id/width_submenu" android:title="笔迹粗细"> <menu> <group android:id="@+id/width_group" android:checkableBehavior="single"> <item android:id="@+id/width" android:orderInCategory="1" android:title="较细" /> <item android:id="@+id/width" android:orderInCategory="2" android:title="细" /> <item android:id="@+id/width" android:orderInCategory="3" android:title="中等" /> <item android:id="@+id/width" android:orderInCategory="4" android:title="粗" /> <item android:id="@+id/width" android:orderInCategory="5" android:title="较粗" /> </group> </menu> </item> <item android:id="@+id/write" android:title="书写" /> <item android:id="@+id/erase" android:title="清除" /> <item android:id="@+id/clear" android:title="清屏" /> </menu>
JAVA代码:
8.弹出对话框的使用,代码如下:
这个功能为弹出对话框,点击确定后弹出登录对话框,然后点击登录后弹出多线程对话框。
Dialog dialog = new AlertDialog.Builder(AndroidUnleashed001Activity.this).setTitle("登录提示").setMessage("这里需要登录").setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 点击确定转向登陆框 LayoutInflater factory = LayoutInflater.from(AndroidUnleashed001Activity.this); //得到自定义对话框 final View DialogView = factory.inflate(R.layout.pop, null); //创建对话框 AlertDialog dlg = new AlertDialog.Builder(AndroidUnleashed001Activity.this).setTitle("登录框").setView(DialogView).setPositiveButton("确定", new DialogInterface.OnClickListener() { private ProgressDialog myProgressDialog; @Override public void onClick(DialogInterface dialog, int which) { // 当输入完成后,点击确定开始登录。 myProgressDialog = ProgressDialog.show(AndroidUnleashed001Activity.this, "请等待", "正在为您登陆",true); new Thread(){ public void run(){ try{ sleep(3000); } catch(Exception e){ e.printStackTrace(); } finally{ myProgressDialog.dismiss(); } } }.start(); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub AndroidUnleashed001Activity.this.finish(); } }).create(); dlg.show(); } }).setNegativeButton("退出", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub AndroidUnleashed001Activity.this.finish(); } }).create(); dialog.show();
9.ImageView的使用,代码如下:
注意:如果要去掉ImageButton后面的背景色,使得ImageButton看起来更漂亮一些而不是有个边,则需要做:在XML文件中的属性里添加:“android:background="#00000000"”
10.Gallery的使用,拖动效果很炫,代码如下:
Gallery myGallery = (Gallery)findViewById(R.id.myGallery); //添加ImageAdapter给Gallery对象 myGallery.setAdapter(new ImageAdapter(this)); myGallery.setBackgroundResource(R.drawable.background); myGallery.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub Toast.makeText(AndroidUnleashed003Activity.this, "你选择了"+(arg2+1)+" 号图片 ", Toast.LENGTH_SHORT).show(); } }); } //另外,需要存放图片,存放图片的容器,需要使用一个类实现,这个类是ImageAdapter,继承于BaseAdapter。 public class ImageAdapter extends BaseAdapter{ private Context myContext; private Integer[] mImageIds = { R.drawable.ic_launcher, R.drawable.icon, R.drawable.logo, R.drawable.logo2, R.drawable.logo, R.drawable.ic_launcher, R.drawable.icon, R.drawable.logo, }; public ImageAdapter(Context c){ myContext = c; } @Override //获取图片的个数 public int getCount() { // TODO Auto-generated method stub return mImageIds.length; } @Override //获取图片在库中的位置 public Object getItem(int arg0) { // TODO Auto-generated method stub return arg0; } @Override //获取图片在库中的位置 public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(int position, View arg1, ViewGroup arg2) { // TODO Auto-generated method stub //return null; ImageView myImageView = new ImageView(myContext); //给ImageView设置资源 myImageView.setImageResource(mImageIds[position]); //设置布局图片以120*120显示 //myImageView.setLayoutParams(new Gallery.LayoutParams(120,120)); //设置显示比例类型 //myImageView.setScaleType(ImageView.ScaleType.FIT_CENTER); return myImageView; } }11.ImageSwitcher的使用,代码如下:
//首先需要实现接口: extends Activity implements OnClickListener,ViewFactory //具体操作: LinearLayout myMainView = new LinearLayout(this); //创建ImageSwitcher对象 mySwitcher = new ImageSwitcher(this); myMainView.addView(mySwitcher); mySwitcher.setId(BUTTON_SWITCHER_ID); mySwitcher.setFactory(this); mySwitcher.setImageResource(mImageIds[index]); setContentView(myMainView); Button next = new Button(this); next.setId(BUTTON_DOWN_ID); next.setText("下一张"); next.setOnClickListener(this); //LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(200,200); myMainView.addView(next); Button pre = new Button(this); pre.setId(BUTTON_UP_ID); pre.setText("上一张"); pre.setOnClickListener(this); myMainView.addView(pre); } private ImageSwitcher mySwitcher; private static int index = 0; //上一页,下一页的按钮索引和Switcher的对象ID private static final int BUTTON_DOWN_ID = 0x123456; private static final int BUTTON_UP_ID = 0x123457; private static final int BUTTON_SWITCHER_ID = 0x123458; //实现OnClickListener接口的函数 @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ case BUTTON_DOWN_ID: index++; if(index>= mImageIds.length){ index = 0; } mySwitcher.setImageResource(mImageIds[index]); break; case BUTTON_UP_ID: index--; if(index<0){ index = mImageIds.length-1; } mySwitcher.setImageResource(mImageIds[index]); break; default: break; } } //实现View.Factory接口的函数 @Override public View makeView() { // TODO Auto-generated method stub return new ImageView(this); }12.GridView的使用,代码如下:
//这个和Gallery的使用相似,也需要存图片在BaseAdapter中。 GridView myGridView = (GridView)findViewById(R.id.gridView1); myGridView.setAdapter(new ImageAdapter(this)); myGridView.setBackgroundResource(R.drawable.background); myGridView.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub Toast.makeText(AndroidUnleashed003Activity.this, "你选择了"+(arg2+1)+" 号图片 ", Toast.LENGTH_SHORT).show(); } }); }12.ScrollView的使用,代码如下:
//要垂直滚动,使用ScrollView要水平滚动使用HorizontalScrollView。 myLayout = (LinearLayout)findViewById(R.id.myLayout); myScllorView = (ScrollView)findViewById(R.id.myScrollView); Button myButton = (Button)findViewById(R.id.myButton); myButton.setOnClickListener(new Button.OnClickListener(){ private int mIndex = -1; @Override public void onClick(View v) { // TODO Auto-generated method stub TextView myTextView = new TextView(ScrollerViewActivity.this); myTextView.setText("Text View"+mIndex); LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); //增加一个TextView到现行布局中 myLayout.addView(myTextView,p); Button myButtonView = new Button(ScrollerViewActivity.this); myButtonView.setText("Button "+mIndex++); //增加一个Button到线性布局中 myLayout.addView(myButtonView,p); //改变默认焦点切换 //myButtonView.setOnKeyListener(newButtonKeyListener); //投递一个消息进行滚动 //myHandler.post(myScolltoBottom); } }); }13.ProgressBar的使用,代码如下:
ProgressBarStyleHorizontal(长形进度条)
ProgressBarStyleLarge(圆形进度条)
public class ProgressBarA extends Activity { protected static final int GUI_STOP_NOTIFIER = 0x108; protected static final int GUI_THREADING_NOTIFIER = 0x109; private ProgressBar myProgress1; private ProgressBar myProgress2; private Button myButton; private int intCounter; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置窗口模式,因为需要显示进度条在标题栏 requestWindowFeature(Window.FEATURE_PROGRESS); setProgressBarVisibility(true); setContentView(R.layout.main); //取得ProgressBar myProgress1 = (ProgressBar)findViewById(R.id.myProgressBar01); myProgress2 = (ProgressBar)findViewById(R.id.myProgressBar02); myButton = (Button)findViewById(R.id.myButton); myProgress1.setIndeterminate(false); myProgress2.setIndeterminate(false); myButton.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub myProgress1.setVisibility(View.VISIBLE); myProgress2.setVisibility(View.VISIBLE); myProgress1.setMax(100); myProgress1.setProgress(0); myProgress2.setProgress(0); //通过线程来改变Progress的值 new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<10;i++){ try{ intCounter=(i+1)*20; Thread.sleep(1000); if(i==4){ Message m = new Message(); m.what = ProgressBarA.GUI_STOP_NOTIFIER; ProgressBarA.this.myMessageHandler.sendMessage(m); break; } else{ Message m = new Message(); m.what = ProgressBarA.GUI_THREADING_NOTIFIER; ProgressBarA.this.myMessageHandler.sendMessage(m); } } catch(Exception e){ e.printStackTrace(); } } } }).start(); } }); } Handler myMessageHandler = new Handler(){ public void handleMessage(Message msg){ switch(msg.what){ case ProgressBarA.GUI_STOP_NOTIFIER: //myProgress1.setVisibility(View.GONE); //myProgress2.setVisibility(View.GONE); //Thread.currentThread().interrupt(); break; case ProgressBarA.GUI_THREADING_NOTIFIER: if(!Thread.currentThread().isInterrupted()){ myProgress1.setProgress(intCounter); myProgress1.setProgress(intCounter); setProgress(intCounter*100);//设置标题栏中前景的一个进度条进度值 //setSecondaryProgress(intCounter*100);//设置标题栏中后面的一个进度条进度值 //Thread.currentThread().interrupt(); } break; } super.handleMessage(msg); } }; }
14.SeekBar的使用,代码如下:
15.Notification、NotificationManager的使用,代码如下:
myIntent = new Intent(Notification01.this,Notification02.class); //主要是设置点击通知时显示内容的类 myPendingIntent = PendingIntent.getActivity(Notification01.this, 0, myIntent, 0); //构造Notification对象 myNotification = new Notification(); myButton1.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub //设置通知在状态栏显示的图标 myNotification.icon = R.drawable.ic_launcher; myNotification.tickerText = "Button1的通知内容..."; //通知时发出默认的声音 myNotification.defaults = Notification.DEFAULT_SOUND; //设置通知显示的参数 myNotification.setLatestEventInfo(Notification01.this,"Button1","Button1通知",myPendingIntent); //可以理解为执行这个通知 myNotificationManager.notify(0,myNotification); } });16.ProgressDialog的使用,代码如下:
myButton01 = (Button)findViewById(R.id.Button1); myButton02 = (Button)findViewById(R.id.Button2); myButton01.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub //创建ProgressDialog对象 myProgressDialog = new ProgressDialog(ProgressDialogActivity.this); //设置进度条风格,风格为圆形的,旋转的 myProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); //设置ProgressDialog标题 myProgressDialog.setTitle("提示"); //设置ProgressDialog提示信息 myProgressDialog.setMessage("这是一个圆形进度条对话框"); //设置myProgressDialog标题图标 myProgressDialog.setIcon(R.drawable.ic_launcher); //设置myProgressDialog的进度条是否不明确 myProgressDialog.setIndeterminate(false); //设置myProgressDialog是否可以按退回键取消 myProgressDialog.setCancelable(true); //设置myProgressDialog的一个Button myProgressDialog.setButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub //点击确定取消对话框 dialog.cancel(); } }); //让ProgressDialog显示 myProgressDialog.show(); } }); myButton02.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub myCount = 0; //创建ProgressDialog对象 myProgressDialog = new ProgressDialog(ProgressDialogActivity.this); //设置进度条风格,风格为长形的。 myProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); //设置ProgressDialog标题 myProgressDialog.setTitle("提示"); //设置ProgressDialog提示信息 myProgressDialog.setMessage("这是一个长形进度条对话框"); //设置myProgressDialog标题图标 myProgressDialog.setIcon(R.drawable.ic_launcher); //设置myProgressDialog进度条进度 myProgressDialog.setProgress(100); //设置myProgressDialog的进度条是否不明确 myProgressDialog.setIndeterminate(false); //设置myProgressDialog是否可以按退回键取消 myProgressDialog.setCancelable(true); //设置myProgressDialog的一个Button myProgressDialog.setButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub //点击确定取消对话框 dialog.cancel(); } }); //让ProgressDialog显示 myProgressDialog.show(); new Thread(){ public void run(){ try{ while(myCount <= 100){ //由线程来控制进度 myProgressDialog.setProgress(myCount++); Thread.sleep(100); } myProgressDialog.cancel(); } catch(InterruptedException e){ myProgressDialog.cancel(); } } }.start(); } });17.TabWidget的使用,代码如下:
要使用TabWidget,首先要了解TabHost,TabHost是一个用来存放Tab标签的容器。