弹窗的实现形式有很多种,eg:Dialog、PopupWindow等。
今天跟大家写一个使用Activity实现的弹窗。
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="280dp"
android:layout_height="190dp"
android:background="@drawable/shape_avatar_change_bg"
android:orientation="vertical"
android:weightSum="14">
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:gravity="center"
android:text="@string/changeAvatar"
android:textColor="@color/status_color"
android:textSize="16sp"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/status_color"/>
<TextView
android:id="@+id/tv_take_photo"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="5"
android:background="@drawable/seletor_bg_setting_item"
android:gravity="center"
android:text="@string/takePhoto"
android:textColor="@color/light_black_color"
android:textSize="16sp"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/layout_divider_color"/>
<TextView
android:id="@+id/tv_chose_gallery"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="5"
android:background="@drawable/seletor_bg_setting_item"
android:gravity="center"
android:text="@string/choseFromGallery"
android:textColor="@color/light_black_color"
android:textSize="16sp"/>
</LinearLayout>
跟一般的activity布局一样,唯一的区别就是需要写死根布局的宽高,嗯……我还没有找到更优雅的写法……
Activity:
public class ChangeAvatarActivity extends Activity {
private static int CAMERA_REQUEST_CODE = 1;
private static int GALLERY_REQUEST_CODE = 2;
private static int CROP_REQUEST_CODE = 3;
private TextView tvFromGallery;
private TextView tvTakePhoto;
private File img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.avatar_revise_activity);
initViews();
}
private void initViews() {
tvTakePhoto = (TextView) findViewById(R.id.tv_take_photo);
tvFromGallery = (TextView) findViewById(R.id.tv_chose_gallery);
//拍照
tvTakePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
//从相册选
tvFromGallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
finish();//点击窗口外部区域 弹窗消失
return true;
}
}
这里点击外部区域 弹窗消失 写的比较粗暴…… 但是因为给需要点击的区域加了点击事件 所以不会有影响。
下面关键的部分来了:
在 manifest文件中
<activity
android:name=".activity.ChangeAvatarActivity"
android:theme="@style/MyDialogActivityStyle"/>
style:
<style name="MyDialogActivityStyle">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
解释一下:
<item name="android:windowBackground">@android:color/transparent</item>
- 设置背景色
<item name="android:windowFrame">@null</item>
- 设置windowFrame框 这里不显示
<item name="android:windowIsFloating">true</item>
- 是否浮现在activity之上(底部的activity)
<item name="android:windowIsTranslucent">true</item>
- 窗口是否半透明 配合背景色使用
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
- 窗口弹出样式
<item name="android:backgroundDimEnabled">true</item>
- 是否设置背景模糊
<item name="android:windowContentOverlay">@null</item>
*弹窗是否有遮盖 不设置的话有可能会出现边界黑线
有问题欢迎留言提出,之后会用这种方法 写一个更换头像的demo 请看后边的博文