關于Android一個畫了6個小時的Dialog

前言

這是設計稿

OK,拿到設計稿的時候。我是輕蔑一笑的,這算什么難度....分分鐘就可以搞掂了,不就是一個dialog,里面我放上一個viewpager,viewpager里面我再放上一個RecyclerView,頂了天我需要寫2個適配器,半小時就可以搞掂??!

OK,開擼,Dialog自定義出來,放ViewPager,寫FragmentPagerAdapter適配器,丟進去RecyclerView,再寫一個RecyclerView適配器。

OK, 跑項目...焦急的等待以及電腦風扇的瘋狂躁動中...跑起來了,點擊一看!納尼,我的RecyclerView呢???跑哪里了????。。?!

地獄

第一次跑完失敗...代碼有問題!再修改?。。?/p>

下面是讓我一直很苦惱的一個bug:

適配器布局文件
適配器加載文件

然而報的錯誤---->

報錯

看到這里我是懵逼的! 我在Dialog的layout文件里面找控件,然而你給你索引到了子Fragment里面去找!為啥?。??

劃重點 : 要使用getchildfragmentmanager()而不是getsupportfragmentmanager()

ok,改完后不報錯了...
然而沒卵用...我的viewpager徹底跟我分手了,我可以改viewpager的顏色,可以改viewpager的LayoutParams,但是我就是找不到里面的子Fragment....徹徹底底,跟我分手了。

方法(失敗的)

ok,dialog我們用不了的,AlertDialog我們也是沒辦法使用的...那我們用什么,是不是有人說用popwindow,呵呵...用那個更麻煩。我們用FragmentDialog,這個東西其實我沒有用過。

介紹!

該方法需要我們實現(xiàn)一個默認的構造函數(shù),把我們的dailog從本質(zhì)上變成了Fragment。


/**
 * Created by Ly on 2017/4/21.
 * 送禮的dialog
 */

public class GiftDialog extends DialogFragment implements PagingScrollHelper.onPageChangeListener {
    public GiftDialog() {
    }

    public static GiftDialog newInstance() {
        Bundle args = new Bundle();
        GiftDialog fragment = new GiftDialog();
        fragment.setArguments(args);
        return fragment;
    }

    /**
     * 禮物列表
     */
    private RecyclerView recyclerViewText;
    /**
     * viewpager的指示器
     */
    private LinearLayout llGiftIndicator;
    /**
     * 賬戶余額
     */
    private TextView tvGiftBalance;
    /**
     * 發(fā)送
     */
    private CardView cvGiftSend;

    protected Dialog dialog;
    /**
     * 加載的適配器
     */
    private GiftListAdapter giftListAdapter;

    /**
     * 滑動監(jiān)聽控制器
     */
    PagingScrollHelper scrollHelper = new PagingScrollHelper();
    /**
     * 配置常量  使用2行4列的方式進行布局
     */
    private static final int ROWS = 2, COLUMNS = 4;
    /**
     * 就是一個標志位,我想寫“The most handsome LingYu”
     * 但是想想還是不要那么騷包好了
     */
    private static final String TAG = "BottomDialogFragment";

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return LayoutInflater.from(getActivity()).inflate(R.layout.bottom_anim_dialog_layout, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }


    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.dialog);
        View view = View.inflate(getActivity(), R.layout.bottom_anim_dialog_layout, null);
        builder.setView(view);
        dialog = builder.create();
        dialog.setCanceledOnTouchOutside(true);
        // 設置寬度為屏寬、靠近屏幕底部。
        Window window = dialog.getWindow();
        window.getDecorView().setPadding(0, 0, 0, 0);
        WindowManager.LayoutParams wlp = window.getAttributes();
        wlp.gravity = Gravity.BOTTOM;
        //設置沒有效果
        wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
        window.setAttributes(wlp);
        initView(view);
        return dialog;
    }

    private void initView(View view) {
        recyclerViewText = (RecyclerView) view.findViewById(R.id.rlv_gift_list);
        llGiftIndicator = (LinearLayout) view.findViewById(R.id.ll_gift_indicator);
        recyclerViewText.setLayoutManager(new HorizontalPageLayoutManager(ROWS, COLUMNS));
        giftListAdapter = new GiftListAdapter(getActivity());
        recyclerViewText.setAdapter(giftListAdapter);
        giftListAdapter.setRecItemClick(new RecyclerItemCallback<String, GiftListAdapter.GiftListViewHolder>() {
            @Override
            public void onItemClick(int position, String model, int tag, GiftListAdapter.GiftListViewHolder holder) {
                super.onItemClick(position, model, tag, holder);
                Toast.makeText(getActivity(), position + "", Toast.LENGTH_SHORT).show();
            }
        });
        scrollHelper.setUpRecycleView(recyclerViewText);
        scrollHelper.setOnPageChangeListener(this);
        for (int i = 0; i < 2; i++) {
            ImageView imageView = new ImageView(getActivity());
            LinearLayout.LayoutParams layoutParams =
                    new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            layoutParams.setMargins(DeviceUtils.px2dip(getActivity(), 12),
                    DeviceUtils.px2dip(getActivity(), 2),
                    DeviceUtils.px2dip(getActivity(), 12),
                    DeviceUtils.px2dip(getActivity(), 2));
            imageView.setLayoutParams(layoutParams);
            if (i == 0) {
                imageView.setImageResource(R.mipmap.live_gift_in_red);
            } else {
                imageView.setImageResource(live_gift_noin_gray);
            }
            llGiftIndicator.addView(imageView);
        }
    }

    /**
     * 更新狀態(tài)
     *
     * @param position
     */
    private void updateIndicator(int position) {
        if (position < 0 || position > llGiftIndicator.getChildCount()) {
            return;
        } else {
            for (int i = 0; i < llGiftIndicator.getChildCount(); i++) {
                ((ImageView) llGiftIndicator.getChildAt(i)).setImageResource(R.mipmap.live_gift_noin_gray);
            }
            ((ImageView) llGiftIndicator.getChildAt(position)).setImageResource(R.mipmap.live_gift_in_red);
        }
    }

    //防止重復彈出
    public static GiftDialog showDialog(AppCompatActivity appCompatActivity) {
        FragmentManager fragmentManager = appCompatActivity.getSupportFragmentManager();
        GiftDialog bottomDialogFragment =
                (GiftDialog) fragmentManager.findFragmentByTag(TAG);
        if (null == bottomDialogFragment) {
            bottomDialogFragment = newInstance();
        }

        if (!appCompatActivity.isFinishing()
                && null != bottomDialogFragment
                && !bottomDialogFragment.isAdded()) {
            fragmentManager.beginTransaction()
                    .add(bottomDialogFragment, TAG)
                    .commitAllowingStateLoss();
        }
        return bottomDialogFragment;
    }

    @Override
    public void onPageChange(int index) {
        updateIndicator(index);
    }
}



