自定义dialog并且去除黑边

今天尝试了一下自定义dialog。

想做成上传头像的那种,有两个button,一个作为手机摄像头拍摄用,一个调用手机SD卡的图库。

先是布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#11ffffff"
    android:layout_gravity="center"
    android:orientation="vertical"
    >


        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:gravity="center"
            android:layout_weight="1"
            android:text="选择头像"
            android:textSize="18sp"/>
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@drawable/cursor_color"
            />
        <Button
            android:id="@+id/dialog_camera_btn"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="拍摄头像"
            android:textSize="16sp"
            android:background="@color/colorPrimaryText"/>
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@drawable/cursor_color"
            />
        <Button
            android:id="@+id/dialog_pic_btn"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="从图库中选择"
            android:textSize="16sp"
            android:background="@color/colorPrimaryText"/>
    </LinearLayout>
 LinearLayout的background是自定义的一个圆角,就不贴代码了。 
 

然后在代码里引入自定义dialog

 		View view = getLayoutInflater().inflate(R.layout.my_dialog,null);
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyDialog);
                builder.setView(view);
                AlertDialog alertDialog = builder.create();
                Button camera = view.findViewById(R.id.dialog_camera_btn);
                camera.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        startActivityForResult(intent, CAMERA_REQUEST_CODE);
                    }
                });
                alertDialog.setCanceledOnTouchOutside(true);      //设置弹出框失去焦点是否隐藏,即点击屏蔽其它地方是否隐藏
                alertDialog.show();

拿到的view就是上面自定义的dialog布局文件。因为我是在fragment里实例化一个AlertDialog,所以传入的Context是通过getActivity()拿到的。

然后通过setView(view)加载布局。

中间拿到了其中一个button的实例,并且设置了点击监听事件。

最后别忘了show出来。

如果想加上自定义style的话,就在实例化AlertDialog.Builder里传入style即可(因为默认的确实丑)

我的style是这样的,网上有很多:

 <!--自定义dialog背景全透明无边框theme -->
    <style name="MyDialog" parent="@android:style/Theme.DeviceDefault.Light.Dialog">
        <!--背景颜色及和透明程度-->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!--是否去除标题 -->
        <item name="android:windowNoTitle">true</item>
        <!--是否去除边框-->
        <item name="android:windowFrame">@null</item>
        <!--是否浮现在activity之上-->
        <item name="android:windowIsFloating">true</item>
        <!--是否模糊-->
        <item name="android:backgroundDimEnabled">false</item>

    </style>

这里有两个地方需要注意,一个是parent的属性值,网上有很多都是android:style/Theme.Dialog。如果parent的属性是这个的话,创建的dialog会有很严重的黑边,想要去除黑边把parent的属性值改为代码里的那个就好。

还有一个windowBackgrount属性,如注释,可以自己定义一个颜色。最好是透明的。

最终的效果如下:

比较小,而且看起来很奇怪,有点像是嵌入到fragment里了。这个在布局和style改成自己想要的就行。


P.S:在自定义dialog布局那里,我加了两个横线,那里的View的V千万不要小写,否则在拿到dialog实例时会报空指针。

 
 

猜你喜欢

转载自blog.csdn.net/qq_33621326/article/details/78682584
今日推荐