菜单 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的监听事件,感兴趣的小伙伴可以自己尝试
本文详细介绍了 Android 开发中常用的 UI 控件,包括菜单、上下文菜单、弹出式菜单等,以及如何创建和使用不同类型的对话框,还介绍了 PopupWindow 的特性及其实现方法。
4090

被折叠的 条评论
为什么被折叠?



