从零开始水安卓——基础UI组件9(AlterDialog)
题外话…试用了一下****的markdown编辑器,简直不要太难用…上传个图片竟然改不了大小…查了一下…还得通过img标签设置src来想办法…所以这篇文章可能会出现图片过大的情况(因为是原始尺寸)
太真实了…代码块语法还不能高亮?
Dialog
开发中经常会在界面上弹出一些对话框,询问用户或让用户选择,这些功能称为Android Dialog,它具有一定的类型,如下图。
图片出处:https://www.cnblogs.com/gzdaijie/p/5222191.html
提示信息对话框
先建立一个按钮,修改activity_main.xml
<Button
android:id="@+id/button"
android:layout_width="290dp"
android:layout_height="122dp"
android:layout_marginTop="201dp"
android:text="提示对话框"
android:onClick="dialog"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
然后修改MainActivity
package com.example.a316;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void dialog(View view){
//创建提示对话框构建器
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//设置的东西都在这里设置
builder.setTitle("这是标题");//设置标题,分两种,要么引用资源,要么直接给字符串
builder.setMessage("这是提示内容");//设置提示内容
builder.setIcon(R.mipmap.ic_launcher);//设置个小图片
//确定类按钮,仅代表样式
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"按下了确认按钮",Toast.LENGTH_LONG).show();
}
});//设置按钮 两个参数,一个参数是按钮显示内容,一个参数是按钮事件
//否定类按钮
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"按下了取消按钮",Toast.LENGTH_LONG).show();
}
});
//中立按钮
builder.setNeutralButton("中间的", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"按下了中间的按钮",Toast.LENGTH_LONG).show();
}
});
//最后需要创建
AlertDialog dialog = builder.create();
dialog.show();
//也可以省略的写
//builder.show();
}
}
需要注意的事项已经写在代码中了。
最后补充说明,Positive、Negative、Neutral三种按钮,仅代表样式,即分别位于左侧右侧中间(老版本),新版本的话,分别是右侧偏左,最右侧,和左侧,如下图。
然后实际上不一定要Positive就一定是“积极的”的按钮…
列表选项对话框
再建立一个按钮
<Button
android:id="@+id/button2"
android:layout_width="245dp"
android:layout_height="118dp"
android:layout_marginBottom="223dp"
android:text="列表选项对话框"
android:onClick="dialog2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
public void dialog2(View view){
//创建构建器
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final String[] items ={"选项1","选项2","选项3"};
//设置列表,两个参数,前者为你的参数列表,后者为单击事件
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,items[which],Toast.LENGTH_LONG).show();
}
});
//设置的东西都在这里设置
builder.setTitle("这是标题");//设置标题,分两种,要么引用资源,要么直接给字符串
//最后需要创建
AlertDialog dialog = builder.create();
dialog.show();
//也可以省略的写
//builder.show();
}
有一个注意事项
方法中内部类访问方法的局部变量,该变量必须要用final修饰
此外,列表对话框已经有点击事件了 所以不需要再写按钮了。
多选列表对话框
类似的…
<Button
android:id="@+id/button3"
android:layout_width="245dp"
android:layout_height="0dp"
android:layout_marginBottom="70dp"
android:onClick="dialog3"
android:text="多选列表对话框"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
修改MainActivity
关键在于 builder.setMultiChoiceItems(a,b,c)
三个参数,第一个参数列表,第二个是一个布尔类型数组可以设置哪些已经被选中,最后是单击事件
public void dialog3(View view){
//创建构建器
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final String[] items ={"选项1","选项2","选项3"};
final ArrayList<String> list =new ArrayList<String>();
//设置列表,两个参数,前者为你的参数列表,后者为单击事件
builder.setMultiChoiceItems(items, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if(isChecked==true){
list.add(items[which]);
}
else{
list.remove(items[which]);
}
}
});
//确定显示List
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,list.toString(),Toast.LENGTH_LONG).show();
}
});
builder.setNegativeButton("清除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
list.clear();
//关闭对话框
dialog.dismiss();
}
});
builder.setTitle("这是标题");//设置标题,分两种,要么引用资源,要么直接给字符串
AlertDialog dialog = builder.create();
dialog.show();
}
按下确定后…
多项单选对话框
还是一个按钮
<Button
android:id="@+id/button3"
android:layout_width="245dp"
android:layout_height="39dp"
android:layout_marginBottom="70dp"
android:onClick="dialog4"
android:text="多项单选对话框"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
然后MainActivity
主要区别在于builder.setSingleChoiceItems(列表项,默认选中的项目,事件)
默认选中的项目参数为一个int类型,代表数组的第一个元素…例如填0,就是列表项第一个元素
//定义在方法外
String result="选项1";
public void dialog4(View view){
//创建构建器
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final String[] items ={"选项1","选项2","选项3"};
//设置列表,两个参数,前者为你的参数列表,后者为单击事件
builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result = items[which];
Toast.makeText(MainActivity.this,"你选中了"+items[which],Toast.LENGTH_LONG);
}
});
//确定显示List
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();
}
});
builder.setNegativeButton("清除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//关闭对话框
dialog.dismiss();
}
});
builder.setTitle("这是标题");//设置标题,分两种,要么引用资源,要么直接给字符串
AlertDialog dialog = builder.create();
dialog.show();
}
按下确认后的效果
自定义对话框
还是activity_main.xml中还是需要添加一个按钮,就不再重复了…
主要区别还是在MainActivity
以登录对话框为例
然后不一样的地方是还需要建立一个layout文件
<?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="horizontal">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/id"
android:inputType="textPersonName"
android:hint="username"
/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/password"
android:inputType="textPassword"
android:hint="password"
/>
</LinearLayout>
然后通过 builder.setView(R.layout.loginlayout); 来引用这个布局
注意API版本必须要高于21
下面提供低于API21的写法
public void dialog5(View view){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("登录对话框");//设置标题,分两种,要么引用资源,要么直接给字符串
//builder.setView(R.layout.loginlayout);API大于21
//实例化布局对象
final View v = getLayoutInflater().inflate(R.layout.loginlayout,null);
builder.setView(v);
//点击确认得到用户名和密码的值
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
EditText text = v.findViewById(R.id.id);
EditText text2 = v.findViewById(R.id.password);
String username = text.getText().toString();
String password = text2.getText().toString();
Toast.makeText(MainActivity.this,username+"/"+password,Toast.LENGTH_LONG).show();
}
});
builder.setNegativeButton("清除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//关闭对话框
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
输入 1234和444之后