1. 概述
在开发过程中,对于一些dialog弹窗的效果,如果简单的、可以直接实现的、不需要太多复杂交互逻辑的,可以直接使用Dialog、PopupWindow、DialogFragment实现,对于一些比较复杂的、需要比较多交互的效果,可以使用Dialog样式Activity来实现与Dialog等一样的效果,比如下边自己项目中的:需要点击对应银行卡后,再次进入时显示选中的银行卡打上对号
图片.png
自己一开始使用DialogFragment做的,但是由于个人水平有限,在处理选中银行卡后再次进入时显示对应银行卡然后打上对号有点问题,然后采用Dialog样式Activity来实现的,具体实现方式如下
2. 代码如下
1>:Dialog样式的Activity如下:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/7/28 11:37
* Version 1.0
* Params:
* Description: Dialog样式的Activity
*/
public class DialogActivity extends Activity{
private List<String> mData = new ArrayList<>();
private ListView mListView;
private MyAdapter mAdapter;
@Override
protected void onResume() {
super.onResume();
String mKey = PrefUtils.getString(DialogActivity.this , "key" , "") ;
String position = PrefUtils.getString(DialogActivity.this , "position" , "") ;
Log.e("TAG" , "mKey: " + mKey + ", position: " + position) ;
if (!TextUtils.isEmpty(mKey) && "Y".equals(mKey)){
if (!TextUtils.isEmpty(position)) {
mAdapter.setTag(2, Integer.parseInt(position)); //给adapter设置绑定 , 表示你点击某个具体的item
mAdapter.notifyDataSetChanged();//刷新数据
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//窗口对齐屏幕宽度
Window win = this.getWindow();
win.getDecorView().setPadding(0, 0, 0, 0);
WindowManager.LayoutParams lp = win.getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
lp.gravity = Gravity.TOP;//设置对话框置顶显示
win.setAttributes(lp);
getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
mListView = (ListView) findViewById(R.id.listView);
//添加数据
for (int i = 0; i < 10; i++) {
mData.add("" + i);
}
//适配MyAdapter数据
mAdapter = new MyAdapter(this, mData);
mListView.setAdapter(mAdapter);
//点击 listview
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
mAdapter.setTag(2, position); //给adapter设置绑定 , 表示你点击某个具体的item
mAdapter.notifyDataSetChanged(); //刷新数据
// lastPostion = position; //将当前位置 置为最后一个位置
finish();
}
});
}
}
2>:MyAdapter代码如下:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/7/28 11:39
* Version 1.0
* Params:
* Description:
*/
public class MyAdapter extends BaseAdapter {
private List<String> mData;
private Context mContext;
private LayoutInflater mInflater;
private int tag;
private int NowDay;
public MyAdapter(Context context, List<String> data) {
this.mContext = context;
this.mData = data;
mInflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public void setTag(int s,int NaDayPostion){
tag=s;
NowDay=NaDayPostion;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.list_item, null);
holder.mImageView = (ImageView) convertView.findViewById(R.id.image);
holder.iv_check = (ImageView) convertView.findViewById(R.id.iv_check);
holder.mTextView = (TextView) convertView.findViewById(R.id.tvContent);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.mTextView.setText("我是:" + mData.get(position));
if(tag==2&&NowDay==position){
holder.iv_check.setVisibility(View.VISIBLE);
holder.iv_check
.setImageResource(R.mipmap.checkedaddress); //选中地址的图片
// holder.mTextView
// .setTextColor(mContext.getResources().getColor(R.color.colorAccent));
PrefUtils.putString(mContext , "key" , "Y");
PrefUtils.putString(mContext , "position" , position+"");
}else{
holder.iv_check.setVisibility(View.GONE);
holder.iv_check
.setImageResource(R.mipmap.nocheckedaddress);//没有选中的图片
}
return convertView;
}
class ViewHolder {
ImageView mImageView , iv_check;
TextView mTextView;
}
}
3. 总结
个人觉得对于Dialog样式的弹窗,如果涉及到的功能、需求、及交互效果比较多的时候,可以使用 Dialog样式的Activity实现即可,Dialog样式Activity写法注意以下几点:
注意:
1>:把布局文件中的根布局background设置为全透明,把要显示数据的布局设置为白色:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00000000"
>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="#ffffff"
android:layout_alignParentBottom="true"
>
</ListView>
</RelativeLayout>
2>:在DialogActivity的onCreate()方法中设置对话框显示的大小和位置:
//窗口对齐屏幕宽度
Window win = this.getWindow();
win.getDecorView().setPadding(0, 0, 0, 0);
WindowManager.LayoutParams lp = win.getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
lp.gravity = Gravity.TOP;//设置对话框置顶显示
win.setAttributes(lp);
getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
4. 记住
如果用dialog能实现,就用dialog实现,如果dialog里边的控件交互比较多,觉得比较用dialog的话比较复杂,直接使用Activity样式的Dialog,这个一定是可以实现所有dialog样式的所有需求的。
5. 需要注意的地方
1>:在MainActivity的onCreate中设置:
//窗口对齐屏幕宽度
Window win = this.getWindow();
win.getDecorView().setPadding(0, 0, 0, 0);
WindowManager.LayoutParams lp = win.getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
lp.gravity = Gravity.TOP;//设置对话框置顶显示
win.setAttributes(lp);
getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
2>:在listview的布局文件中的根布局添加透明属性:
android:background="#00000000"
3>:在所在的Activity的清单文件中配置:
<activity android:name=".activity.classification.CancelDialogActivity"
android:screenOrientation="portrait"
android:theme="@style/dialogstyle"
/>
<style name="dialogstyle">
<!--设置dialog的背景-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--设置Dialog的windowFrame框为无-->
<item name="android:windowFrame">@null</item>
<!--设置无标题-->
<item name="android:windowNoTitle">true</item>
<!--是否浮现在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--是否半透明-->
<item name="android:windowIsTranslucent">true</item>
<!--设置窗口内容不覆盖-->
<item name="android:windowContentOverlay">@null</item>
<!--设置动画,在这里使用让它继承系统的Animation.Dialog-->
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<!--背景是否模糊显示-->
<item name="android:backgroundDimEnabled">true</item>
</style>
4>:MainActivity要么继承Activity,然后给该MainActivity设置这个主题android:theme="@style/dialogstyle",或者让给MainActivity设置下边主题,可以继承其他Activity,比如AppCompatActivity
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
5>:ListView的背景必须是白色,否则运行结果将是透明的!
上边的5个点必须都要写,少一个都会有问题!
代码已上传至github:
https://github.com/shuai999/DialogActivity.git
网友评论