用全屏DialogFragment代替Activity,結合ViewPager展示圖片

cteq2260 8年前發布 | 41K 次閱讀 Android開發 移動開發

來自: 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);

特別鳴謝,以下兩篇文章:
【干貨】Dialog的高冷用法
面條在知乎上“關于 Android,用多個 activity,還是單 activity 配合 fragment?”的回答

</div>

 本文由用戶 cteq2260 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!