菜菜Android凌宇的Android踩坑路Android Class

关于Android一个画了6个小时的Dialog

2017-04-22  本文已影响1429人  间歇性丶神经病患者

前言

这是设计稿

OK,拿到设计稿的时候。我是轻蔑一笑的,这算什么难度....分分钟就可以搞掂了,不就是一个dialog,里面我放上一个viewpager,viewpager里面我再放上一个RecyclerView,顶了天我需要写2个适配器,半小时就可以搞掂!!

OK,开撸,Dialog自定义出来,放ViewPager,写FragmentPagerAdapter适配器,丢进去RecyclerView,再写一个RecyclerView适配器。

OK, 跑项目...焦急的等待以及电脑风扇的疯狂躁动中...跑起来了,点击一看!纳尼,我的RecyclerView呢???跑哪里了???!!!!

地狱

第一次跑完失败...代码有问题!再修改!!!

下面是让我一直很苦恼的一个bug:

适配器布局文件 适配器加载文件

然而报的错误---->

报错

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

划重点 : 要使用getchildfragmentmanager()而不是getsupportfragmentmanager()

ok,改完后不报错了...
然而没卵用...我的viewpager彻底跟我分手了,我可以改viewpager的颜色,可以改viewpager的LayoutParams,但是我就是找不到里面的子Fragment....彻彻底底,跟我分手了。

方法(失败的)

ok,dialog我们用不了的,AlertDialog我们也是没办法使用的...那我们用什么,是不是有人说用popwindow,呵呵...用那个更麻烦。我们用FragmentDialog,这个东西其实我没有用过。

介绍!

该方法需要我们实现一个默认的构造函数,把我们的dailog从本质上变成了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;
    /**
     * 发送
     */
    private CardView cvGiftSend;

    protected Dialog dialog;
    /**
     * 加载的适配器
     */
    private GiftListAdapter giftListAdapter;

    /**
     * 滑动监听控制器
     */
    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);
        }
    }

    /**
     * 更新状态
     *
     * @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);
    }
}



如果是按照我一开始的思路来实现的话,是无法实现的,依然会出现ViewPager无法显示子内容的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;

        //计算宽高已经使用的量,主要用于后期测量
        itemWidthUsed = (columns - 1) * itemWidth;
        itemHeightUsed = (rows - 1) * itemHeight;

        //计算总的页数
        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) {
                        //跳出多重循环
                        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);


                }
            }
            //每一页循环以后就回收一页的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;
    }
}

那又有人问了,我们如何监听页面滑动,进而更新指示器?

**
 * 实现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);
        //设置滚动监听,记录滚动的状态,和总的偏移量
        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的时候就滚动会开始的页面,即实现页面复位
                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方法实现滚动。
                            mRecyclerView.scrollBy(0, dy);
                        } else {
                            int dx = nowPoint - offsetX;
                            mRecyclerView.scrollBy(dx, 0);
                        }
                    }
                });
                mAnimator.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        //回调监听
                        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点还没得睡!!!由此可见基础是多么重要!!!!妈的,恶补回来了必须。

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

//********分割线,现在时间是2017年11月29日17:58:23***************************************************************************

啊哈哈哈哈哈,差点没被人打死,朋友跟我说没做点击监听...我一看,还真的是吖。赶紧补回来,不然要被人打死了。

错误的做法

这个是用得比较多的办法,没办法嘛,谁叫安卓是回调地狱呢,那必须是Callback啊:

 public interface OnItemClickListener {
        /**
         * 点击菜单项的回调事件
         *
         * @param shareMenuBean
         */
        void onMenuClickListener(ShareMenuBean shareMenuBean);
    }

在dialog类里声明callback实例:

 /**
     * 分享的菜单点击回调
     */
    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的点击事件里面进行回调:

  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;
    /**
     * 分享的菜单的数据源
     */
    private List<ShareMenuBean> mShareMenus = new ArrayList<>();
    /**
     * 分享的菜单点击回调
     */
    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 {
        /**
         * 点击菜单项的回调事件
         *
         * @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());
        }
    });

是不是写完觉得好简单啊...没意思啊...不好玩啊...之类的...然后好玩的就来了!!!

内存泄露

这特么就很尴尬了...所以这个办法其实是很不好的,抛弃之,我们找别的方案!

比较好的方案

因为上述我们的interface是static的,所以有可能会引发内存问题!而我们的dialog实质上是fragment!理论上fragment如何和dialog交互,那么我们的dialog也是可以这么做的。

  1. 宿主Activity实现dialog的interface
  2. dialog通过getActivity()并强转获取interface实例,进行事件分发。

代码如下:
获取interface实例

  final OnItemClickListener onItemClickListener= (OnItemClickListener) getActivity();

需要使用该dialog的宿主Activity需要实现对应的dialog的interface,


image.png

通过该方法,我们已经可以实现dialogFragment与Activity的无痛交流了。
代码很简单就不放了,反正重头戏也不是这个,
所以问题又有了!
如果我的dialog是在fragment里面弹出来的呢,getActivity()获取的是宿主fragment的宿主Activitty...总不能我点击个dialog,要跑到MainActivity里面去拿数据处理数据吧。

在fragment里面,除了getActivity()方法,还可以发现有其他2个, image.png

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

点击进入Fragment的源码,我们不难发现这个方法:

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

发现了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了吧,让它实现intefrace,看是否可以进行交互!


结果显示

结果

结果

这里已经实现了交互的逻辑了。这里贴下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;
        }
    }

    /**
     * 去提现页面
     */
    private void toWithDrawActivity() {
        if (isPromotion) {
            WithdrawActivity.toWithdrawActivity(getActivity());
        } else {
            toApply();
        }

    }


    @Override
    protected void lazyLoad() {

    }

    /**
     * 更新用户数据
     *
     * @param loginUserBean
     */
    public void doUpdateUserInfo(LoginUserBean loginUserBean) {
        LoginUserBean.DataBean dataBean = loginUserBean.getData();
        if (dataBean != null) {
            // 已经登录
            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) {}*。

所以其实我们还有另外的方式来获取交互的数据,在确认按钮的点击事件中添加代码:

 mTvRechargeSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("money", moneySelected);
                //获得目标Fragment,并将数据通过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,并将数据通过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;
        }
    }

    /**
     * 去提现页面
     */
    private void toWithDrawActivity() {
        if (isPromotion) {
            WithdrawActivity.toWithdrawActivity(getActivity());
        } else {
            toApply();
        }

    }


    @Override
    protected void lazyLoad() {

    }

    /**
     * 更新用户数据
     *
     * @param loginUserBean
     */
    public void doUpdateUserInfo(LoginUserBean loginUserBean) {
        LoginUserBean.DataBean dataBean = loginUserBean.getData();
        if (dataBean != null) {
            // 已经登录
            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发出去,如果有更好的办法或者思路,烦请告知我。

此致

上一篇下一篇

猜你喜欢

热点阅读