如果是按照我一開始的思路來實現(xiàn)的話,是無法實現(xiàn)的,依然會出現(xiàn)ViewPager無法顯示子內(nèi)容的bug。好吧,索性心一橫,我們把ViewPager,砍掉!?。?!直接使用RecyclerView。
由此布局文件變成了:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white_font_color"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rlv_gift_list"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:scrollbars="none" />

    <LinearLayout
        android:id="@+id/ll_gift_indicator"
        android:layout_width="match_parent"
        android:layout_height="25dp"
        android:gravity="center"
        android:orientation="horizontal">

    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/title_bar">

        <TextView
            android:id="@+id/tv_gift_balance"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="@dimen/margin_16dp"
            android:drawableLeft="@mipmap/live_gift_dodo"
            android:drawablePadding="@dimen/padding_10dp"
            android:drawableRight="@mipmap/live_gift_next"
            android:gravity="center"
            android:text="15"
            android:textColor="@color/orange_font_color"
            android:textSize="@dimen/text_size_14sp" />

        <android.support.v7.widget.CardView
            android:id="@+id/cv_gift_send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="@dimen/margin_26dp"
            app:cardCornerRadius="10px"
            app:cardElevation="5dp">

            <TextView
                android:layout_width="75dp"
                android:layout_height="30dp"
                android:background="@drawable/fillet_red_bg"
                android:gravity="center"
                android:text="@string/text_gift"
                android:textColor="@color/white_font_color"
                android:textSize="@dimen/text_size_14sp" />
        </android.support.v7.widget.CardView>
    </RelativeLayout>
</LinearLayout>

那有人問了,RecyclerView如何做為ViewPager,答案是,我們可以自定義LayoutManager,如下:


/**
 * Created by Ly on 2017/4/22.
 */

public class HorizontalPageLayoutManager extends RecyclerView.LayoutManager implements PageDecorationLastJudge {
    @Override
    public RecyclerView.LayoutParams generateDefaultLayoutParams() {
        return null;
    }

    int totalHeight = 0;
    int totalWidth = 0;
    int offsetY = 0;
    int offsetX = 0;

    public HorizontalPageLayoutManager(int rows, int columns) {
        this.rows = rows;
        this.columns = columns;
        this.onePageSize = rows * columns;
    }

    @Override
    public boolean canScrollHorizontally() {
        return true;
    }




