0828Android基础自定义Dialog+DatePickerDialog+TimePickerDialog+PopupWindow+Notification
来源:互联网 发布:sql identity_insert 编辑:程序博客网 时间:2024/05/17 08:32
自定义Dialog
自己写layout,用LayoutInflater进行动态加载,然后用setContentView进行添加。
layout方面,对title还有按键以及对话框整体进行了设置,通过background引用drawable中相应的xml文件实现调整。
//布局文件<?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:gravity="center_vertical" android:layout_height="match_parent" android:background="@drawable/dialog_background"><TextView android:id="@+id/text_title" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/myTextView" /><TextView android:id="@+id/text_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是内容" android:textAppearance="@android:style/TextAppearance.Medium" android:layout_gravity="center_horizontal" android:layout_margin="15dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="2"> <Button android:id="@+id/button_n" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textAppearance="@android:style/TextAppearance.Medium" android:background="@drawable/btn_left_background" android:text="取消"/> <Button android:id="@+id/button_y" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textAppearance="@android:style/TextAppearance.Medium" android:text="确定" android:background="@drawable/btn_right_background" /> </LinearLayout></LinearLayout>
第一个TestView引用了styles中的布局,这种方法通常用来存放比较常用的布局,以便重复使用。
//styles中对应的布局myTestView<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> </style> <style name="NoDialogTitle" parent="@android:Theme.Dialog"> <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> <style name="myTextView"> <item name="android:background">@drawable/title_background</item> <item name="android:textAppearance">@android:style/TextAppearance.Large</item> <item name="android:textColor">@color/blue</item> </style></resources>
其中的名为NoDialogTitle的设置是老师给的去除边框圆角以外的部分的,引用的时候在代码中这样引用Dialog dialog=new Dialog(MainActivity.this,R.style.NoDialogTitle);
//drawable中的xml文件//title<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:topLeftRadius="@dimen/corners" android:topRightRadius="@dimen/corners" /> <solid android:color="#0D7A29" /> /></shape>//对话框整体<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="@dimen/corners" /> <solid android:color="#ffffff" /> <stroke android:width="1dp" android:color="#64251200" /></shape>//右键//按下去的时候<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="@dimen/corners" /> <solid android:color="#ffffff" /> <stroke android:width="1dp" android:color="#64251200" /></shape>//平常的时候<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:bottomRightRadius="@dimen/corners" /> <solid android:color="#ffffff" /> <stroke android:width="1dp" android:color="#64251200" /></shape>//设置右键按键<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_right_pressed" android:state_pressed="true" /> <item android:drawable="@drawable/btn_right_normal"/></selector>//左键雷同设置,只是圆角设置为bottomLeftRadius
shape中颜色solid,边框stroke,圆角conrners
活动和昨天的一样,只是添加了一个Button来触发而已,具体的自定义方法见下面代码
//Activityprivate void userDefinedDialog() {// 应用自己设置的主题 dialog=new Dialog(MainActivity.this,R.style.NoDialogTitle);// 获得并设置自定义Dialog LayoutInflater inflater=getLayoutInflater(); View userDefinedDialog=inflater.inflate(R.layout.user_defined_dialog_layout, null); TextView textView_title= (TextView) userDefinedDialog.findViewById(R.id.text_title); TextView textView_message= (TextView) userDefinedDialog.findViewById(R.id.text_message); Button button_y= (Button) userDefinedDialog.findViewById(R.id.button_y); Button button_n= (Button) userDefinedDialog.findViewById(R.id.button_n); Spanned spanned= Html.fromHtml("<img src =''/>这是一个新的<font color=#ff0000>标题</font>", new Html.ImageGetter() { @Override public Drawable getDrawable(String source) { Drawable drawable=getResources().getDrawable(R.mipmap.ic_launcher); drawable.setBounds(0,0,drawable.getIntrinsicHeight(),drawable.getIntrinsicWidth()); return drawable; } },null); textView_title.setText(spanned); textView_message.setText("这是一个新的内容"); button_y.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "点击确定", Toast.LENGTH_SHORT).show();// 关闭dialog dialog.dismiss(); } }); button_n.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } });// 去掉原有标题 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);// 添加自己的View到dialog dialog.setContentView(userDefinedDialog); dialog.setCancelable(false); dialog.show(); }
DatePickerDialog
活动和上面的自定义Dialog一样,只是加了个button触发,具体代码实现如下。构造对象时DatePickerDialog(Context context, int theme, DatePickerDialog.OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth)依次传入上下文,监听器,年,月,日。
下面的Demo中通过Calendar获得当前时间,将当前时间传入Dialog中。监听器中通过int year, int monthOfYear, int dayOfMonth监听Dialog的具体数据,并将数据传入Calendar中,通过getTime方法设置年月日,其中有用到SimpleDateFormat 造型。Calender.getTime()获得的是当前的时间,如果不加设置的话显示的就是当前时间。因为这里只设置了年月日,如果显示的时候加上小时分钟,小时分钟就是getTime得到的当前时间。这一点下面的TimePickerDialog中也一样,TimePickerDialog的例子中并没有设置年月日,但是显示的时候还是出现了当前的年月日。
private void dataPickerDialog() { Calendar mCalendar=Calendar.getInstance(); DatePickerDialog datePickerDialog=new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { mCalendar.set(year, monthOfYear, dayOfMonth); SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日");// simpleDateFormat format(data):将data类型的值造型成"yyyy年MM月dd日",calecdar.getTime()返回data类型 Toast.makeText(getApplication(),"这个造型是"+simpleDateFormat.format(mCalendar.getTime()),Toast.LENGTH_SHORT).show(); } },mCalendar.get(Calendar.YEAR),mCalendar.get(Calendar.MONTH),mCalendar.get(Calendar.DAY_OF_MONTH)); datePickerDialog.show(); }
TimePickerDialog
对象的构造TimePickerDialog(Context context, TimePickerDialog.OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView),上下文,监听器,小时,分钟,最后一个参数,true对应24小时,false对应12小时
Calendar mCalendar=Calendar.getInstance(); TimePickerDialog dialog=new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { mCalendar.set(mCalendar.HOUR,hourOfDay); mCalendar.set(mCalendar.MINUTE,minute); SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日HH:mm"); simpleDateFormat.format(mCalendar.getTime());// 因为getTime返回的是现在这一时刻距离某年到现在的时间。所以除了规定传入的时间外,其余时间与手机同步 Toast.makeText(getApplicationContext(),"时间为"+simpleDateFormat.format(mCalendar.getTime()),Toast.LENGTH_SHORT).show(); } },mCalendar.get(Calendar.HOUR),mCalendar.get(Calendar.MINUTE),true);// },5,6,true); dialog.show();}
PopupWindow
Dialog中有默认的布局,PopupWindow中没有默认的布局,必须自己设置。Demo中有一个onKeyDown方法,这个是手机按键的监听器,这里设置back的监听:PopupWindow运行的时候,点击back键关闭PopupWindow。注意加上PopupWindow为空是时候。具体使用方法见代码
//活动public class MainActivity extends Activity implements View.OnClickListener{ private Button mBtn_pop; private PopupWindow mPopupWindow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtn_pop= (Button) findViewById(R.id.button_pop); mBtn_pop.setOnClickListener(this); }// 监听手机按键 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){// 必须用短路与,如果mPopupWindow是null直接跳出,不再执行后面的判断条件 if(mPopupWindow!=null&&mPopupWindow.isShowing()){ mPopupWindow.dismiss();// return true后这个方法内下面的语句就不执行了。// 不返回true的话按back键会继续执行下面的语句,退出活动 return true; } } return super.onKeyDown(keyCode, event); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.button_pop: popupWindow(); break; default: break; } } private void popupWindow() { mPopupWindow=new PopupWindow(MainActivity.this);// 设置宽高 mPopupWindow.setHeight(ActionBar.LayoutParams.WRAP_CONTENT); mPopupWindow.setWidth(ActionBar.LayoutParams.MATCH_PARENT);// 添加自定义view View popupView=getLayoutInflater().inflate(R.layout.my_popupwindow,null); mPopupWindow.setContentView(popupView);// 点击Window以外的界面返回,必须在show之前设置 mPopupWindow.setOutsideTouchable(true);// 在指定按键下面显示 mPopupWindow.showAsDropDown(mBtn_pop); }}//main_activity<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:id="@+id/button_pop" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="PopupWindow测试"/></RelativeLayout>//自定义的布局<?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"> <TextView android:id="@+id/text_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:layout_gravity="center_horizontal" android:text="文本1"/> <TextView android:id="@+id/text_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:layout_gravity="center_horizontal" android:text="文本2"/> <TextView android:id="@+id/text_3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:layout_gravity="center_horizontal" android:text="文本3"/></LinearLayout>
Notification
手机上接收到的一些推送就是由这个实现的。NotificationManager 控制Notification的发送。PendingIntent 设置弹出界面的链接。
//活动public class MainActivity extends Activity implements View.OnClickListener{ private Button mBtn1; private Button mBtn2; private Button mBtn3; private NotificationManager mNotificationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtn1= (Button) findViewById(R.id.button_sendnew); mBtn3= (Button) findViewById(R.id.button_sendold); mBtn2= (Button) findViewById(R.id.button_cancel);// 初始化notificationmanager mNotificationManager= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mBtn1.setOnClickListener(this); mBtn2.setOnClickListener(this); mBtn3.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.button_sendnew: newNotification(); break; case R.id.button_sendold: oldNotification(); break; case R.id.button_cancel: mNotificationManager.cancel(1);//取消id为1的通知 break; default: break; } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void newNotification() { Intent intent=new Intent(getApplicationContext(),MainActivity.class);//设置pendingintent事件// 设置pendingintent使用方式 PendingIntent pend=PendingIntent.getActivity(getApplicationContext(), 1, intent, PendingIntent.FLAG_ONE_SHOT); Notification notification=new Notification.Builder(MainActivity.this).setSmallIcon(R.mipmap.ic_launcher).setTicker("我是一条消息") .setContentTitle("我是一个标题").setContentText("我是一个文本").setContentInfo("我是内容").setContentIntent(pend) .setAutoCancel(true).setWhen(System.currentTimeMillis()).getNotification();//build mNotificationManager.notify(1,notification); } private void oldNotification() { Notification notification=new Notification();//初始化notification notification.icon= R.mipmap.ic_launcher;//设置通知的图片 notification.tickerText="我是一个消息";//设置状态栏文本 notification.flags=Notification.FLAG_AUTO_CANCEL;//设置为可以取消 Intent intent=new Intent(getApplicationContext(),MainActivity.class);//设置pendingintent事件// 设置pendingintent使用方式 PendingIntent pend=PendingIntent.getActivity(getApplicationContext(), 1, intent, PendingIntent.FLAG_ONE_SHOT);// 设置pendingIntent显示的内容 notification.setLatestEventInfo(getApplicationContext(),"我是标题","我是内容",pend); notification.when=System.currentTimeMillis();//设置触发时间or Calender.getInstance().getTimeInMillis() mNotificationManager.notify(1,notification);//通知管理器将id为1的通知添加 }}//布局<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical" > <Button android:id="@+id/button_sendold" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送消息(旧方法)" /> <Button android:id="@+id/button_sendnew" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送消息(新方法)" /> <Button android:id="@+id/button_cancel" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="取消消息" /></LinearLayout>
- 0828Android基础自定义Dialog+DatePickerDialog+TimePickerDialog+PopupWindow+Notification
- 自定义Dialog;Notification;PopupWindow;DatePickerDialog;TimePickerDialog
- 自定义Dialog,DatePickerDialog,TimePickerDialog,PopupWindow,Notification
- DatePickerDialog、TimePickerDialog、PopupWindow、Notification
- Android自定义Dialog,Toast,Notification和PopupWindow
- 15/8/28/自定义AlterDialog/DatePickerDialog/TimePickerDialog/PopupWindows/Notification
- 自定义Dialog、PopupWindow、通知Notification
- Android DatePickerDialog和TimePickerDialog
- android TimePickerDialog和DatePickerDialog
- android *** TimePickerDialog && DatePickerDialog
- Android DatePickerDialog,TimePickerDialog
- Android控件之TimePickerDialog、DatePickerDialog和自定义DialogPopupWindow与NotificationManager
- PopupWindow,DatePickerDialog,TimePickerDialog,ProgressDialog的使用
- 自定义Dialog DatePicker,TimerPicker PopupWindow Notification
- Android——DatePickerDialog、TimePickerDialog
- Android datepickerdialog/timepickerdialog取消操作
- 自定义Dialog、带时间和日期的Dialog、PopupWindow、Notification
- Android UI系列中的Dialog,包括DatePickerDialog、TimePickerDialog、Toasts以及ProgressDialog
- java异常处理
- 希尔排序(shell)
- Android应用程序用户界面(四)
- 22Generate Parentheses
- hdu5386 Cover(暴力,观察)
- 0828Android基础自定义Dialog+DatePickerDialog+TimePickerDialog+PopupWindow+Notification
- Linux内核同步机制之(三):memory barrier
- 互 联 网 数 据 挖 掘 综 述
- 数据库-关系代数(类型、完整性约束、基本运算、扩展运算)
- 矩阵基本操作(加减乘、求逆、转置)
- 【峰回路转】Excel技巧百例 14.字符串截取函数的经典组合示例
- UIBarButtonItem的分类 (快速返回一个显示图片的UIBarButtonItem)
- web数据挖掘
- 通过应用程序使用字符设备驱动