關(guān)于Android一個畫了6個小時的Dialog

前言

這是設(shè)計稿

OK态坦,拿到設(shè)計稿的時候。我是輕蔑一笑的棒拂,這算什么難度....分分鐘就可以搞掂了驮配,不就是一個dialog,里面我放上一個viewpager着茸,viewpager里面我再放上一個RecyclerView壮锻,頂了天我需要寫2個適配器,半小時就可以搞掂d汤猜绣!

OK,開擼敬特,Dialog自定義出來掰邢,放ViewPager牺陶,寫FragmentPagerAdapter適配器,丟進去RecyclerView辣之,再寫一個RecyclerView適配器掰伸。

OK, 跑項目...焦急的等待以及電腦風扇的瘋狂躁動中...跑起來了,點擊一看怀估!納尼狮鸭,我的RecyclerView呢?多搀?歧蕉?跑哪里了?康铭?惯退?!4犹佟4吖颉!

地獄

第一次跑完失敗...代碼有問題夷野!再修改0谜簟!扫责!

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

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

然而報的錯誤---->

報錯

看到這里我是懵逼的榛鼎! 我在Dialog的layout文件里面找控件,然而你給你索引到了子Fragment里面去找鳖孤!為啥U哂椤?苏揣?

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

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

方法(失敗的)

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

介紹!

該方法需要我們實現(xiàn)一個默認的構(gòu)造函數(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);
        // 設(shè)置寬度為屏寬鹿蜀、靠近屏幕底部。
        Window window = dialog.getWindow();
        window.getDecorView().setPadding(0, 0, 0, 0);
        WindowManager.LayoutParams wlp = window.getAttributes();
        wlp.gravity = Gravity.BOTTOM;
        //設(shè)置沒有效果
        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);
        }
    }

    //防止重復(fù)彈出
    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);
        //設(shè)置滾動監(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();

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

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

                if (velocityY < 0) {
                    p--;
                } else if (velocityY > 0) {
                    p++;
                }
                //更具不同的速度判斷需要滾動的方向
                //注意捞附,此處有一個技巧,就是當速度為0的時候就滾動會開始的頁面,即實現(xiàn)頁面復(fù)位
                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) {
            //滾動結(jié)束記錄滾動的偏移量
            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點還沒得睡:滴铩!烤蜕!由此可見基礎(chǔ)是多么重要!3髋簟!糖荒!媽的,惡補回來了必須综看。

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

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

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

錯誤的做法

這個是用得比較多的辦法,沒辦法嘛,誰叫安卓是回調(diào)地獄呢腻要,那必須是Callback啊:

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

在dialog類里聲明callback實例:

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

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

  /**
     * 防止重復(fù)彈出 顯示此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);
        // 設(shè)置寬度為屏寬杨伙、靠近屏幕底部抖苦。
        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;
            //設(shè)置沒有效果
            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();
                }
            }
        });
    }


    /**
     * 防止重復(fù)彈出 顯示此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());
        }
    });

是不是寫完覺得好簡單啊...沒意思啊...不好玩啊...之類的...然后好玩的就來了4吧鳌!伏伐!

內(nèi)存泄露

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

比較好的方案

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

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

代碼如下:
獲取interface實例

  final OnItemClickListener onItemClickListener= (OnItemClickListener) getActivity();

需要使用該dialog的宿主Activity需要實現(xiàn)對應(yīng)的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是我們傳進去的瘤睹,那就好辦了驴党!開擼:

  /**
     * 防止重復(fù)彈出 顯示此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,看是否可以進行交互!


結(jié)果顯示

結(jié)果

結(jié)果

這里已經(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);
        // 設(shè)置寬度為屏寬冕臭、靠近屏幕底部腺晾。
        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;
            //設(shè)置沒有效果
            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);
    }


    /**
     * 防止重復(fù)彈出 顯示此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 辜贵?悯蝉??托慨?
一看到這鼻由,我們應(yīng)該可以馬上想到另外一個方法吧* 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"));
        }
    }

而結(jié)果是:


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ā)出去狠轻,如果有更好的辦法或者思路,煩請告知我彬犯。

此致

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末向楼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谐区,更是在濱河造成了極大的恐慌湖蜕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宋列,死亡現(xiàn)場離奇詭異重荠,居然都是意外死亡,警方通過查閱死者的電腦和手機虚茶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門戈鲁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘹叫,你說我怎么就攤上這事婆殿。” “怎么了罩扇?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵婆芦,是天一觀的道長。 經(jīng)常有香客問我喂饥,道長消约,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任员帮,我火速辦了婚禮或粮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捞高。我一直安慰自己氯材,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布硝岗。 她就那樣靜靜地躺著氢哮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪型檀。 梳的紋絲不亂的頭發(fā)上冗尤,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音胀溺,去河邊找鬼裂七。 笑死,一個胖子當著我的面吹牛月幌,可吹牛的內(nèi)容都是我干的碍讯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扯躺,長吁一口氣:“原來是場噩夢啊……” “哼捉兴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起录语,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤倍啥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澎埠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虽缕,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年蒲稳,在試婚紗的時候發(fā)現(xiàn)自己被綠了氮趋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伍派。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖剩胁,靈堂內(nèi)的尸體忽然破棺而出诉植,到底是詐尸還是另有隱情,我是刑警寧澤昵观,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布晾腔,位于F島的核電站,受9級特大地震影響啊犬,放射性物質(zhì)發(fā)生泄漏灼擂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一觉至、第九天 我趴在偏房一處隱蔽的房頂上張望剔应。 院中可真熱鬧,春花似錦康谆、人聲如沸领斥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽月洛。三九已至,卻和暖如春孽锥,著一層夾襖步出監(jiān)牢的瞬間嚼黔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工惜辑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唬涧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓盛撑,卻偏偏與公主長得像碎节,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抵卫,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容