    @Override
    public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
        detachAndScrapAttachedViews(recycler);
        int newX = offsetX + dx;
        int result = dx;
        if (newX > totalWidth) {
            result = totalWidth - offsetX;
        } else if (newX < 0) {
            result = 0 - offsetX;
        }
        offsetX += result;
        offsetChildrenHorizontal(-result);
        recycleAndFillItems(recycler, state);
        return result;
    }

    private SparseArray<Rect> allItemFrames = new SparseArray<>();

    private int getUsableWidth() {
        return getWidth() - getPaddingLeft() - getPaddingRight();
    }

    private int getUsableHeight() {
        return getHeight() - getPaddingTop() - getPaddingBottom();
    }

    int rows = 0;
    int columns = 0;
    int pageSize = 0;
    int itemWidth = 0;
    int itemHeight = 0;
    int onePageSize = 0;
    int itemWidthUsed;
    int itemHeightUsed;


    @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {

        if (getItemCount() == 0) {
            removeAndRecycleAllViews(recycler);
            return;
        }
        if (state.isPreLayout()) {
            return;
        }
        //獲取每個Item的平均寬高
        itemWidth = getUsableWidth() / columns;
        itemHeight = getUsableHeight() / rows;

        //計算寬高已經(jīng)使用的量,主要用于后期測量
        itemWidthUsed = (columns - 1) * itemWidth;
        itemHeightUsed = (rows - 1) * itemHeight;

        //計算總的頁數(shù)
        pageSize = getItemCount() / onePageSize + (getItemCount() % onePageSize == 0 ? 0 : 1);

        //計算可以橫向滾動的最大值
        totalWidth = (pageSize - 1) * getWidth();

        //分離view
        detachAndScrapAttachedViews(recycler);

        int count = getItemCount();
        for (int p = 0; p < pageSize; p++) {
            for (int r = 0; r < rows; r++) {
                for (int c = 0; c < columns; c++) {
                    int index = p * onePageSize + r * columns + c;
                    if (index == count) {
                        //跳出多重循環(huán)
                        c = columns;
                        r = rows;
                        p = pageSize;
                        break;
                    }

                    View view = recycler.getViewForPosition(index);
                    addView(view);
                    //測量item
                    measureChildWithMargins(view, itemWidthUsed, itemHeightUsed);

                    int width = getDecoratedMeasuredWidth(view);
                    int height = getDecoratedMeasuredHeight(view);
                    //記錄顯示范圍
                    Rect rect = allItemFrames.get(index);
                    if (rect == null) {
                        rect = new Rect();
                    }
                    int x = p * getUsableWidth() + c * itemWidth;
                    int y = r * itemHeight;
                    rect.set(x, y, width + x, height + y);
                    allItemFrames.put(index, rect);


                }
            }
            //每一頁循環(huán)以后就回收一頁的View用于下一頁的使用
            removeAndRecycleAllViews(recycler);
        }

        recycleAndFillItems(recycler, state);
    }

    @Override
    public void onDetachedFromWindow(RecyclerView view, RecyclerView.Recycler recycler) {
        super.onDetachedFromWindow(view, recycler);
        offsetX = 0;
        offsetY = 0;
    }

    private void recycleAndFillItems(RecyclerView.Recycler recycler, RecyclerView.State state) {
        if (state.isPreLayout()) {
            return;
        }

        Rect displayRect = new Rect(getPaddingLeft() + offsetX, getPaddingTop(), getWidth() - getPaddingLeft() - getPaddingRight() + offsetX, getHeight() - getPaddingTop() - getPaddingBottom());
        Rect childRect = new Rect();
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            childRect.left = getDecoratedLeft(child);
            childRect.top = getDecoratedTop(child);
            childRect.right = getDecoratedRight(child);
            childRect.bottom = getDecoratedBottom(child);
            if (!Rect.intersects(displayRect, childRect)) {
                removeAndRecycleView(child, recycler);
            }
        }

        for (int i = 0; i < getItemCount(); i++) {
            if (Rect.intersects(displayRect, allItemFrames.get(i))) {
                View view = recycler.getViewForPosition(i);
                addView(view);
                measureChildWithMargins(view, itemWidthUsed, itemHeightUsed);
                Rect rect = allItemFrames.get(i);
                layoutDecorated(view, rect.left - offsetX, rect.top, rect.right - offsetX, rect.bottom);
            }
        }

    }


    @Override
    public boolean isLastRow(int index) {
        if (index >= 0 && index < getItemCount()) {
            int indexOfPage = index % onePageSize;
            indexOfPage++;
            if (indexOfPage > (rows - 1) * columns && indexOfPage <= onePageSize) {
                return true;
            }
        }

        return false;
    }

    @Override
    public boolean isLastColumn(int position) {
        if (position >= 0 && position < getItemCount()) {
            position++;
            if (position % columns == 0) {
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean isPageLast(int position) {
        position++;
        return position % onePageSize == 0;
    }
}

那又有人問了,我們?nèi)绾伪O(jiān)聽頁面滑動,進而更新指示器?

**
 * 實現(xiàn)RecycleView分頁滾動的工具類
 * Created by Ly on 2017/4/22.
 */

public class PagingScrollHelper {

    RecyclerView mRecyclerView = null;

    private MyOnScrollListener mOnScrollListener = new MyOnScrollListener();

    private MyOnFlingListener mOnFlingListener = new MyOnFlingListener();
    private int offsetY = 0;
    private int offsetX = 0;

    int startY = 0;
    int startX = 0;


    enum ORIENTATION {
        HORIZONTAL, VERTICAL, NULL
    }

    ORIENTATION mOrientation = ORIENTATION.HORIZONTAL;

    public void setUpRecycleView(RecyclerView recycleView) {
        if (recycleView == null) {
            throw new IllegalArgumentException("recycleView must be not null");
        }
        mRecyclerView = recycleView;
        //處理滑動
        recycleView.setOnFlingListener(mOnFlingListener);
        //設置滾動監(jiān)聽,記錄滾動的狀態(tài),和總的偏移量
        recycleView.setOnScrollListener(mOnScrollListener);
        //記錄滾動開始的位置
        recycleView.setOnTouchListener(mOnTouchListener);
        //獲取滾動的方向
        updateLayoutManger();
    }

    public void updateLayoutManger() {
        RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
        if (layoutManager != null) {
            if (layoutManager.canScrollVertically()) {
                mOrientation = ORIENTATION.VERTICAL;
            } else if (layoutManager.canScrollHorizontally()) {
                mOrientation = ORIENTATION.HORIZONTAL;
            } else {
                mOrientation = ORIENTATION.NULL;
            }
            if (mAnimator != null) {
                mAnimator.cancel();
            }
            startX = 0;
            startY = 0;
            offsetX = 0;
            offsetY = 0;

        }

    }

    ValueAnimator mAnimator = null;

    public class MyOnFlingListener extends RecyclerView.OnFlingListener {

        @Override
        public boolean onFling(int velocityX, int velocityY) {
            if (mOrientation == ORIENTATION.NULL) {
                return false;
            }
            //獲取開始滾動時所在頁面的index
            int p = getStartPageIndex();

            //記錄滾動開始和結束的位置
            int endPoint = 0;
            int startPoint = 0;

            //如果是垂直方向
            if (mOrientation == ORIENTATION.VERTICAL) {
                startPoint = offsetY;

                if (velocityY < 0) {
                    p--;
                } else if (velocityY > 0) {
                    p++;
                }
                //更具不同的速度判斷需要滾動的方向
                //注意,此處有一個技巧,就是當速度為0的時候就滾動會開始的頁面,即實現(xiàn)頁面復位
                endPoint = p * mRecyclerView.getHeight();

            } else {
                startPoint = offsetX;
                if (velocityX < 0) {
                    p--;
                } else if (velocityX > 0) {
                    p++;
                }
                endPoint = p * mRecyclerView.getWidth();

            }
            if (endPoint < 0) {
                endPoint = 0;
            }

            //使用動畫處理滾動
            if (mAnimator == null) {
                mAnimator = new ValueAnimator().ofInt(startPoint, endPoint);

                mAnimator.setDuration(300);
                mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        int nowPoint = (int) animation.getAnimatedValue();

                        if (mOrientation == ORIENTATION.VERTICAL) {
                            int dy = nowPoint - offsetY;
                            //這里通過RecyclerView的scrollBy方法實現(xiàn)滾動。
                            mRecyclerView.scrollBy(0, dy);
                        } else {
                            int dx = nowPoint - offsetX;
                            mRecyclerView.scrollBy(dx, 0);
                        }
                    }
                });
                mAnimator.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        //回調(diào)監(jiān)聽
                        if (null != mOnPageChangeListener) {
                            mOnPageChangeListener.onPageChange(getPageIndex());
                        }
                    }
                });
            } else {
                mAnimator.cancel();
                mAnimator.setIntValues(startPoint, endPoint);
            }

            mAnimator.start();

            return true;
        }
    }

    public class MyOnScrollListener extends RecyclerView.OnScrollListener {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            //newState==0表示滾動停止,此時需要處理回滾
            if (newState == 0 && mOrientation != ORIENTATION.NULL) {
                boolean move;
                int vX = 0, vY = 0;
                if (mOrientation == ORIENTATION.VERTICAL) {
                    int absY = Math.abs(offsetY - startY);
                    //如果滑動的距離超過屏幕的一半表示需要滑動到下一頁
                    move = absY > recyclerView.getHeight() / 2;
                    vY = 0;

                    if (move) {
                        vY = offsetY - startY < 0 ? -1000 : 1000;
                    }

                } else {
                    int absX = Math.abs(offsetX - startX);
                    move = absX > recyclerView.getWidth() / 2;
                    if (move) {
                        vX = offsetX - startX < 0 ? -1000 : 1000;
                    }

                }

                mOnFlingListener.onFling(vX, vY);

            }

        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            //滾動結束記錄滾動的偏移量
            offsetY += dy;
            offsetX += dx;
        }
    }

    private MyOnTouchListener mOnTouchListener = new MyOnTouchListener();


    public class MyOnTouchListener implements View.OnTouchListener {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            //手指按下的時候記錄開始滾動的坐標
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                startY = offsetY;
                startX = offsetX;
            }
            return false;
        }

    }

    private int getPageIndex() {
        int p = 0;
        if (mOrientation == ORIENTATION.VERTICAL) {
            p = offsetY / mRecyclerView.getHeight();
        } else {
            p = offsetX / mRecyclerView.getWidth();
        }
        return p;
    }

    private int getStartPageIndex() {
        int p = 0;
        if (mOrientation == ORIENTATION.VERTICAL) {
            p = startY / mRecyclerView.getHeight();
        } else {
            p = startX / mRecyclerView.getWidth();
        }
        return p;
    }

    onPageChangeListener mOnPageChangeListener;

    public void setOnPageChangeListener(onPageChangeListener listener) {
        mOnPageChangeListener = listener;
    }

    public interface onPageChangeListener {
        void onPageChange(int index);
    }

}


一個小問題折騰了我快半天!媽的到了快4點還沒得睡?。。∮纱丝梢娀A是多么重要?。。?!媽的,惡補回來了必須。

