目录
Android ProgressDialog (进度条对话框)
例子
Android DatePickerDialog 日期选择对话框
例子
Android TimePickerDialog 时间选择对话框
Android PopupWindow 悬浮框
构造函数
方法
例子
官方文档
Android OptionMenu 选项菜单
例子
官方文档
Android ProgressDialog (进度条对话框)
Android ProgressDialog 已经在 API 26+ 中被废弃,ProgressDialog 不能直接从 XML 里创建。
例子
<?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"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_show_normal_progress_dialog"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="显示普通ProgressDialog" /><Buttonandroid:id="@+id/btn_show_indeterminate_progress_dialog"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="显示不确定结束的ProgressDialog" /><Buttonandroid:id="@+id/btn_show_determinate_progress_dialog"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="显示确定结束的ProgressDialog" /></LinearLayout>
package com.example.myapplication;import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private ProgressDialog progressDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btnShowNormal = findViewById(R.id.btn_show_normal_progress_dialog);Button btnShowIndeterminate = findViewById(R.id.btn_show_indeterminate_progress_dialog);Button btnShowDeterminate = findViewById(R.id.btn_show_determinate_progress_dialog);btnShowNormal.setOnClickListener(v -> {showProgressDialog(ProgressDialog.STYLE_SPINNER); // 普通ProgressDialog});btnShowIndeterminate.setOnClickListener(v -> {showProgressDialog(ProgressDialog.STYLE_HORIZONTAL); // 不确定结束的ProgressDialog});btnShowDeterminate.setOnClickListener(v -> {showDeterminateProgressDialog(); // 确定结束的ProgressDialog});}private void showProgressDialog(int style) {progressDialog = new ProgressDialog(MainActivity.this);progressDialog.setTitle("软件更新中");progressDialog.setMessage("软件正在更新中,请稍后...");progressDialog.setProgressStyle(style);progressDialog.setCancelable(false); // 防止用户取消progressDialog.show();// 模拟操作new Handler().postDelayed(() -> {progressDialog.dismiss();}, 3000); // 模拟3秒后关闭对话框}private void showDeterminateProgressDialog() {progressDialog = new ProgressDialog(MainActivity.this);progressDialog.setTitle("软件更新中");progressDialog.setMessage("软件正在更新中,请稍后...");progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);progressDialog.setMax(100); // 设置最大值progressDialog.setCancelable(false);progressDialog.show();// 模拟下载进度更新new Thread(() -> {int progress = 0;while (progress <= 100) {progressDialog.setProgress(progress);progress += 10;try {Thread.sleep(500); // 模拟下载延迟} catch (InterruptedException e) {e.printStackTrace();}}progressDialog.dismiss();}).start();}
}
Android DatePickerDialog 日期选择对话框
当用户点击一个按钮,弹出日期选择对话框是一个常见的需求。
例子
<?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"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_pick_date"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="选择日期"/></LinearLayout>
package com.example.myapplication;import android.app.DatePickerDialog;
import android.os.Bundle;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;import java.util.Calendar;public class MainActivity extends AppCompatActivity {private Button btnPickDate;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnPickDate = findViewById(R.id.btn_pick_date);btnPickDate.setOnClickListener(v -> showDatePickerDialog());}private void showDatePickerDialog() {// 获取当前日期Calendar calendar = Calendar.getInstance();int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH);int day = calendar.get(Calendar.DAY_OF_MONTH);// 创建并显示日期选择对话框DatePickerDialog datePickerDialog = new DatePickerDialog(this, (view, selectedYear, selectedMonth, selectedDay) -> {// 处理选择的日期String selectedDate = selectedYear + "-" + (selectedMonth + 1) + "-" + selectedDay;btnPickDate.setText(selectedDate); // 在按钮上显示选择的日期}, year, month, day);datePickerDialog.show();}
}
Android TimePickerDialog 时间选择对话框
Android TimePickerDialog ( 时间选择对话框 ) 会弹出一个对话框形式的时间选择器。
<?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"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_pick_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="选择时间"/></LinearLayout>
package com.example.myapplication;import android.app.TimePickerDialog;
import android.os.Bundle;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;import java.util.Calendar;
import java.util.TimeZone;public class MainActivity extends AppCompatActivity {private Button btnPickTime;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnPickTime = findViewById(R.id.btn_pick_time);btnPickTime.setOnClickListener(v -> showTimePickerDialog());}private void showTimePickerDialog() {// 获取中国的当前时间Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00")); // 设置时区为中国标准时间int hour = calendar.get(Calendar.HOUR_OF_DAY);int minute = calendar.get(Calendar.MINUTE);// 创建并显示时间选择对话框TimePickerDialog timePickerDialog = new TimePickerDialog(this, (view, selectedHour, selectedMinute) -> {// 处理选择的时间String selectedTime = String.format("%02d:%02d", selectedHour, selectedMinute);btnPickTime.setText(selectedTime); // 在按钮上显示选择的时间}, hour, minute, true); // 最后一个参数表示是否为24小时制timePickerDialog.show();}
}
Android PopupWindow 悬浮框
PopupWindow 是一个弹出窗口控件,可以显示任意 View,并且浮动在当前 Activity 的顶部。通常用于悬浮在其他 UI 控件旁边,提供额外的信息或操作选项。与 AlertDialog 不同,PopupWindow 的位置可以自由设置,可以根据需要显示在屏幕的任何位置。
构造函数
PopupWindow 类的构造函数如下:
- PopupWindow(): 创建一个空的 PopupWindow 对象。
- PopupWindow(Context context): 使用指定的上下文创建 PopupWindow 对象。
- PopupWindow(Context context, AttributeSet attrs): 使用指定的上下文和属性集创建 PopupWindow 对象。
- PopupWindow(Context context, AttributeSet attrs, int defStyleAttr): 使用指定的上下文、属性集和样式资源创建 PopupWindow 对象。
- PopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes): 使用指定的上下文、属性集、样式资源和主题资源创建 PopupWindow 对象。
- PopupWindow(View contentView): 使用指定的内容视图创建 PopupWindow 对象。
- PopupWindow(int width, int height): 创建指定宽高的 PopupWindow 对象。
- PopupWindow(View contentView, int width, int height): 使用指定的内容视图以及宽高创建 PopupWindow 对象。
- PopupWindow(View contentView, int width, int height, boolean focusable): 使用指定的内容视图、宽高和焦点设置创建 PopupWindow 对象。
方法
以下是一些重要的 PopupWindow 方法的说明:
- setContentView(View contentView): 设置 PopupWindow 显示的 View。
- getContentView(): 获取 PopupWindow 显示的 View。
- showAsDropDown(View anchor): 在指定控件正下方显示 PopupWindow,无偏移。
- showAsDropDown(View anchor, int xoff, int yoff): 在指定控件位置显示 PopupWindow,并可以设置偏移量。
- showAtLocation(View parent, int gravity, int x, int y): 在父控件指定位置显示 PopupWindow,可以设置具体位置、偏移量等。需要传入 Activity 中的任意一个 View 作为 parent 参数。
- setWidth(int width) / setHeight(int height): 设置 PopupWindow 的宽度和高度,也可以在构造方法中指定。
- setFocusable(true): 设置 PopupWindow 是否具有焦点。当设置为 true 时,PopupWindow 弹出后会处理触摸事件和物理按键事件,必须先让 PopupWindow 消失才能响应其他事件。
- setAnimationStyle(int style): 设置 PopupWindow 弹出和消失的动画效果。
例子
1、创建 res/layout/popup_content.xml 布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:padding="16dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="弹出内容"android:textSize="16sp"android:textColor="@android:color/black" /><Buttonandroid:id="@+id/close_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="关闭"android:textColor="@android:color/white"android:background="@color/purple" />
</LinearLayout>
2、修改 res/layout/activity_main.xml 布局文件:
<?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"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/show_popup_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="显示弹出菜单" /></LinearLayout>
3、修改 MainActivity.java:
package com.example.myapplication;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private PopupWindow popupWindow;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 创建一个 View 作为 PopupWindow 的内容视图View contentView = LayoutInflater.from(this).inflate(R.layout.popup_content, null);// 创建 PopupWindow 对象并设置内容视图、宽高popupWindow = new PopupWindow(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);// 设置焦点,让 PopupWindow 弹出后处理触摸事件和物理按键事件popupWindow.setFocusable(true);// 找到触发弹出 PopupWindow 的按钮Button showPopupButton = findViewById(R.id.show_popup_button);showPopupButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 在按钮下方显示 PopupWindow,无偏移popupWindow.showAsDropDown(v);}});// 找到关闭 PopupWindow 的按钮Button closeButton = contentView.findViewById(R.id.close_button);closeButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 关闭 PopupWindowpopupWindow.dismiss();}});}
}
官方文档
-
Android PopupWindow
Android OptionMenu 选项菜单
在Android中,OptionMenu(选项菜单)的创建和管理不是通过XML直接实例化或某个类的实例化方法实现的,而是通过Activity提供的几个生命周期方法进行动态创建和控制。
具体来说:
- onCreateOptionsMenu(Menu menu):这是用于初始化选项菜单的方法,在这个方法里,我们可以调用getMenuInflater().inflate(R.menu.menu_main, menu);来加载预定义在XML文件中的菜单项,或者通过调用menu对象的add()方法动态添加菜单项。
- onOptionsItemSelected(MenuItem item):当用户点击选项菜单中的某一项时,系统会调用此方法,我们可以在其中根据item的id进行相应的操作处理。
- onPrepareOptionsMenu(Menu menu):在每次菜单即将显示前,系统都会调用此方法,以便我们可以根据当前应用的状态动态修改菜单项的状态或可见性等属性。
- onOptionsMenuClosed(Menu menu):当选项菜单关闭后,系统会调用此回调方法,可以在此处执行菜单关闭后的清理工作。
- onMenuOpened(int featureId, Menu menu):如果我们的应用支持旧版的API(如ActionBar的子菜单),当选项菜单打开时,系统可能会调用此方法通知我们菜单已打开。
例子
1、在 res/menu/menu_main.xml 菜单文件中定义要显示的菜单项:
<!-- menu_main.xml -->
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/menu_item1"android:title="选项 1" /><itemandroid:id="@+id/menu_item2"android:title="选项 2" />
</menu>
2、修改 res/layout/activity_main.xml 布局文件:
<?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"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/open_popup_menu_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="显示弹出菜单" /></LinearLayout>
3、修改 MainActivity.java:
package com.example.myapplication;import android.os.Bundle;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button openPopupMenuButton = findViewById(R.id.open_popup_menu_button);openPopupMenuButton.setOnClickListener(v -> {PopupMenu popupMenu = new PopupMenu(MainActivity.this, openPopupMenuButton);popupMenu.getMenuInflater().inflate(R.menu.menu_main, popupMenu.getMenu());popupMenu.setOnMenuItemClickListener(item -> {int id = item.getItemId();if (id == R.id.menu_item1) {// 处理选中 选项 1 的事件Toast.makeText(MainActivity.this, "选择了选项1", Toast.LENGTH_SHORT).show();return true;} else if (id == R.id.menu_item2) {// 处理选中 选项 2 的事件Toast.makeText(MainActivity.this, "选择了选项2", Toast.LENGTH_SHORT).show();return true;}return false;});popupMenu.show();});}
}
官方文档
- Android menus