用全屏DialogFragment代替Activity,結合ViewPager展示圖片
來自: http://blog.csdn.net/tellh/article/details/50590520
最近在知乎上看到一篇很不錯的分享,關于Fragment的一些用法和開發經驗,其中提倡用全屏的DialogFragment代替Activity處理一些特殊的場景,比如用戶點擊item觸發打開一些內容詳情頁,相冊點擊小圖片時會將圖片全屏放大展示…等等的這些場景都可以考慮用全屏的DialogFragment來代替Activity來代替進行視圖的展示。
</blockquote>
由于具體的代碼邏輯非常簡單,我就直接上代碼了,注釋也寫得很清楚,你肯定能看懂:
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); } } }
}</pre>
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);
特別鳴謝,以下兩篇文章:
</div>
【干貨】Dialog的高冷用法
面條在知乎上“關于 Android,用多個 activity,還是單 activity 配合 fragment?”的回答
本文由用戶 cteq2260 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!