貼上github地址:https://github.com/LinHuanTanLy/FullDialogMaster

//********分割線,現(xiàn)在時間是2017年11月29日17:58:23***************************************************************************

啊哈哈哈哈哈,差點沒被人打死,朋友跟我說沒做點擊監(jiān)聽...我一看,還真的是吖。趕緊補回來,不然要被人打死了。

錯誤的做法

這個是用得比較多的辦法,沒辦法嘛,誰叫安卓是回調(diào)地獄呢,那必須是Callback?。?/p>

 public interface OnItemClickListener {
        /**
         * 點擊菜單項的回調(diào)事件
         *
         * @param shareMenuBean
         */
        void onMenuClickListener(ShareMenuBean shareMenuBean);
    }

在dialog類里聲明callback實例:

 /**
     * 分享的菜單點擊回調(diào)
     */
    private static OnItemClickListener mOnItemClickListener;

在dialog的shou方法里進行賦值:

  /**
     * 防止重復彈出 顯示此dialog的唯一方法
     *
     * @param appCompatActivity
     * @return
     */
    public static ShareDialog showDialog(FragmentActivity appCompatActivity, OnItemClickListener itemClickListener) {
        mOnItemClickListener = itemClickListener;
        FragmentManager fragmentManager = appCompatActivity.getSupportFragmentManager();
        ShareDialog shareDialog =
                (ShareDialog) fragmentManager.findFragmentByTag(TAG);
        if (null == shareDialog) {
            shareDialog = newInstance();
        }
        if (!appCompatActivity.isFinishing()
                && null != shareDialog
                && !shareDialog.isAdded()) {
            fragmentManager.beginTransaction()
                    .add(shareDialog, TAG)
                    .commitAllowingStateLoss();
        }
        return shareDialog;
    }

在View的點擊事件里面進行回調(diào):

  mShareMenuAdapter.setRecItemClick(new RecyclerItemCallback<ShareMenuBean, ShareMenuAdapter.ShareMenuHolder>() {
            @Override
            public void onItemClick(int position, ShareMenuBean model, int tag, ShareMenuAdapter.ShareMenuHolder holder) {
                super.onItemClick(position, model, tag, holder);
                mOnItemClickListener.onMenuClickListener(model);
                if (dialog != null) {
                    dialog.dismiss();
                }
            }
        });
        mTvShareCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (dialog != null) {
                    dialog.dismiss();
                }
            }
        });

以上,就可以了。在下面附上UI圖以及dialog代碼:
分享的底部dialog

shareDialog的代碼:

package com.catplay.platform.ui.dialog;

import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

import com.catplay.platform.R;
import com.catplay.platform.model.impl.ShareMenuBean;
import com.catplay.platform.ui.adapter.ShareMenuAdapter;

import java.util.ArrayList;
import java.util.List;

import cn.droidlover.xrecyclerview.RecyclerItemCallback;

/**
 * @author Ly
 * @date 2017/10/14
 * 分享的彈窗
 */

public class ShareDialog extends DialogFragment {

    /**
     * dialog
     */
    protected Dialog dialog;
    /**
     * 就是一個標志位
     */
    private static final String TAG = ShareDialog.class.getName();
    /**
     * 分享的標題
     */
    private TextView mTvShareTitle;
    /**
     * 分享的菜單
     */
    private RecyclerView mRlvShareMenu;
    /**
     * 分享取消按鈕
     */
    private TextView mTvShareCancel;
    /**
     * 分享的菜單的適配器
     */
    private ShareMenuAdapter mShareMenuAdapter;
    /**
     * 分享的菜單的數(shù)據(jù)源
     */
    private List<ShareMenuBean> mShareMenus = new ArrayList<>();
    /**
     * 分享的菜單點擊回調(diào)
     */
    private static OnItemClickListener mOnItemClickListener;

    public ShareDialog() {

    }

    public static ShareDialog newInstance() {
        Bundle args = new Bundle();
        ShareDialog fragment = new ShareDialog();
        fragment.setArguments(args);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return LayoutInflater.from(getActivity()).inflate(R.layout.diaog_share_layout, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }


    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.dialog);
        View view = View.inflate(getActivity(), R.layout.diaog_share_layout, null);
        builder.setView(view);
        dialog = builder.create();
        dialog.setCanceledOnTouchOutside(true);
        // 設置寬度為屏寬、靠近屏幕底部。
        Window window = dialog.getWindow();
        if (window != null && window.getDecorView() != null) {
            window.getDecorView().setPadding(0, 0, 0, 0);
            WindowManager.LayoutParams wlp = window.getAttributes();
            wlp.gravity = Gravity.BOTTOM;
            //設置沒有效果
            wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
            window.setAttributes(wlp);
        } else {
            Log.e(TAG, "window是空的或者是window.getDecorView()是空的");
        }
        initView(view);
        return dialog;
    }

    /**
     * 初始化視圖
     *
     * @param view
     */
    private void initView(View view) {
        mShareMenus.add(new ShareMenuBean(R.drawable.umeng_socialize_sina, getActivity().getString(R.string.text_sina)));
        mShareMenus.add(new ShareMenuBean(R.drawable.umeng_socialize_qzone, getActivity().getString(R.string.text_qzone)));
        mShareMenus.add(new ShareMenuBean(R.drawable.umeng_socialize_qq, getActivity().getString(R.string.text_qq)));
        mShareMenus.add(new ShareMenuBean(R.drawable.umeng_socialize_wechat, getActivity().getString(R.string.text_wechat)));
        mShareMenus.add(new ShareMenuBean(R.drawable.umeng_socialize_wxcircle, getActivity().getString(R.string.text_wx_circle)));
        mShareMenus.add(new ShareMenuBean(R.drawable.umeng_socialize_copyurl, getActivity().getString(R.string.text_copy)));
        mTvShareTitle = (TextView) view.findViewById(R.id.tv_share_title);
        mRlvShareMenu = (RecyclerView) view.findViewById(R.id.rlv_share_menu);
        mTvShareCancel = (TextView) view.findViewById(R.id.tv_share_cancel);
        mShareMenuAdapter = new ShareMenuAdapter(getActivity());
        mRlvShareMenu.setLayoutManager(new GridLayoutManager(getActivity(), 3));
        mRlvShareMenu.setAdapter(mShareMenuAdapter);
        mShareMenuAdapter.addData(mShareMenus);
        mShareMenuAdapter.setRecItemClick(new RecyclerItemCallback<ShareMenuBean, ShareMenuAdapter.ShareMenuHolder>() {
            @Override
            public void onItemClick(int position, ShareMenuBean model, int tag, ShareMenuAdapter.ShareMenuHolder holder) {
                super.onItemClick(position, model, tag, holder);
                mOnItemClickListener.onMenuClickListener(model);
                if (dialog != null) {
                    dialog.dismiss();
                }
            }
        });
        mTvShareCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (dialog != null) {
                    dialog.dismiss();
                }
            }
        });
    }


    /**
     * 防止重復彈出 顯示此dialog的唯一方法
     *
     * @param appCompatActivity
     * @return
     */
    public static ShareDialog showDialog(FragmentActivity appCompatActivity, OnItemClickListener itemClickListener) {
        mOnItemClickListener = itemClickListener;
        FragmentManager fragmentManager = appCompatActivity.getSupportFragmentManager();
        ShareDialog shareDialog =
                (ShareDialog) fragmentManager.findFragmentByTag(TAG);
        if (null == shareDialog) {
            shareDialog = newInstance();
        }
        if (!appCompatActivity.isFinishing()
                && null != shareDialog
                && !shareDialog.isAdded()) {
            fragmentManager.beginTransaction()
                    .add(shareDialog, TAG)
                    .commitAllowingStateLoss();
        }
        return shareDialog;
    }

    public interface OnItemClickListener {
        /**
         * 點擊菜單項的回調(diào)事件
         *
         * @param shareMenuBean
         */
        void onMenuClickListener(ShareMenuBean shareMenuBean);
    }


