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