Android-Dialog自定义View

作者: void_lhf | 来源:发表于2017-07-17 11:03 被阅读495次

首先,我们利用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

本人是小白,厚着脸皮来写博客,如果上面有什么写错的,还望各位大神纠正,感激不尽!

相关文章

网友评论

    本文标题:Android-Dialog自定义View

    本文链接:https://www.haomeiwen.com/subject/bshfkxtx.html