//    eg:
// ShareDialog.showDialog(getActivity(), new ShareDialog.onItemClickListener() {
//        @Override
//        public void onMenuClickListener(ShareMenuBean shareMenuBean) {
//            showTsShort(shareMenuBean.toString());
//        }
//    });
}

使用的方法為:

 ShareDialog.showDialog(getActivity(), new ShareDialog.onItemClickListener() {
        @Override
        public void onMenuClickListener(ShareMenuBean shareMenuBean) {
            showTsShort(shareMenuBean.toString());
        }
    });

是不是寫完覺得好簡單啊...沒意思啊...不好玩啊...之類的...然后好玩的就來了?。?!

內(nèi)存泄露

這特么就很尷尬了...所以這個辦法其實是很不好的,拋棄之,我們找別的方案!

比較好的方案

因為上述我們的interface是static的,所以有可能會引發(fā)內(nèi)存問題!而我們的dialog實質(zhì)上是fragment!理論上fragment如何和dialog交互,那么我們的dialog也是可以這么做的。

  1. 宿主Activity實現(xiàn)dialog的interface
  2. dialog通過getActivity()并強轉獲取interface實例,進行事件分發(fā)。

代碼如下:
獲取interface實例

  final OnItemClickListener onItemClickListener= (OnItemClickListener) getActivity();

需要使用該dialog的宿主Activity需要實現(xiàn)對應的dialog的interface,


image.png

通過該方法,我們已經(jīng)可以實現(xiàn)dialogFragment與Activity的無痛交流了。
代碼很簡單就不放了,反正重頭戲也不是這個,
所以問題又有了!
如果我的dialog是在fragment里面彈出來的呢,getActivity()獲取的是宿主fragment的宿主Activitty...總不能我點擊個dialog,要跑到MainActivity里面去拿數(shù)據(jù)處理數(shù)據(jù)吧。

在fragment里面,除了getActivity()方法,還可以發(fā)現(xiàn)有其他2個,
image.png

可以拿到fragment!那是不是可以拿到宿主activity呢?

點擊進入Fragment的源碼,我們不難發(fā)現(xiàn)這個方法:

    /**
     * Return the target fragment set by {@link #setTargetFragment}.
     */
    final public Fragment getTargetFragment() {
        return mTarget;
    }

發(fā)現(xiàn)了mTarget,還有一個get()方法,那說明肯定還有一個set()方法,查找下我們可以找到:

 /**
     * Optional target for this fragment.  This may be used, for example,
     * if this fragment is being started by another, and when done wants to
     * give a result back to the first.  The target set here is retained
     * across instances via {@link FragmentManager#putFragment
     * FragmentManager.putFragment()}.
     *
     * @param fragment The fragment that is the target of this one.
     * @param requestCode Optional request code, for convenience if you
     * are going to call back with {@link #onActivityResult(int, int, Intent)}.
     */
    public void setTargetFragment(Fragment fragment, int requestCode) {
        mTarget = fragment;
        mTargetRequestCode = requestCode;
    }

既然mTarget是我們傳進去的,那就好辦了!開擼:

  /**
     * 防止重復彈出 顯示此dialog的唯一方法
     *
     * @param appCompatActivity
     * @return
     */
    public RechargeDialog showDialog(Fragment tarFragment, RechargeConfBean.DataBean.PayBean payBean,
                                     ArrayList<WithDrawOptionsBean> withDrawOptionsBeanList) {
        FragmentManager fragmentManager = tarFragment.getActivity().getSupportFragmentManager();
        RechargeDialog rechargeDialog =
                (RechargeDialog) fragmentManager.findFragmentByTag(TAG);
        if (null == rechargeDialog) {
            rechargeDialog = newInstance(withDrawOptionsBeanList, payBean);
        }
        rechargeDialog.setTargetFragment(tarFragment, 1);
        if (!tarFragment.getActivity().isFinishing()
                && null != rechargeDialog
                && !rechargeDialog.isAdded()) {
            fragmentManager.beginTransaction()
                    .add(rechargeDialog, TAG)
                    .commitAllowingStateLoss();
        }
        return rechargeDialog;
    }

其中我們把CenterFragment傳進去了

 rechargeDialog.setTargetFragment(tarFragment, 1);

那講道理getTargetFragment()的時候獲取到的必然是CenterFragment了吧,讓它實現(xiàn)intefrace,看是否可以進行交互!


結果顯示

結果

結果

這里已經(jīng)實現(xiàn)了交互的邏輯了。這里貼下dialog的類代碼:

/**
 * @author Ly
 * @date 2017/10/14
 * 充值的dialog
 */

public class RechargeDialog extends DialogFragment {

    /**
     * dialog
     */
    protected Dialog dialog;
    /**
     * 就是一個標志位
     */
    private static final String TAG = RechargeDialog.class.getName();


    private RadioGroup mRgRechargeType;
    private RadioButton mRbRechargeAli, mRbRechargeWechat, mRbRechargeCard;
    private RecyclerView mRlvRechargeOptions;
    private TextView mTvRechargeSubmit;


    private WithdrawOptionsAdapter mWithdrawOptionsAdapter;

    /**
     * 默認選中的金額
     */
    private String moneySelected;

    public RechargeDialog() {

    }


