用全屏DialogFragment代替Activity,结合ViewPager展示图片
来源:互联网 发布:上海曼威网络 编辑:程序博客网 时间:2024/05/17 06:56
最近在知乎上看到一篇很不错的分享,关于Fragment的一些用法和开发经验,其中提倡用全屏的DialogFragment代替Activity处理一些特殊的场景,比如用户点击item触发打开一些内容详情页,相册点击小图片时会将图片全屏放大展示…等等的这些场景都可以考虑用全屏的DialogFragment来代替Activity来代替进行视图的展示。
由于具体的代码逻辑非常简单,我就直接上代码了,注释也写得很清楚,你肯定能看懂:
public class FullScreenDlgFragment extends DialogFragment implements View.OnClickListener{ private int mClickItem;//对应显示ViewPager子项的位置 private List<String> mListImgUrls; private ViewPager mViewPager; private Integer[] mImgIds;//本地图片资源ID private Dialog mDialog; public static final String TAG_NAME=AlertDlgFragment.class.getName(); private Context mContext; //即学即用的工厂方法 public static FullScreenDlgFragment newInstance(Context context, Integer[] imgIds, int clickItem) { Bundle args = new Bundle(); FullScreenDlgFragment fragment = new FullScreenDlgFragment(); fragment.setArguments(args); fragment.mContext = context; fragment.mImgIds = imgIds; fragment.mClickItem = clickItem; return fragment; } //由ViewPager来响应点击 @Override public void onClick(View v) { this.dismiss(); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { //设置Dialog样式 setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialog_fill); mDialog=new Dialog(mContext); //去标题栏 mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); initView(); return mDialog; } private void initView() { //将Dialog设置全屏!!! setDlgParams(); mViewPager = new ViewPager(mContext); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mViewPager.setLayoutParams(params); mViewPager.setBackgroundColor(0xFF000000); initViewPager(); mDialog.setContentView(mViewPager); } private void setDlgParams() { ViewGroup.LayoutParams lay = mDialog.getWindow().getAttributes(); DisplayMetrics dm = new DisplayMetrics(); mDialog.getWindow().getWindowManager().getDefaultDisplay().getMetrics(dm); Rect rect = new Rect(); View view = mDialog.getWindow().getDecorView(); view.getWindowVisibleDisplayFrame(rect); lay.height = dm.heightPixels - rect.top; lay.width = dm.widthPixels; } private void initViewPager() { if (mImgIds != null && mImgIds.length > 0) { List<View> listImgs = new ArrayList<>(); for (int i = 0; i < mImgIds.length; i++) { ImageView iv = new ImageView(mContext); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); iv.setLayoutParams(params); listImgs.add(iv); iv.setOnClickListener(this); iv.setImageResource(mImgIds[i]); // 加载网络图片 // BitmapHelper.getInstance(mContext).display(iv, // mListImgUrls.get(i)); } if (listImgs.size() > 0) { MyPagerAdapter pageAdapter = new MyPagerAdapter(listImgs); mViewPager.setAdapter(pageAdapter); mViewPager.setCurrentItem(mClickItem); } } }}
styles.xml
<style name="CustomDialog_fill" parent="Theme.AppCompat.Dialog"> <item name="android:windowNoTitle">true</item> <item name="android:windowFrame">@null</item> <item name="android:windowIsFloating">true</item> <item name="android:windowIsTranslucent">true</item> <item name="android:backgroundDimEnabled">false</item> <item name="android:windowBackground">@android:color/white</item></style>
具体使用只需:
FullScreenDlgFragment.newInstance(this,new Integer[]{R.mipmap.p1,R.mipmap.p2,R.mipmap.p3,R.mipmap.p4},2).show(getFragmentManager(),AlertDlgFragment.TAG_NAME);
特别鸣谢,以下两篇文章:
【干货】Dialog的高冷用法
面条在知乎上“关于 Android,用多个 activity,还是单 activity 配合 fragment?”的回答
2 0
- 用全屏DialogFragment代替Activity,结合ViewPager展示图片
- 【Android】Activity全屏展示
- Viewpager展示图片
- 用DirectionalViewPager代替ViewPager
- 使用DialogFragment 代替 Dialog
- jquery全屏图片幻灯片展示特效
- 自定义dialogfragment全屏
- DialogFragment 设置全屏方法
- Android DialogFragment全屏
- DialogFragment设置全屏方法
- Activity和ViewPager的结合使用
- 使用ViewPager实现图片滑动展示
- android实现ViewPager,打开app展示图片
- 使用ViewPager实现图片滑动展示
- ViewPager无限轮播+GridView图片展示
- Dialogfragment嵌套Viewpager
- 【选择图片Jar】全屏DialogFragment实现图片详情预览(十)
- 使用字体库和TextView代替ImageView展示图片
- struts2中的动态方法调用DMI
- 可视化PK纯代码
- 【设计模式】—-(2)工厂方法模式(创建型)
- [LeetCode] 105 & 106
- 多线程
- 用全屏DialogFragment代替Activity,结合ViewPager展示图片
- CentOs 5.11 命令
- Struts2 ActionWildcard(通配符配置)约定优于配置
- wpf 如何让当前窗口隐藏
- 【杭电oj】3038 - How Many Answers Are Wrong(带权并查集,好题)
- 如何安装linux-header
- struts2的result结果类型
- STM32F10X CAN+TJA1050发送程序例程,已测试
- Linux网卡配置