今天尝试了一下自定义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实例时会报空指针。