    public static RechargeDialog newInstance(ArrayList<WithDrawOptionsBean> withDrawOptionsBeanList,
                                             RechargeConfBean.DataBean.PayBean payBean) {
        Bundle args = new Bundle();
        args.putParcelableArrayList("extra", withDrawOptionsBeanList);
        args.putSerializable("payConf", payBean);
        RechargeDialog fragment = new RechargeDialog();
        fragment.setArguments(args);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final Window window = getDialog().getWindow();
        window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//注意此處
        window.setLayout(-1, -2);//這2行,和上面的一樣,注意順序就行;
        return LayoutInflater.from(getActivity()).inflate(R.layout.dialog_recharge_layout, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

    }


    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.dialog);
        View view = View.inflate(getActivity(), R.layout.dialog_recharge_layout, null);
        builder.setView(view);
        dialog = builder.create();
        dialog.setCanceledOnTouchOutside(true);
        // 設置寬度為屏寬、靠近屏幕底部。
        Window window = dialog.getWindow();
        if (window != null && window.getDecorView() != null) {
            window.getDecorView().setPadding(0, 0, 0, 0);
            WindowManager.LayoutParams wlp = window.getAttributes();
            wlp.gravity = Gravity.CENTER;
            //設置沒有效果
            wlp.width = WindowManager.LayoutParams.WRAP_CONTENT;
            window.setAttributes(wlp);
        } else {
            Log.e(TAG, "window是空的或者是window.getDecorView()是空的");
        }
        initView(view);
        return dialog;
    }

    /**
     * 初始化視圖
     *
     * @param view
     */
    private void initView(View view) {
        final OnItemClickListener onItemClickListener = (OnItemClickListener) getTargetFragment();
        mRgRechargeType = (RadioGroup) view.findViewById(R.id.rg_recharge_type);
        mRbRechargeAli = (RadioButton) view.findViewById(R.id.rb_recharge_ali);
        mRbRechargeWechat = (RadioButton) view.findViewById(R.id.rb_recharge_wechat);
        mRbRechargeCard = (RadioButton) view.findViewById(R.id.rb_recharge_card);
        mRlvRechargeOptions = (RecyclerView) view.findViewById(R.id.rlv_recharge_money);
        mTvRechargeSubmit = (TextView) view.findViewById(R.id.tv_recharge_submit);
        RechargeConfBean.DataBean.PayBean payBean = (RechargeConfBean.DataBean.PayBean) getArguments().getSerializable("payConf");
        if (TextUtils.isEmpty(payBean.getBank())) {
            mRbRechargeCard.setVisibility(View.GONE);
        }
        if (TextUtils.isEmpty(payBean.getAlipay())) {
            mRbRechargeAli.setVisibility(View.GONE);
        }
        if (TextUtils.isEmpty(payBean.getWechat())) {
            mRbRechargeWechat.setVisibility(View.GONE);
        }
        if (mRbRechargeAli.getVisibility() != View.GONE) {
            mRgRechargeType.check(R.id.rb_recharge_ali);
        }
        if (mRbRechargeAli.getVisibility() == View.GONE && mRbRechargeWechat.getVisibility() != View.GONE) {
            mRgRechargeType.check(R.id.rb_recharge_wechat);
        }
        if (mRbRechargeAli.getVisibility() == View.GONE && mRbRechargeWechat.getVisibility() == View.GONE
                && mRbRechargeCard.getVisibility() != View.GONE) {
            mRgRechargeType.check(R.id.rb_recharge_card);
        }
        mWithdrawOptionsAdapter = new WithdrawOptionsAdapter(getActivity());
        mRlvRechargeOptions.setLayoutManager(new GridLayoutManager(getActivity(), 4));
        mRlvRechargeOptions.setAdapter(mWithdrawOptionsAdapter);
        mWithdrawOptionsAdapter.setRecItemClick(new RecyclerItemCallback<WithDrawOptionsBean, WithdrawOptionsAdapter.WithdrawOptionsViewHolder>() {
            @Override
            public void onItemClick(int position, WithDrawOptionsBean model, int tag, WithdrawOptionsAdapter.WithdrawOptionsViewHolder holder) {
                super.onItemClick(position, model, tag, holder);
                if (model != null) {
                    moneySelected = model.getRmb();
                }
                mWithdrawOptionsAdapter.doReSelect(position);
            }
        });
        mTvRechargeSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (onItemClickListener != null) {
                    dismiss();
                    onItemClickListener.onMenuClickListener(moneySelected);

                }
            }
        });
        ArrayList<WithDrawOptionsBean> withDrawOptionsBeanList = getArguments().getParcelableArrayList("extra");
        if (withDrawOptionsBeanList != null && withDrawOptionsBeanList.size() > 0) {
            moneySelected = withDrawOptionsBeanList.get(0).getRmb();
        }
        mWithdrawOptionsAdapter.setData(withDrawOptionsBeanList);
    }


    /**
     * 防止重復彈出 顯示此dialog的唯一方法
     *
     * @param appCompatActivity
     * @return
     */
    public RechargeDialog showDialog(Fragment tarFragment, RechargeConfBean.DataBean.PayBean payBean,
                                     ArrayList<WithDrawOptionsBean> withDrawOptionsBeanList) {
        FragmentManager fragmentManager = tarFragment.getActivity().getSupportFragmentManager();
        RechargeDialog rechargeDialog =
                (RechargeDialog) fragmentManager.findFragmentByTag(TAG);
        if (null == rechargeDialog) {
            rechargeDialog = newInstance(withDrawOptionsBeanList, payBean);
        }
        rechargeDialog.setTargetFragment(tarFragment, 1);
        if (!tarFragment.getActivity().isFinishing()
                && null != rechargeDialog
                && !rechargeDialog.isAdded()) {
            fragmentManager.beginTransaction()
                    .add(rechargeDialog, TAG)
                    .commitAllowingStateLoss();
        }
        return rechargeDialog;
    }

    public interface OnItemClickListener {
        /**
         * 提交的金額
         *
         * @param money
         */
        void onMenuClickListener(String money);
    }
}

centerfragment的代碼:


/**
 * Created by Ly on 2017/10/13.
 * 個人中心頁面的碎片
 *
 * @author Ly
 */

public class CenterFragment extends BaseLazyFragment<CenterPresent> implements RechargeDialog.OnItemClickListener {

    @BindView(R.id.tv_title_msg)
    TextView mTvTitleMsg;
    @BindView(R.id.iv_personal_pic)
    ImageView mIvPersonalPic;
    @BindView(R.id.tv_personal_level)
    TextView mTvPersonalLevel;
    @BindView(R.id.tv_personal_money)
    TextView mTvPersonalMoney;
    @BindView(R.id.tv_personal_raised)
    TextView mTvPersonalRaised;
    @BindView(R.id.tv_personal_phone)
    TextView mTvPersonalPhone;
    @BindView(R.id.tv_personal_withdraw)
    TextView mTvPersonalWithdraw;
    @BindView(R.id.tv_personal_recharge)
    TextView mTvPersonalRecharge;
    @BindView(R.id.tv_personal_bind)
    TextView mTvPersonalBind;
    @BindView(R.id.tv_personal_earn)
    TextView mTvPersonalEarn;
    @BindView(R.id.tv_personal_settings)
    TextView mTvPersonalSettings;
    @BindView(R.id.tv_center_login)
    TextView mTvCenterLogin;
    @BindView(R.id.ll_center_login)
    LinearLayout mLlCenterLogin;
    @BindView(R.id.ll_center_status)
    LinearLayout mLlCenterStatus;
    @BindView(R.id.ll_center_button)
    LinearLayout mLlCenterButton;
    Unbinder unbinder;
    @BindView(R.id.fake_status_bar)
    View mFakeStatusBar;


