首先,我们利用Android Studio新建一个项目DialogViewTest,直接用Empty Activity模板就行了
1.修改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">
<Button
android:id="@+id/dialog_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="自定义Dialog"/>
</LinearLayout>
可以看到布局代码相当简单,线性布局里面就一个按钮,当然为了在java代码中控制它,我们要给它指定一个id
2.这时我们还要再新建一个布局dialog_view.xml,这个布局用于显示在我们的Dialog中
修改dialog_view.xml布局代码为如下代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/input_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="请输入密码" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<Button
android:id="@+id/cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="取消"
style="?attr/buttonBarButtonStyle"/>
<Button
android:id="@+id/ok"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="确定"
style="?attr/buttonBarButtonStyle"/>
</LinearLayout>
</LinearLayout>
可以看到布局里面有一个线性布局,线性布局里面定义了一个EditText并指定了id,然后再嵌套了一个线性布局,嵌套的线性布局里面定义了两个按钮,一个是取消,一个是确定,并指定了id
3.布局都完成了,这个时候修改MainActivity.java中的代码为如下代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button dialog_view = (Button) findViewById(R.id.dialog_view);//获取activity_main布局里面的Button
dialog_view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialogView();
}
});//为dialog_view按钮监听点击事件
}
private void dialogView()
{
View view1 = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_view,null);
final EditText inputPwd = view1.findViewById(R.id.input_pwd);
Button cancel = view1.findViewById(R.id.cancel);
Button ok = view1.findViewById(R.id.ok);
final AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
.create();//创建Dialog
dialog.setTitle("Dialog自定义View");
dialog.setCancelable(false);
dialog.setView(view1);//设置自定义view
dialog.show();
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});//取消按钮监听点击事件
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (inputPwd.getText().toString().equals("00000000"))
{
Toast.makeText(MainActivity.this,"密码正确!",Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
else
{
Toast.makeText(MainActivity.this,"密码错误,请重新输入!",Toast.LENGTH_SHORT).show();
inputPwd.setText("");
}
}
});//确定按钮监听点击事件
}
}
可以看到我们在onCreate方法中获取到了activity_main布局里面的Button,并且为该Button监听了点击事件,也就是说一点击就会触发onClick方法,那么onClick方法究竟为我们做了什么呢,我们一起来看看:
dialogView();
可以看到这里直接调用了另一个方法dialogView,那么很明显,这个dialogView方法是我们自定义的一个方法,我们找到该方法,其中
View view1 = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_view,null);
用于加载布局,还记得我们刚刚新建的一个dialog_view.xml布局吗,这段代码就是用来加载该布局的,如果不加载的话是没办法使用它的,那为什么activity_main.xml布局我们没有看到用这个方法加载就能使用了呢,这个时候我们回到onCreate方法中再来看看,确实没有
LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main,null);
之类的方法加载布局,但是我们可以看到这一句
setContentView(R.layout.activity_main);
大家都知道这句代码用于给Activity指定布局,其实这个方法内部已经用了mLayoutInflater.inflate(layoutResID, mContentParent);加载了activity_main.xml为该Activity的布局。
然后我们再来看看
final EditText inputPwd = view1.findViewById(R.id.input_pwd);
Button cancel = view1.findViewById(R.id.cancel);
Button ok = view1.findViewById(R.id.ok);
这几句都用了findViewById方法获取控件id,只是要注意view1,这个view1就是刚刚加载的布局,view1.findViewById用于查找该布局下的id。
接下来就是
final AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
.create();//创建Dialog
dialog.setTitle("Dialog自定义View");
dialog.setCancelable(false);
dialog.setView(view1);//设置自定义view
dialog.show();
相信代码对你来说不会陌生,我们先创建了一个dialog,setTitle方法设置标题为“Dialog自定义View”,setCancelable(false)用于禁用返回键关闭dialog,毕竟有一个取消按钮,所以要设置这行代码,当然,不设置也行。接下来就是关键了,setView(view1),没错,这个方法就是用于设置显示的view为view1,view1就是我们自定义的view,前面也提到了,就是加载了dialog_view布局的view1,至于show方法,自然是用于显示dialog了,不然你创建了dialog却不显示,那有何用?
最后就是
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});//取消按钮监听点击事件
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (inputPwd.getText().toString().equals("00000000"))
{
Toast.makeText(MainActivity.this,"密码正确!",Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
else
{
Toast.makeText(MainActivity.this,"密码错误,请重新输入!",Toast.LENGTH_SHORT).show();
inputPwd.setText("");
}
}
});//确定按钮监听点击事件
很明显的按钮监听事件,取消按钮调用dismiss方法关闭dialog,确定按钮判断了输入的内容是否是8个0,如果是则关闭dialog,并发出正确提示,否则就清空输入框,发出错误提示,嗯哼,貌似顺序反了,但是不要在意这些细节,这都不是关键。监听代码之所以要放最后面,是因为必须放在dialog创建之后,不然没有dialog你怎么dismiss?
附上效果图:
screenshot-2017-07-17_10.20.00.109.png本人是小白,厚着脸皮来写博客,如果上面有什么写错的,还望各位大神纠正,感激不尽!
网友评论