菜单 menu
选项菜单(系统菜单)
特点
- 归属Activity管理
- 位于Activity的TitleBar右上角
创建方式
- 列表内容
- 1、 在res/menu中创建xml文件,再在Activity或Fragment中加载菜单项
- 2、 java代码创建菜单项
实例:
第一种:
xml文件属性设置: <item android:id="@+id/aciton_colors" android:title="选择颜色" > <menu> <item android:id="@+id/action_red" android:title="红色"/> <item android:id="@+id/action_green" android:title="绿色" > <item android:id="@+id/action_blue" android:title="蓝色" > </menu> </item> 如上,id为每个item的id,会在R.java文件文件中自动生成对应值; title为每个item标签在UI中显示的值,如同TextView中的text属性; menu为下一级菜单的标签,此处为二级菜单;
在Activity或Fragment中加载菜单项: 重新父类的2个方法: //加载菜单项 @onCreateOptionsMenu(Menu menu) { //加载菜单项,R.menu.main为菜单xml文件的id getMenuInflater().inflate(R.menu.main,menu); } //每个菜单项的处理方法 @onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.action_quit: finish(); break; } }
第二种:
//通过add增加菜单项,"1"为菜单id,对菜单项作处理时, //与方法一中的menu.getItemId()相同 menu.add(menu.NONE, 1, menu.NONE, "java代码创建的菜单"); //设置二级菜单,带有子菜单的二级菜单 SubMenu subMenu = menu.addSubMenu(menu.NONE, 2, menu.NONE, "二级菜单"); subMenu.add(menu.NONE, 21, 1, "sub 2-1"); subMenu.add(menu.NONE, 22, 1, "sub 2-2"); //对菜单项的处理与一中相同;### ContextMenu上下文菜单 #### 特点 - 归属View管理 - 为任意View均可设置 - 长按弹出菜单选项 #### 使用
//为控件注册上下文菜单 registerForContextMenu(lv); //在res/menu中创建每个菜单项 //在Activity中加载菜单 @onCreateContextMenu(Menu menu,View v, ContextMenuInfo menuInfo){ getMenuInflater().inflate(R.menu.main,menu); } //对每个菜单项做出处理 @onContextItemSelected(MenuItem item){ switch(item.getItemId()) { case R.id.action_delect: break; ....... } }
PopupMenu 弹出式菜单
特点
- Api11以上
- 可以为任意的view设置弹出式菜单
- 一般设置在一个监听事件中
使用
//1、得到PopupMenu对象,context为上下文对象,view为需要设置弹出菜单的 //view控件 PopupMenu popupMenu=new PopupMenu(context,view); //2、加载菜单 getMenuInflater().inflate(R.menu.main,pm.getMenu()); //3、 为PopupMenu设置监听器 pm.setOnMenuItemClickListener(.....); //4、 显示PopupMenu pm.show();
对话框 Dialog
普通对话框
创建使用
//此为一个确认退出的对话框样例: //1, 得到普通对话框的创建者 AlertDialog.Builder builder = new AlertDialog.Builder(this); //2, 构建对话框 builder.setIcon(R.drawable.ic_launcher);//设置图标 builder.setTitle("提示");//设置标题 builder.setMessage("是否确认退出?");//设置内容 //设置按钮 /** * text 按钮显示的文字 * listener 按钮处理的事件,不做任何处理填null */ builder.setNegativeButton("取消", null);//(text,listener) builder.setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } });
一些封装好了的对话框
进度条对话框
// 1, 得到进度条对话框的对象 ProgressDialog pd = new ProgressDialog(this); // 2, 构建对话框 pd.setIcon(R.drawable.ic_launcher); pd.setTitle("提示"); pd.setMessage("正在加载, 请稍后...."); pd.setCancelable(false); // 设置进度条对话框的样式 // ProgressDialog.STYLE_HORIZONTAL 水平的 // ProgressDialog.STYLE_SPINNER 转圈的 pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 3, 显示对话框 pd.show(); // 设置进度值 必须要放在显示对话框之后 此处主要看下效果 pd.setProgress(70);
日期对话框
// 获取当前的日期 Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int monthOfYear = calendar.get(Calendar.MONTH); int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 1, 得到日期选择对话框对象 /** * context 上下文对象 callBack onDateSetListener (日期选择器上的"确定"按钮监听器) year 默认的年 * monthOfYear 默认的月份 dayOfMonth 默认的日期 */ DatePickerDialog dp = new DatePickerDialog(this, new OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // 日期选择器上的"确定按钮" 的监听 String str = year + "-" + (monthOfYear + 1) + "-" + dayOfMonth; Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show(); } }, year, monthOfYear, dayOfMonth); // 2, 显示对话框 dp.show();
时间选择对话框
// 1, 得到带有时间选择器的对话框对象 /** * context 上下文对象 callBack onTimeSetListener (点击"完成" 监听器) hourOfDay 默认的小时 * minute 默认的分钟 is24HourView 是否为24小时制 */ TimePickerDialog td = new TimePickerDialog(this, new OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { // 点击的是时间选择器上的"完成" Toast.makeText(MainActivity.this, hourOfDay + ":" + minute, Toast.LENGTH_LONG) .show(); } }, 15, 10, true); // 2, 显示对话框 td.show();
自定义对话框
- 注意:自定义对话框中的EditText需要先res/layout中创建layout和两个editText
// 1, 得到对话框的创建者 AlertDialog.Builder builder = new AlertDialog.Builder(this); // 2, 构建对话框 builder.setIcon(R.drawable.ic_launcher); builder.setTitle("用户登陆"); View view = getLayoutInflater().inflate(R.layout.login, null); final EditText nameEdit = (EditText) view.findViewById(R.id.name_id); final EditText pwdEdit = (EditText) view.findViewById(R.id.pwd_id); builder.setView(view); builder.setNegativeButton("取消", null); builder.setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String name = nameEdit.getText().toString(); String pwd = pwdEdit.getText().toString(); Toast.makeText(MainActivity.this, name + " , " + pwd, Toast.LENGTH_LONG).show(); } }); // 3, 显示对话框 builder.show();
列表对话框
- !!!注意,单击方法请注意自己添加,TextView请注意初始化。
布局文件:(res/layout目录下)
<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:orientation="vertical" 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" > <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="改变我的颜色, 大小和内容" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:onClick="sohwCummon" android:text="普通列表对话框" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="showSingle" android:text="单选列表对话框" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="sohwMulti" android:text="多选列表对话框" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="showAdapter" android:text="适配器列表对话框" /> </LinearLayout>
普通列表对话框
- 主要方法:builder.setItems(String[] items, new OnClickListener(){……});
//1.得到普通对话框的创建者 AlertDialog.Builder builder = new AlertDialog.Builder(this); //2.构建对话框 builder.setIcon(R.drawable.ic_launcher); builder.setTitle("选择颜色"); //设置列表 /** * items 列表的数组 * listener 每个Item的监听 */ //String[] colors =getResources().getStringArray(R.array.colors); builder.setItems(R.array.colors, new OnClickListener() { /** * DialogInterface dialog 当前对话框 * int which 用户当前选中的列表 从0开始 */ @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: tv.setTextColor(Color.RED); break; case 1: tv.setTextColor(Color.GREEN); break; case 2: tv.setTextColor(Color.BLUE); break; } } }); //3.显示对话框 builder.show();
单选对话框
- 主要方法:
builder.setSingleChoiceItems(String[] items, int checkedItem,onClickListener(){….})
// 1.得到普通对话框的创建者 AlertDialog.Builder builder = new AlertDialog.Builder(this); // 2.构建对话框 builder.setIcon(R.drawable.ic_launcher); builder.setTitle("设置文字大小"); // 设置单选列表 String[] sizes = { "文字大小为:20", "文字大小为:30", "文字大小为:40" }; // 第二个参数 : 默认选中Item的下标 如果没有默认选中: checkedItem 为-1 builder.setSingleChoiceItems(sizes, -1, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 记录当前选中的是那一个 position = which; } }); builder.setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 根据记录的选中的内容, 去设置TextSize switch (position) { case 0: tv.setTextSize(20); break; case 1: tv.setTextSize(30); break; case 2: tv.setTextSize(40); break; } } }); // 3, 显示对话框 builder.show();
多选列表对话框
- 主要方法:
builder.setMultiChoiceItems(String[] items,
boolean[] checkedItems,onMultiChoiceItems(){…..})
// 1.得到普通对话框的创建者 AlertDialog.Builder builder = new AlertDialog.Builder(this); // 2.构建对话框 builder.setIcon(R.drawable.ic_launcher); builder.setTitle("请选择您的爱好"); //设置多选列表 final String[] hobbys = { "游戏", "电影", "学习", "看书", "敲代码" }; final boolean[] checkedItems = new boolean[hobbys.length]; builder.setMultiChoiceItems(hobbys, checkedItems, new OnMultiChoiceClickListener() { /** * DialogInterface dialog 当前对话框 int which 当前选中*的Item的下标 * boolean isChecked 当前选中的Item对应的状态 */ @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { // 记录当前item状态 checkedItems[which] = isChecked; } }); builder.setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { StringBuilder sBuilder = new StringBuilder(); // 根据状态, 设置内容 for (int i = 0; i
适配器列表对话框
- 主要方法:builder.setAdapter(adapter, onClickListener(){…..})
// 1, 得到普通对话框的创建者 AlertDialog.Builder builder = new AlertDialog.Builder(this); // 2, 构建对话框 builder.setIcon(R.drawable.ic_launcher); builder.setTitle("请选择你的操作"); // 设置适配器列表 String[] data = { "声音设置", "WIFI设置", "设置" }; ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data); builder.setAdapter(adapter, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(); switch (which) { case 0: intent.setAction("android.settings.SOUND_SETTINGS"); break; case 1: intent.setAction("android.settings.WIFI_SETTINGS"); break; case 2: intent.setAction("android.settings.SETTINGS"); break; } startActivity(intent); } }); // 3, 显示对话框 builder.show(); // builder.create().show(); // builder.create().dismiss();对话框消失
PopupWindow
特点(与dialog区别)
- 他能够直接指定显示位置
- 自定义设置宽高
- PopupWindow没有默认布局,必须由手动设置
- -
PopupWindow的创建
public PopupWindow (Context context)
public PopupWindow(View contentView)
public PopupWindow(View contentView, int width, int height)
public PopupWindow(View contentView, int width, int height, boolean focusable)
根据他的构造函数,一般使用第三个构造方法
例如:
PopupWindow window = new PopupWindow(view,LayoutParams.MATCH_PARENT,
PopupWindow的展示
- 根据设定的具体位置去展示
- showAtLocation(parent, gravity, x, y); >>>(parent:父控件/gravity:相对于父控件的位置/x y 偏移量width,height;例如:showAtLocation(view, Gravity.BOTTOM, 0, 0);)
- showAsDropDown(view, x, y);>>>view:以某个控件为参照(例如: window.showAsDropDown(textView, 0, 100);)
- isShowing(); 判断是否正在展示
- dismiss();
实例展示
Layout布局:
主布局activity_main:
<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" tools:context=".MainActivity" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:onClick="showPopupWindow" android:text="展示popupWindow" /> </RelativeLayout>
popupWindow显示布局popup_item:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#ee0"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> </LinearLayout>
MainActivity代码:
MainActivity.java:
package com.example.popupwindowdemo; import android.os.Bundle; import android.text.Layout; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.PopupWindow; import android.app.Activity; public class MainActivity extends Activity { //数据: private String[] data = { "Java", "C++", "C", "Android" }; //此处数据简单,用ArrayAdapter即可 private ArrayAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //将数据放入adapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data); } public void showPopupWindow(View view) { //此为popupWindow弹出控件的布局文件,将popup_item通过LayoutInflater转化为View View contentView = LayoutInflater.from(MainActivity.this).inflate( R.layout.popup_item, null); //从contentView中找到listView视图 ListView listView=(ListView) contentView.findViewById(R.id.list_view); //将数据放入listView listView.setAdapter(adapter); //1.实例化PopupWindow对象 PopupWindow popupWindow = new PopupWindow(contentView, 300, LayoutParams.WRAP_CONTENT); //2.显示popupWindow View rootview = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main, null); popupWindow.showAtLocation(rootview, Gravity.BOTTOM, 0, 0); //此处就不再设置listView的点击事件了,这个一个简单的popupWindow的展示 } }
- 此处由于只是简单的展示popupWindow功能,并没有设置listView的监听事件,感兴趣的小伙伴可以自己尝试