    public static CenterFragment newInstance() {
        Bundle args = new Bundle();
        CenterFragment fragment = new CenterFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void initData(Bundle savedInstanceState) {
        mTvTitleMsg.setText(R.string.text_center);
    }


    @Override
    public void onResume() {
        super.onResume();
        getP().doUpdateUserInfo();
    }

    @Override
    public int getLayoutId() {
        return R.layout.fragment_center;
    }

    @Override
    public CenterPresent newP() {
        return new CenterPresent();
    }


    @OnClick({R.id.tv_personal_withdraw,
            R.id.tv_personal_recharge,
            R.id.tv_personal_bind,
            R.id.tv_personal_earn,
            R.id.tv_personal_settings,
            R.id.iv_personal_pic,
            R.id.tv_center_login})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.tv_personal_withdraw:
                toWithDrawActivity();
                break;
            case R.id.tv_personal_recharge:
                getP().doGetRechargeConf();
                break;
            case R.id.tv_personal_bind:
                if (mTvPersonalBind.getText().equals(getString(R.string.text_bind))) {
                    BindPhoneActivity.toBindPhone(getActivity(), "1");
                } else {
                    BindPhoneActivity.toBindPhone(getActivity(), "2");
                }
                break;
            case R.id.tv_personal_earn:
                if (isLogin) {
                    PersonalPageActivity.toPersonalPageActivity(getActivity());
                } else {
                    toLogin();
                }
                break;
            case R.id.tv_personal_settings:
                if (isLogin) {
                    SettingsActivity.toSettingActivity(getActivity());
                } else {
                    toLogin();
                }
                break;
            case R.id.iv_personal_pic:

                break;
            case R.id.tv_center_login:
                LoginActivity.toLoginActivity(getActivity());
                break;
            default:
                break;
        }
    }

    /**
     * 去提現(xiàn)頁面
     */
    private void toWithDrawActivity() {
        if (isPromotion) {
            WithdrawActivity.toWithdrawActivity(getActivity());
        } else {
            toApply();
        }

    }


    @Override
    protected void lazyLoad() {

    }

    /**
     * 更新用戶數(shù)據(jù)
     *
     * @param loginUserBean
     */
    public void doUpdateUserInfo(LoginUserBean loginUserBean) {
        LoginUserBean.DataBean dataBean = loginUserBean.getData();
        if (dataBean != null) {
            // 已經(jīng)登錄
            isLogin = true;
            isPromotion = AppConf.CommConf.getPromoterFlag().equals(dataBean.getIs_promoter());
            mLlCenterButton.setVisibility(View.VISIBLE);
            mLlCenterStatus.setVisibility(View.VISIBLE);
            mLlCenterLogin.setVisibility(View.GONE);
            mTvPersonalLevel.setText(String.format(getString(R.string.text_vip_level), dataBean.getVip()));
            mTvPersonalMoney.setText(dataBean.getCat_coin());
            mTvPersonalRaised.setText(dataBean.getWithdraw());
            mTvPersonalPhone.setText(TextUtils.isEmpty(dataBean.getPhone()) ? getString(R.string.text_bind_phone_un)
                    : Kits.Regular.hidePhoneNumber(dataBean.getPhone()));
            if (TextUtils.isEmpty(dataBean.getPhone())) {
                mTvPersonalBind.setText(getString(R.string.text_bind));
            } else {
                mTvPersonalBind.setText(getString(R.string.text_unbind));
            }
        } else {
            isLogin = false;
            mLlCenterButton.setVisibility(View.GONE);
            mLlCenterStatus.setVisibility(View.GONE);
            mLlCenterLogin.setVisibility(View.VISIBLE);
        }
    }

    /**
     * 獲取充值配置成功
     *
     * @param data
     */
    public void fillRechargeConf(RechargeConfBean.DataBean data) {
        if (data != null && data.getConfig() != null) {
            ArrayList<WithDrawOptionsBean> withDrawOptionsBeanList = new ArrayList<>();
            for (int i = 0; i < data.getConfig().size(); i++) {
                RechargeConfBean.DataBean.ConfigBean configBean = data.getConfig().get(i);
                WithDrawOptionsBean withDrawOptionsBean = new WithDrawOptionsBean(configBean.getId(), String.valueOf(data.getRate() * configBean.getAmount()),
                        String.valueOf(configBean.getAmount()), i == 0);
                withDrawOptionsBeanList.add(withDrawOptionsBean);
            }
            RechargeDialog mRechargeDialog = new RechargeDialog();
            mRechargeDialog.showDialog(CenterFragment.this,data.getPay(), withDrawOptionsBeanList);
        }
    }

    @Override
    public void onMenuClickListener(String money) {
        XLog.e("money---"+money);
    }
}

另外一個

我們剛剛看到代碼

 /**
     * Optional target for this fragment.  This may be used, for example,
     * if this fragment is being started by another, and when done wants to
     * give a result back to the first.  The target set here is retained
     * across instances via {@link FragmentManager#putFragment
     * FragmentManager.putFragment()}.
     *
     * @param fragment The fragment that is the target of this one.
     * @param requestCode Optional request code, for convenience if you
     * are going to call back with {@link #onActivityResult(int, int, Intent)}.
     */
    public void setTargetFragment(Fragment fragment, int requestCode) {
        mTarget = fragment;
        mTargetRequestCode = requestCode;
    }

requestCode ????
一看到這,我們應該可以馬上想到另外一個方法吧* public void onActivityResult(int requestCode, int resultCode, Intent data) {}*。

所以其實我們還有另外的方式來獲取交互的數(shù)據(jù),在確認按鈕的點擊事件中添加代碼:

 mTvRechargeSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("money", moneySelected);
                //獲得目標Fragment,并將數(shù)據(jù)通過onActivityResult放入到intent中進行傳值
                getTargetFragment().onActivityResult(1, Activity.RESULT_OK, intent);
                if (onItemClickListener != null) {
                    dismiss();
                    onItemClickListener.onMenuClickListener(moneySelected);

                }
            }
        });

其中主要是:

 Intent intent = new Intent();
                intent.putExtra("money", moneySelected);
                //獲得目標Fragment,并將數(shù)據(jù)通過onActivityResult放入到intent中進行傳值
                getTargetFragment().onActivityResult(1, Activity.RESULT_OK, intent);

把值放進去bundle,再塞進onactivityResult()方法中。

