前言
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代碼: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吧鳌!伏伐!
這特么就很尷尬了...所以這個辦法其實是很不好的,拋棄之,我們找別的方案末贾!
比較好的方案
因為上述我們的interface是static的,所以有可能會引發(fā)內(nèi)存問題拴测!而我們的dialog實質(zhì)上是fragment!理論上fragment如何和dialog交互,那么我們的dialog也是可以這么做的函匕。
- 宿主Activity實現(xiàn)dialog的interface
- dialog通過getActivity()并強轉(zhuǎn)獲取interface實例中剩,進行事件分發(fā)。
代碼如下:
獲取interface實例
final OnItemClickListener onItemClickListener= (OnItemClickListener) getActivity();
需要使用該dialog的宿主Activity需要實現(xiàn)對應(yīng)的dialog的interface妆棒,
通過該方法毅糟,我們已經(jīng)可以實現(xiàn)dialogFragment與Activity的無痛交流了喇肋。
代碼很簡單就不放了,反正重頭戲也不是這個间学,
所以問題又有了!
如果我的dialog是在fragment里面彈出來的呢嘿悬,getActivity()獲取的是宿主fragment的宿主Activitty...總不能我點擊個dialog,要跑到MainActivity里面去拿數(shù)據(jù)處理數(shù)據(jù)吧登钥。
可以拿到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é)果
這里已經(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é)果是:
修改后的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ā)出去狠轻,如果有更好的辦法或者思路,煩請告知我彬犯。