自定义Dialog,DatePickerDialog,TimePickerDialog,PopupWindow,Notification
2015-08-28 22:02
525 查看
自定义Dialog
自定义Dialog就是Dialog的整个View都是自己写的,title,message,按键等。这里先用LayoutInflater将View实例化,然后用dialog.setContentView(dialog_view);将View导入Dialog中。
代码如下:
switch (v.getId()) { case R.id.button1: final Dialog dialog =new Dialog(MainActivity.this,R.style.NoDialogTitle); LayoutInflater inflater=getLayoutInflater(); View dialog_view=inflater.inflate(R.layout.dialog_view,null); TextView title= (TextView) dialog_view.findViewById(R.id.title); TextView message= (TextView) dialog_view.findViewById(R.id.message); Button cancel = (Button) dialog_view.findViewById(R.id.cancel); Button ok = (Button) dialog_view.findViewById(R.id.ok); title.setText("我是标题"); message.setText("我是内容"); dialog.setContentView(dialog_view); cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); ok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(),"您确认了",Toast.LENGTH_LONG).show(); dialog.dismiss(); } }); dialog.show();
设置Diolog的大小的方法:
public static void setDialogWidthAndHeight(Context context, Dialog dialog, double widtRate, double heightRate) { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); lp.width = (int) (display.getWidth() * widtRate); //设置宽度为屏幕的多少 lp.height = (int) (display.getHeight() * heightRate);//设置高度为屏幕的多少 dialog.getWindow().setAttributes(lp); }
在 Dialog dialog =new Dialog(MainActivity.this,R.style.NoDialogTitle);中用了style,这是用来取消默认的标题的,它在style中的代码为:
<style parent="@android:Theme.Dialog" name="NoDialogTitle"> <item name="android:windowFrame">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsFloating">true</item> <item name="android:windowContentOverlay">@null</item> </style>
这样结果就没有默认的标题了。
结果如下:
完整的例子:
public class MyDiolag extends BaseActivity { private Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my); mButton = (Button) findViewById(R.id.button); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final Dialog dialog =new Dialog(MyDiolag.this,R.style.NoDialogTitle); LayoutInflater inflater=getLayoutInflater(); View dialog_view=inflater.inflate(R.layout.dialog_view, null); Button cancel = (Button) dialog_view.findViewById(R.id.cancel); Button ok = (Button) dialog_view.findViewById(R.id.ok); cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); ok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "您确认了", Toast.LENGTH_LONG).show(); dialog.dismiss(); } }); dialog.setContentView(dialog_view); //设置doilog的宽度和高度 WindowManager windowManager = (WindowManager) MyDiolag.this.getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); lp.width = (int) (display.getWidth() * 0.7); //设置宽度 dialog.getWindow().setAttributes(lp); dialog.show(); } }); }
dialog_view:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/my_diolog" android:padding="5dp" > <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="确认要退出应用吗?" android:gravity="center" android:padding="10dp" /> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:background="@color/home_line"></View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_gravity="center_horizontal" > <Button android:id="@+id/cancel" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="取消" android:background="@color/white" /> <View android:layout_width="0.5dp" android:layout_height="match_parent" android:background="@color/home_line"></View> <Button android:id="@+id/ok" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="确认" android:background="@color/white" /> </LinearLayout> </LinearLayout>
效果:
时间选择控件
时间选择控件分两种,一种为时间选择,一种为日期选择。一.日期选择又分为两种:DatePicker,DatePickerDialog。
DatePicker是像一般的控件一样要在XML中定义好,在Activity中引入,这种主要紧贴在屏幕中,DatePickerDialog是一种Dialog即弹窗,不需要在XML中定义,直接在Activity中建立它的对象就可以,不要忘记在最后show。
二.时间选择也分为两种:TimePicker,TimePickerDialog。两者的区别和上面的基本相同。
注意:这一类的控件其实非常简单,就是设置好初始值(一般用Calendar对象获得)和监听器,在控件的日期发生变化的时候会在监听器的方法中得到,并在这个方法中进行一系列的操作。
DatePicker的监听器为:OnDateChangedListener
DatePickerDialog的监听器为:OnDateSetListener
TimePicker的监听器为:OnTimeChangedListener
TimePickerDialog的监听器为:OnTimeSetListener
DatePicker
代码如下:datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() { @Override public void onDateChanged(DatePicker datePicker, int i, int i1, int i2) { setTitle(""+i+"-"+i1+"-"+i2); } });
结果如下:
DatePickerDialog
DatePickerDialog是用来显示时间选项的,可以利用Calendar获取当前的时间。代码如下:
DatePickerDialog dialog =new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { calendar.set(year,monthOfYear,dayOfMonth); SimpleDateFormat formatter =new SimpleDateFormat("yyyy年MM月dd日"); Toast.makeText(getApplicationContext(),formatter.format(calendar.getTime()),Toast.LENGTH_SHORT).show(); } },calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)); dialog.show();
结果如下:
TimePicker
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker timePicker, int i, int i1) { setTitle(i+"-"+i1);//对标题进行设置 } });
结果如下:
TimePickerDialog
TimePickerDialog的用法与DatePickerDialog的用法基本相同。代码如下:calendar=Calendar.getInstance(); TimePickerDialog dialog =new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { calendar.set(Calendar.HOUR,hourOfDay); calendar.set(Calendar.MINUTE,minute); SimpleDateFormat format=new SimpleDateFormat("HH:mm"); Toast.makeText(getApplicationContext(),format.format(calendar.getTime()),Toast.LENGTH_SHORT).show(); } },calendar.get(Calendar.HOUR),calendar.get(Calendar.MINUTE),true);//这里的true是表示是否为24小时制 dialog.show();
结果如下:
PopupWindow
PopupWindow在指定的地方显示一个显示框,显示几条内容。利用popupWindow和ListView相结合可以完美的代替spinner
代码如下:
LayoutInflater inflater=getLayoutInflater(); View popup_view =inflater.inflate(R.layout.popup_view,null); popupWindow =new PopupWindow(MainActivity.this); popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); popupWindow.setContentView(popup_view); popupWindow.setFocusable(true); popupWindow.setOutsideTouchable(true);//设置按别处显示框消失 popupWindow.showAsDropDown(button4);//设置显示框在的位置为在button4的下面。
重写方法:
/** * 按back键这个显示框消失 * @param keyCode * @param event * @return */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ popupWindow.dismiss(); } return super.onKeyDown(keyCode, event); }
写一个例子展示一下Popupwindow代替spinner:
public class TestPopupWndowin extends BaseActivity { private EditText mEditext; private ImageButton mButton; private PopupWindow mPW; String [] mStatusAdate = {"提出","审批","评估","确认","开发","测试","发布","完成","撤销"}; PopuWindowAdapter adapter; private Boolean mflag=true; private EditText mEditext2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_popupwindow_activity); initView(); } private void initView() { mEditext = (EditText) findViewById(R.id.edit); mButton = (ImageButton) findViewById(R.id.button); mEditext2 = (EditText) findViewById(R.id.edit2); mPW =new PopupWindow(TestPopupWndowin.this); //mPW.dismiss(); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (!mPW.isShowing()) { initPopupWindow(); }else { mPW.dismiss(); } } }); } private void initPopupWindow() { LayoutInflater inflater=getLayoutInflater(); View popup_view =inflater.inflate(R.layout.popup_window_layout, null); ListView list = (ListView) popup_view.findViewById(R.id.list_view); adapter = new PopuWindowAdapter(mStatusAdate,getLayoutInflater()); list.setAdapter(adapter); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { TextView textView = (TextView) view.findViewById(R.id.text); mEditext.setText(textView.getText().toString()); mPW.dismiss(); } }); mPW.setBackgroundDrawable(getResources().getDrawable(R.color.white)); mPW.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mPW.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); mPW.setContentView(popup_view); mPW.setFocusable(true); mPW.setOutsideTouchable(true);//设置按别处显示框消失 mPW.showAsDropDown(mButton);//设置显示框在的位置为在button4的下面。 } }
popup_window_layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/white" > <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@color/black" android:dividerHeight="1dp" android:background="@drawable/popup_window_backdround" android:layout_margin="1dp" ></ListView> <TextView android:layout_width="wrap_content" android:layout_height="0dp" android:textSize="18dp" android:text="需求及总体方案处" /> </LinearLayout>
注意:上面的TextView是用来提供Popuwindow的最大宽度的,由于Popupwindow中有ListView所以不能自适应内容的大小去改变popupwindow的宽度,所以这是一个不错的方法。
PopuWindowAdapter:
public class PopuWindowAdapter extends BaseAdapter { private String mDate[]; private LayoutInflater inflater; public PopuWindowAdapter(String[] mDate, LayoutInflater inflater) { this.mDate = mDate; this.inflater = inflater; } @Override public int getCount() { return mDate.length; } @Override public Object getItem(int i) { return i; } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View convertView, ViewGroup viewGroup) { ViewHolder vh; if(convertView==null) { vh=new ViewHolder(); convertView = inflater.inflate(R.layout.popu_window_item, null); vh.textView= (TextView) convertView.findViewById(R.id.text); convertView.setTag(vh); }else{ vh= (ViewHolder) convertView.getTag(); } vh.textView.setText(mDate[i]); /** * 这是CheckBox的一个点击事件,当CheckBox按键状态发生变化时这个变化的状态会直接传入 * 数据中,这样Checked的状态就可以直接从数据中获取 */ return convertView; } class ViewHolder{ TextView textView; } }
popu_window_item:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/white" android:gravity="center" android:layout_centerInParent="true" android:layout_margin="3dp" /> </RelativeLayout>
在PopupWindow加入ListView的第二种用法
private void showPopupWindow(int xoff, int yoff) { DetailRightAdapter adapter = new DetailRightAdapter(commonListBeans, this); ListView listview = new ListView(this); listview.setBackgroundColor(Color.WHITE); listview.setMinimumHeight(Dp2pxUtil.px2dip(this, 20)); listview.setAdapter(adapter); popupWindow = new PopupWindow(this); ColorDrawable dw = new ColorDrawable(0x00000000); popupWindow.setBackgroundDrawable(dw); popupWindow.setHeight(LayoutParams.WRAP_CONTENT); // popupWindow.setWidth(LL_shaixuan.getWidth() * 1); popupWindow.setWidth(LayoutParams.MATCH_PARENT); popupWindow.setOutsideTouchable(true); popupWindow.setFocusable(true); popupWindow.setContentView(listview); mubu.setVisibility(View.VISIBLE); popupWindow.showAsDropDown(LL_shaixuan, xoff, 0); popupWindow.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss() { // TODO Auto-generated method stub mubu.setVisibility(View.GONE); } }); listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub popupWindow.dismiss(); catid = commonListBeans.get(position).getCatid(); tv_shaixuan.setText(commonListBeans.get(position).getCatname()); if (!lv.isCanLoadMore()) { lv.setCanLoadMore(true); } refreshList(); } }); }
Notification
Notification是显示通知信息的,这里有两种写法,一种是以前的写法,一种是现在的写法。以前的写法
以前的写法是直接赋值,代码如下:
mNotificationManager= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); Notification notification =new Notification(); notification.icon= R.mipmap.caomei; notification.tickerText="哈哈,我来了!"; notification.flags=Notification.FLAG_AUTO_CANCEL; Intent intent =new Intent(getApplicationContext(),MainActivity.class); PendingIntent pendingIntent =PendingIntent.getActivity(getApplicationContext(),1,intent,PendingIntent.FLAG_ONE_SHOT); notification.setLatestEventInfo(getApplicationContext(),"我是标题","我是内容",pendingIntent); notification.when=System.currentTimeMillis(); mNotificationManager.notify(1,notification);//1是一个通知的代号,可以是任何值但不可以相同。
现在的做法:
步骤:
1)建立一个builder:Notification.Builder builder = new Notification.Builder(this);通过这个builder设置一系列的信息,例如,图标,title,内容,时间,来信息时的提示等等
2)利用 Notification notification = builder.build();建立一个Notification的实例。
3)建立NotificationManager的实例:NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);,并通过这个实例发送消息:manager.notify(1,notification);//这里的1,为这个信息对应的码值,可以随便取。
4)可以利用manger取消notification的发送。
完整代码如下:
public class MainActivity extends Activity implements View.OnClickListener { private Button sendButton; private Button cancelButton; private NotificationManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sendButton = (Button) findViewById(R.id.send); cancelButton = (Button) findViewById(R.id.cancel); sendButton.setOnClickListener(this); cancelButton.setOnClickListener(this); manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.send: Intent intent = new Intent(this,MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_ONE_SHOT); Notification.Builder builder = new Notification.Builder(this); builder.setSmallIcon(R.mipmap.ic_launcher);//设置图标 builder.setTicker("我来了");//手机状态栏提示 builder.setWhen(System.currentTimeMillis());//设置时间 builder.setContentTitle("我是标题");//设置标题 builder.setContentText("我是内容");//设置内容 builder.setContentIntent(pendingIntent);//设置点击后的动作 builder.setDefaults(Notification.DEFAULT_ALL);//设置来信息的提示的全部 // builder.setDefaults(Notification.DEFAULT_LIGHTS);//设置提示灯 // builder.setDefaults(Notification.DEFAULT_SOUND);//设置提示声音 // builder.setDefaults(Notification.DEFAULT_VIBRATE);//设置提示震动 Notification notification = builder.build(); manager.notify(1,notification); break; case R.id.cancel: manager.cancel(1); break; } } }
相关文章推荐
- tomcat安装
- Linux平台上SQLite数据库教程(一)——终端使用篇
- 网站分析思维导图
- linux centos 6.3 图文安装教程
- 关于shell中的正则表达式和awk的使用
- 电子商务网站流量分析的三项指标分拆
- 网站分析角度及指标
- 自定义Dialog、带时间和日期的Dialog、PopupWindow、Notification
- 网站用户行为分析在用户市场领域的应用
- 网站流量统计名词解释
- 网站用户分析方法
- 自定义Dialog DatePicker,TimerPicker PopupWindow Notification
- 读书笔记之linux/unix系统编程手册(30)
- 15款商城网站常用的图片放大镜特效
- Linux内核同步机制之(五):Read/Write spin lock
- Linux内核同步机制之(四):spin lock
- Linux内核同步机制之(三):memory barrier
- Linux内核同步机制之(二):Per-CPU变量
- Linux设备驱动简介
- Linux进程管理