而在fragment中我們重寫:

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            XLog.e(data.getStringExtra("money"));
        }
    }

而結果是:


image.png

修改后的centerfragment代碼是:

/**
 * Created by Ly on 2017/10/13.
 * 個人中心頁面的碎片
 *
 * @author Ly
 */

public class CenterFragment extends BaseLazyFragment<CenterPresent> implements RechargeDialog.OnItemClickListener {

    @BindView(R.id.tv_title_msg)
    TextView mTvTitleMsg;
    @BindView(R.id.iv_personal_pic)
    ImageView mIvPersonalPic;
    @BindView(R.id.tv_personal_level)
    TextView mTvPersonalLevel;
    @BindView(R.id.tv_personal_money)
    TextView mTvPersonalMoney;
    @BindView(R.id.tv_personal_raised)
    TextView mTvPersonalRaised;
    @BindView(R.id.tv_personal_phone)
    TextView mTvPersonalPhone;
    @BindView(R.id.tv_personal_withdraw)
    TextView mTvPersonalWithdraw;
    @BindView(R.id.tv_personal_recharge)
    TextView mTvPersonalRecharge;
    @BindView(R.id.tv_personal_bind)
    TextView mTvPersonalBind;
    @BindView(R.id.tv_personal_earn)
    TextView mTvPersonalEarn;
    @BindView(R.id.tv_personal_settings)
    TextView mTvPersonalSettings;
    @BindView(R.id.tv_center_login)
    TextView mTvCenterLogin;
    @BindView(R.id.ll_center_login)
    LinearLayout mLlCenterLogin;
    @BindView(R.id.ll_center_status)
    LinearLayout mLlCenterStatus;
    @BindView(R.id.ll_center_button)
    LinearLayout mLlCenterButton;
    Unbinder unbinder;
    @BindView(R.id.fake_status_bar)
    View mFakeStatusBar;


    public static CenterFragment newInstance() {
        Bundle args = new Bundle();
        CenterFragment fragment = new CenterFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void initData(Bundle savedInstanceState) {
        mTvTitleMsg.setText(R.string.text_center);
    }


    @Override
    public void onResume() {
        super.onResume();
        getP().doUpdateUserInfo();
    }

    @Override
    public int getLayoutId() {
        return R.layout.fragment_center;
    }

    @Override
    public CenterPresent newP() {
        return new CenterPresent();
    }


    @OnClick({R.id.tv_personal_withdraw,
            R.id.tv_personal_recharge,
            R.id.tv_personal_bind,
            R.id.tv_personal_earn,
            R.id.tv_personal_settings,
            R.id.iv_personal_pic,
            R.id.tv_center_login})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.tv_personal_withdraw:
                toWithDrawActivity();
                break;
            case R.id.tv_personal_recharge:
                getP().doGetRechargeConf();
                break;
            case R.id.tv_personal_bind:
                if (mTvPersonalBind.getText().equals(getString(R.string.text_bind))) {
                    BindPhoneActivity.toBindPhone(getActivity(), "1");
                } else {
                    BindPhoneActivity.toBindPhone(getActivity(), "2");
                }
                break;
            case R.id.tv_personal_earn:
                if (isLogin) {
                    PersonalPageActivity.toPersonalPageActivity(getActivity());
                } else {
                    toLogin();
                }
                break;
            case R.id.tv_personal_settings:
                if (isLogin) {
                    SettingsActivity.toSettingActivity(getActivity());
                } else {
                    toLogin();
                }
                break;
            case R.id.iv_personal_pic:

                break;
            case R.id.tv_center_login:
                LoginActivity.toLoginActivity(getActivity());
                break;
            default:
                break;
        }
    }

    /**
     * 去提現(xiàn)頁面
     */
    private void toWithDrawActivity() {
        if (isPromotion) {
            WithdrawActivity.toWithdrawActivity(getActivity());
        } else {
            toApply();
        }

    }


    @Override
    protected void lazyLoad() {

    }

    /**
     * 更新用戶數(shù)據(jù)
     *
     * @param loginUserBean
     */
    public void doUpdateUserInfo(LoginUserBean loginUserBean) {
        LoginUserBean.DataBean dataBean = loginUserBean.getData();
        if (dataBean != null) {
            // 已經(jīng)登錄
            isLogin = true;
            isPromotion = AppConf.CommConf.getPromoterFlag().equals(dataBean.getIs_promoter());
            mLlCenterButton.setVisibility(View.VISIBLE);
            mLlCenterStatus.setVisibility(View.VISIBLE);
            mLlCenterLogin.setVisibility(View.GONE);
            mTvPersonalLevel.setText(String.format(getString(R.string.text_vip_level), dataBean.getVip()));
            mTvPersonalMoney.setText(dataBean.getCat_coin());
            mTvPersonalRaised.setText(dataBean.getWithdraw());
            mTvPersonalPhone.setText(TextUtils.isEmpty(dataBean.getPhone()) ? getString(R.string.text_bind_phone_un)
                    : Kits.Regular.hidePhoneNumber(dataBean.getPhone()));
            if (TextUtils.isEmpty(dataBean.getPhone())) {
                mTvPersonalBind.setText(getString(R.string.text_bind));
            } else {
                mTvPersonalBind.setText(getString(R.string.text_unbind));
            }
        } else {
            isLogin = false;
            mLlCenterButton.setVisibility(View.GONE);
            mLlCenterStatus.setVisibility(View.GONE);
            mLlCenterLogin.setVisibility(View.VISIBLE);
        }
    }

    /**
     * 獲取充值配置成功
     *
     * @param data
     */
    public void fillRechargeConf(RechargeConfBean.DataBean data) {
        if (data != null && data.getConfig() != null) {
            ArrayList<WithDrawOptionsBean> withDrawOptionsBeanList = new ArrayList<>();
            for (int i = 0; i < data.getConfig().size(); i++) {
                RechargeConfBean.DataBean.ConfigBean configBean = data.getConfig().get(i);
                WithDrawOptionsBean withDrawOptionsBean = new WithDrawOptionsBean(configBean.getId(), String.valueOf(data.getRate() * configBean.getAmount()),
                        String.valueOf(configBean.getAmount()), i == 0);
                withDrawOptionsBeanList.add(withDrawOptionsBean);
            }
            RechargeDialog mRechargeDialog = new RechargeDialog();
            mRechargeDialog.showDialog(CenterFragment.this, data.getPay(), withDrawOptionsBeanList);
        }
    }

    @Override
    public void onMenuClickListener(String money) {
        XLog.e("money---" + money);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            XLog.e(data.getStringExtra("money"));
        }
    }
}

https://github.com/LinHuanTanLy/FullDialogMaster/blob/master/README.md
基本代碼是這樣的,待會整理下git發(fā)出去,如果有更好的辦法或者思路,煩請告知我。

此致

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容