安卓-三种类型的弹出框
做安卓开发以来,大体用过三种形式的弹出框,实现的效果差不多,只是数据处理的方式不同,根据不同的需求选择合适的弹出框,样式要根据自己的需求更改。
- 第一种:安卓自带AlertDialog
- 第二种:popwindow
- 第三种:activity类型自定义的弹出框
来看下效果图
第一种:安卓自带AlertDialog
第一种比较简单,代码量很少,鉴于现在安卓版本的提升,自带的很多控件的样式其实也并不难看,只要不是特殊的需求,一般可以直接使用,这个不多说,下面是一个适用于ListView的弹出框。
代码
直接写成一个方法,参数可以自己定义,因为可能一个页面会用到多个dialog,这里传入的是一个动态的list,也可以直接扔过去一个数组。
private void selectTypeDiag(final List<String> list) {
int len=();
final String items[]=new String[len];//不能直接用,会出错
for (int i=0;i<();i++){
items[i]=(i);
}
//dialog参数设置
builder = new (this); //先得到构造器
("请选择"); //设置标题
//("是否确认退出?"); //设置内容
//(.ic_launcher);//设置图标,图片id即可
//设置列表显示,注意设置了列表显示就不要设置()了,否则列表不起作用。
(items, new () {
@Override
public void onClick(DialogInterface dialog, int which) {
();
tv_text.setText(items[which]);
}
});
();
().show();
}
第二种:popwindow
popwindow与第一种相比灵活性比较大,可以自定义布局文件,可以添加动画,自定义弹出方位。
代码
一、首先定义一个popwindow,layout和动画可以自己定义,代码里都有注释。
public class PopShowView extends PopupWindow {
private LayoutInflater layoutInflater;
private View popView;
private List<String> infoList;
private ListView lv_leavetype;
private PopShowAdapter popLeaveTypeAdapter;
private Context context;
private LinearLayout pop_layout;
private PopLeaveTypeListener popLeaveTypeListener;
public PopShowView(Context context, List<String> infoList) {
this.layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.context = context;
this.infoList = infoList;
init();
}
private void init() {
popView = (.pop_window_leavetype, null);
lv_leavetype = (ListView) (.lv_leavetype);
pop_layout = (LinearLayout) (.pop_layout);
if (infoList != null) {
popLeaveTypeAdapter = new PopShowAdapter(context, infoList);
lv_leavetype.setAdapter(popLeaveTypeAdapter);
lv_leavetype.setOnItemClickListener(new () {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (popLeaveTypeListener != null) {
((position));
}
dismiss();
}
});
}
//把View添加到PopWindow中
this.setContentView(popView);
//设置SelectPicPopupWindow弹出窗体的宽
this.setWidth(.MATCH_PARENT);
//设置SelectPicPopupWindow弹出窗体的高
this.setHeight(.WRAP_CONTENT);
//设置SelectPicPopupWindow弹出窗体可点击
this.setFocusable(true);
//设置SelectPicPopupWindow弹出窗体动画效果
this.setAnimationStyle();
// (new ColorDrawable());//实例化一个ColorDrawable颜色为透明
//实例化一个ColorDrawable颜色为半透明
ColorDrawable dw = new ColorDrawable(0x6f000000);
//设置SelectPicPopupWindow弹出窗体的背景
this.setBackgroundDrawable(dw);
(new () {//设置背景区域外为点击消失popwindow
public boolean onTouch(View v, MotionEvent event) {
int height = (.pop_layout).getTop();
int y = (int) ();
if (() == MotionEvent.ACTION_UP) {
if (y < height) {
dismiss();
}
}
return true;
}
});
}
public void setClickDataListener(PopLeaveTypeListener popLeaveTypeListener) {
this.popLeaveTypeListener = popLeaveTypeListener;
}
// @Override
// public void onClick(View arg0) {
// switch (()) {
// case .iv_close_pop:
// dismiss();
// break;
// default:break;
// }
// }
}
二、因为要添加点击事件,并且需要在activity里面获取到list里面的数据,所以还要在写一个监听器PopLeaveTypeListener 。
/**
* Created by Daxue on 2016/12/2.
*/
public interface PopLeaveTypeListener {
void clickData(String data);//数据类型根据自己list的类型定义
}
三、下面是activity里面TextView的点击事件。
case R.id.tv_thetwo:
PopShowView popshow = new PopShowView(this, mData);
if (popshow.isShowing()) {
popshow.dismiss();
} else {
// myPopWindowBottomShow.showAsDropDown(bottom_popwindow);//popwindow放在子控件bottom_popwindow下面Ps:如果手机有虚拟按键的话popwindow将显示不完全
popshow.showAtLocation(this.findViewById(R.id.activity_main), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);//这种方式无论有虚拟按键还是没有都可完全显示,因为它显示的在整个父布局中
}
popshow.setClickDataListener(new PopLeaveTypeListener() {
@Override
public void clickData(String data) {
// Toast.makeText(getContext(),
// year + "-" + month + "-" + day, Toast.LENGTH_SHORT).show();
// setAddPopwindowShowData(day,month,year);
tv_thetwo.setText(data + "");
}
});
break;
第三种:activity类型的dialog
一、首先定义activity的主题theme
<style name="Dialog" parent="android:style/">
<item name="android:background">#00000000</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
</style>
二、DialogActivity
public class DialogActivity extends Activity implements
View.OnClickListener {
private static final String TAG="DialogActivity";
private TextView tv_remark,tv_submit;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(.activity_signalertdialog);
//定义弹出框,防止弹出框的高度和宽度变形
WindowManager m = getWindowManager();
Display d = ();//为获取屏幕宽、高
p = getWindow().getAttributes();//获取对话框当前的参数值
= (int) (() * 1.0);//高度设置为屏幕的1.0
= (int) (() * 1.0); //宽度设置为屏幕的1.0
// = 1.0f;//设置本身透明度
= 0.8f; //设置黑暗度
getWindow().setAttributes(p);//设置生效
initView();
initListener();
}
private void initView() {
tv_submit= (TextView) findViewById(.tv_submit);
}
private void initListener() {
tv_submit.setOnClickListener(this);
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onClick(View v) {
switch (()){
case .tv_submit:
Intent mIntent = new Intent();
("submit","submit");
// 设置结果,并进行传送
setResult(2, mIntent);
finish();
break;
default:
break;
}
}
三、在AndroidManifest里面注册activity
<activity android:name=".DialogActivity"
android:theme="@style/Dialog"/>
四、在activity里面写监听事件
//textview的点击事件
case .tv_three:
Intent intent = new Intent(this, );
startActivityForResult(intent, 2);
break;
//dialog activity的返回的结果处理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == 2) {
if (data != null) {
tv_thethree.setText(("submit"));
} else {
tv_thethree.setText("第三种:Activity Dialog");
}
}
}
下载Demo