ToolBar
简单属性设置如下图所示
<androidx.appcompat.widget.Toolbar
android:id="@+id/tb"
android:background="#ffff00"
app:navigationIcon="@drawable/ic_apps_black_24dp"
app:title="test"
app:titleTextColor="#00f000"
app:titleMarginStart="20dp"
app:logo="@mipmap/ic_launcher"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
>
</androidx.appcompat.widget.Toolbar>
AlertDialog
AlertDialog并不需要到布局文件中创建,而是在代码中通过构造器(AlertDialog.Builder)来构造标题、图标和按钮等内容的。
1. 创建构造器AlertDialog.Builder的对象;
2. 通过构造器对象调用setTitle、setMessage、setIcon等方法构造对话框的标题、信息和图标等内容;
3. 根据需要调用setPositive/Negative/NeutralButton()方法设置正面按钮、负面按钮和中立按钮;
4. 调用构造器对象的create方法创建AlertDialog对象;
5. AlertDialog对象调用show方法,让对话框在界面上显示。
public void lClick(View view){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.ic_launcher)
.setTitle("Dialog")
.setMessage("how are you")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("Alert","asure");
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("Alert","cancel");
}
})
.setNeutralButton("开始", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("Alert","start");
}
})
.create()
.show();
}
建造者模式的优点:
- 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可创建不同的产品对象。
- 每一个建造者都相对独立,与其他的建造者无关,因此可以很方便的替换具体建造者或增加新的具体建造者,用户使用不同的建造者即可得到不同的产品对象。符合开闭原则。
- 用户可以更加精细的控制产品的创建过程,将复杂的产品创建步骤费解在不同的方法中,使得创建过程更加清晰,也更方便实用程序来控制创建过程。
建造者模式缺点
- 建造者模式创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,如组成部分很多不同,则不适合用建造者模式,因此,适用范围受到一定的限制。
- 如果产品内部变化复杂,可能会需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加了系统的理解难度和运行成本。
PopupWindow
PopupWindow与AlertDialog的区别主要是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的。
//获取View
View popupView = getLayoutInflater().inflate(R.layout.popup_view,null);
//可以对popupView中的按钮设置监听,在点击完成后可以调用popupWindow.dismiss()把popupWindow进行退出。
Button btn1 = popupView.findViewById(R.id.btn1);
Button btn2 = popupView.findViewById(R.id.btn2);
popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setFocusable(true); //设置焦点,点空白处可以退出
popupWindow.showAsDropDown(view);//相对于某个和控件的位置(正下方)
dismiss()和cancel()的区别
查看源码,发现cancel方法调用了dismiss方法,如果用户创建AlertDialog时调用了setOnCancelListeener的mCancleMessage变量时,这两种方法是不同的。
popupWindow只未继承于Dialog,只实现了dismiss