Skip to content

Commit 9704e64

Browse files
committed
基本完成FragmentContainer的演示
1 parent e2b098d commit 9704e64

6 files changed

Lines changed: 221 additions & 38 deletions

File tree

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,116 @@
11
package net.lucode.hackware.magicindicatordemo.example;
22

3+
import android.content.Context;
4+
import android.graphics.Color;
35
import android.os.Bundle;
6+
import android.support.v4.app.Fragment;
7+
import android.support.v4.app.FragmentManager;
8+
import android.support.v4.app.FragmentTransaction;
49
import android.support.v7.app.AppCompatActivity;
10+
import android.view.View;
511

12+
import net.lucode.hackware.magicindicator.FragmentContainerHelper;
13+
import net.lucode.hackware.magicindicator.MagicIndicator;
14+
import net.lucode.hackware.magicindicator.buildins.UIUtil;
15+
import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator;
16+
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
17+
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
18+
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
19+
import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
20+
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.ClipPagerTitleView;
621
import net.lucode.hackware.magicindicatordemo.R;
722

23+
import java.util.ArrayList;
24+
import java.util.List;
25+
826
public class FragmentContainerExampleActivity extends AppCompatActivity {
27+
private String[] channels = new String[]{"KITKAT", "NOUGAT", "DONUT"};
28+
private List<Fragment> mFragments = new ArrayList<Fragment>();
29+
private FragmentContainerHelper mFragmentContainerHelper = new FragmentContainerHelper();
930

1031
@Override
1132
protected void onCreate(Bundle savedInstanceState) {
1233
super.onCreate(savedInstanceState);
1334
setContentView(R.layout.activity_fragment_container_example_layout);
35+
36+
initFragments();
37+
initMagicIndicator1();
38+
39+
mFragmentContainerHelper.handlePageSelected(1, false);
40+
switchPages(1);
41+
}
42+
43+
private void switchPages(int index) {
44+
FragmentManager fragmentManager = getSupportFragmentManager();
45+
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
46+
Fragment fragment;
47+
for (int i = 0, j = mFragments.size(); i < j; i++) {
48+
if (i == index) {
49+
continue;
50+
}
51+
fragment = mFragments.get(i);
52+
if (fragment.isAdded()) {
53+
fragmentTransaction.hide(fragment);
54+
}
55+
}
56+
fragment = mFragments.get(index);
57+
if (fragment.isAdded()) {
58+
fragmentTransaction.show(fragment);
59+
} else {
60+
fragmentTransaction.add(R.id.fragment_container, fragment);
61+
}
62+
fragmentTransaction.commitAllowingStateLoss();
63+
}
64+
65+
private void initFragments() {
66+
for (int i = 0; i < channels.length; i++) {
67+
TestFragment testFragment = new TestFragment();
68+
Bundle bundle = new Bundle();
69+
bundle.putString(TestFragment.EXTRA_TEXT, channels[i]);
70+
testFragment.setArguments(bundle);
71+
mFragments.add(testFragment);
72+
}
73+
}
74+
75+
private void initMagicIndicator1() {
76+
MagicIndicator magicIndicator = (MagicIndicator) findViewById(R.id.magic_indicator1);
77+
CommonNavigator commonNavigator = new CommonNavigator(this);
78+
commonNavigator.setAdapter(new CommonNavigatorAdapter() {
79+
@Override
80+
public int getCount() {
81+
return channels.length;
82+
}
83+
84+
@Override
85+
public IPagerTitleView getTitleView(Context context, final int index) {
86+
ClipPagerTitleView clipPagerTitleView = new ClipPagerTitleView(context);
87+
clipPagerTitleView.setText(channels[index]);
88+
clipPagerTitleView.setTextColor(Color.parseColor("#e94220"));
89+
clipPagerTitleView.setClipColor(Color.WHITE);
90+
clipPagerTitleView.setOnClickListener(new View.OnClickListener() {
91+
@Override
92+
public void onClick(View v) {
93+
mFragmentContainerHelper.handlePageSelected(index);
94+
switchPages(index);
95+
}
96+
});
97+
return clipPagerTitleView;
98+
}
99+
100+
@Override
101+
public IPagerIndicator getIndicator(Context context) {
102+
LinePagerIndicator indicator = new LinePagerIndicator(context);
103+
float navigatorHeight = context.getResources().getDimension(R.dimen.common_navigator_height);
104+
float borderWidth = UIUtil.dip2px(context, 1);
105+
float lineHeight = navigatorHeight - 2 * borderWidth;
106+
indicator.setLineHeight(lineHeight);
107+
indicator.setRoundRadius(lineHeight / 2);
108+
indicator.setYOffset(borderWidth);
109+
indicator.setColors(Color.parseColor("#bc2a2a"));
110+
return indicator;
111+
}
112+
});
113+
magicIndicator.setNavigator(commonNavigator);
114+
mFragmentContainerHelper.attachMagicIndicator(magicIndicator);
14115
}
15116
}

app/src/main/java/net/lucode/hackware/magicindicatordemo/example/NoTabOnlyIndicatorExampleActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ protected void onCreate(Bundle savedInstanceState) {
4343
private void initMagicIndicator1() {
4444
MagicIndicator magicIndicator = (MagicIndicator) findViewById(R.id.magic_indicator1);
4545
magicIndicator.setBackgroundColor(Color.LTGRAY);
46-
final CommonNavigator commonNavigator = new CommonNavigator(this);
46+
CommonNavigator commonNavigator = new CommonNavigator(this);
4747
commonNavigator.setAdjustMode(true);
4848
commonNavigator.setAdapter(new CommonNavigatorAdapter() {
4949
@Override
@@ -71,7 +71,7 @@ public IPagerIndicator getIndicator(Context context) {
7171

7272
private void initMagicIndicator2() {
7373
MagicIndicator magicIndicator = (MagicIndicator) findViewById(R.id.magic_indicator2);
74-
final CommonNavigator commonNavigator = new CommonNavigator(this);
74+
CommonNavigator commonNavigator = new CommonNavigator(this);
7575
commonNavigator.setAdjustMode(true);
7676
commonNavigator.setAdapter(new CommonNavigatorAdapter() {
7777
@Override
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package net.lucode.hackware.magicindicatordemo.example;
2+
3+
import android.os.Bundle;
4+
import android.support.annotation.Nullable;
5+
import android.support.v4.app.Fragment;
6+
import android.view.LayoutInflater;
7+
import android.view.View;
8+
import android.view.ViewGroup;
9+
import android.widget.TextView;
10+
11+
import net.lucode.hackware.magicindicatordemo.R;
12+
13+
/**
14+
* Created by fbchen2 on 2016/9/13.
15+
*/
16+
17+
public class TestFragment extends Fragment {
18+
public static final String EXTRA_TEXT = "extra_text";
19+
20+
@Nullable
21+
@Override
22+
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
23+
return inflater.inflate(R.layout.simple_fragment_layout, container, false);
24+
}
25+
26+
@Override
27+
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
28+
TextView textView = (TextView) view.findViewById(R.id.text_view);
29+
Bundle bundle = getArguments();
30+
if (bundle != null) {
31+
textView.setText(bundle.getString(EXTRA_TEXT));
32+
}
33+
}
34+
}
Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,35 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools"
4-
android:id="@+id/activity_no_view_pager_example"
54
android:layout_width="match_parent"
65
android:layout_height="match_parent"
7-
android:paddingBottom="@dimen/activity_vertical_margin"
8-
android:paddingLeft="@dimen/activity_horizontal_margin"
9-
android:paddingRight="@dimen/activity_horizontal_margin"
10-
android:paddingTop="@dimen/activity_vertical_margin"
6+
android:orientation="vertical"
117
tools:context="net.lucode.hackware.magicindicatordemo.example.FragmentContainerExampleActivity">
128

13-
<TextView
14-
android:layout_width="wrap_content"
9+
<LinearLayout
10+
android:layout_width="match_parent"
1511
android:layout_height="wrap_content"
16-
android:layout_centerInParent="true"
17-
android:text="coming soon!" />
12+
android:layout_marginTop="@dimen/navigator_margin_top"
13+
android:orientation="vertical">
1814

19-
</RelativeLayout>
15+
<net.lucode.hackware.magicindicator.MagicIndicator
16+
android:id="@+id/magic_indicator1"
17+
android:layout_width="wrap_content"
18+
android:layout_height="@dimen/common_navigator_height"
19+
android:layout_gravity="center_horizontal"
20+
android:background="@drawable/round_indicator_bg" />
21+
22+
</LinearLayout>
23+
24+
<FrameLayout
25+
android:id="@+id/fragment_container"
26+
android:layout_width="match_parent"
27+
android:layout_height="0dp"
28+
android:layout_weight="1" />
29+
30+
<net.lucode.hackware.magicindicator.MagicIndicator
31+
android:id="@+id/magic_indicator2"
32+
android:layout_width="match_parent"
33+
android:layout_height="@dimen/common_navigator_height" />
34+
35+
</LinearLayout>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="match_parent">
5+
6+
<TextView
7+
android:id="@+id/text_view"
8+
android:layout_width="wrap_content"
9+
android:layout_height="wrap_content"
10+
android:layout_gravity="center" />
11+
12+
</FrameLayout>

magicindicator/src/main/java/net/lucode/hackware/magicindicator/FragmentContainerHelper.java

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,49 @@
66
import android.view.animation.AccelerateDecelerateInterpolator;
77
import android.view.animation.Interpolator;
88

9+
import java.util.ArrayList;
10+
import java.util.List;
11+
912

1013
/**
1114
* 使得MagicIndicator在FragmentContainer中使用
1215
* Created by hackware on 2016/9/4.
1316
*/
1417

15-
public class FragmentContainerHelper extends AnimatorListenerAdapter implements ValueAnimator.AnimatorUpdateListener {
16-
private MagicIndicator mMagicIndicator;
18+
public class FragmentContainerHelper {
19+
private List<MagicIndicator> mMagicIndicators = new ArrayList<MagicIndicator>();
1720
private ValueAnimator mScrollAnimator;
1821
private int mLastSelectedIndex;
1922
private int mDuration = 150;
2023
private Interpolator mInterpolator = new AccelerateDecelerateInterpolator();
2124

25+
private Animator.AnimatorListener mAnimatorListener = new AnimatorListenerAdapter() {
26+
@Override
27+
public void onAnimationEnd(Animator animation) {
28+
dispatchPageScrollStateChanged(ScrollState.SCROLL_STATE_IDLE);
29+
mScrollAnimator = null;
30+
}
31+
};
32+
33+
private ValueAnimator.AnimatorUpdateListener mAnimatorUpdateListener = new ValueAnimator.AnimatorUpdateListener() {
34+
@Override
35+
public void onAnimationUpdate(ValueAnimator animation) {
36+
float positionOffsetSum = (Float) animation.getAnimatedValue();
37+
int position = (int) positionOffsetSum;
38+
float positionOffset = positionOffsetSum - position;
39+
if (positionOffsetSum < 0) {
40+
position = -1;
41+
positionOffset = 1.0f + positionOffset;
42+
}
43+
dispatchPageScrolled(position, positionOffset, 0);
44+
}
45+
};
46+
47+
public FragmentContainerHelper() {
48+
}
49+
2250
public FragmentContainerHelper(MagicIndicator magicIndicator) {
23-
mMagicIndicator = magicIndicator;
51+
mMagicIndicators.add(magicIndicator);
2452
}
2553

2654
public void handlePageSelected(int selectedIndex) {
@@ -44,8 +72,8 @@ public void handlePageSelected(int selectedIndex, boolean smooth) {
4472
}
4573
mScrollAnimator = new ValueAnimator();
4674
mScrollAnimator.setFloatValues(currentPositionOffsetSum, selectedIndex); // position = selectedIndex, positionOffset = 0.0f
47-
mScrollAnimator.addUpdateListener(this);
48-
mScrollAnimator.addListener(this);
75+
mScrollAnimator.addUpdateListener(mAnimatorUpdateListener);
76+
mScrollAnimator.addListener(mAnimatorListener);
4977
mScrollAnimator.setInterpolator(mInterpolator);
5078
mScrollAnimator.setDuration(mDuration);
5179
mScrollAnimator.start();
@@ -72,33 +100,25 @@ public void setInterpolator(Interpolator interpolator) {
72100
}
73101
}
74102

103+
public void attachMagicIndicator(MagicIndicator magicIndicator) {
104+
mMagicIndicators.add(magicIndicator);
105+
}
106+
75107
private void dispatchPageSelected(int pageIndex) {
76-
mMagicIndicator.onPageSelected(pageIndex);
108+
for (MagicIndicator magicIndicator : mMagicIndicators) {
109+
magicIndicator.onPageSelected(pageIndex);
110+
}
77111
}
78112

79113
private void dispatchPageScrollStateChanged(int state) {
80-
mMagicIndicator.onPageScrollStateChanged(state);
114+
for (MagicIndicator magicIndicator : mMagicIndicators) {
115+
magicIndicator.onPageScrollStateChanged(state);
116+
}
81117
}
82118

83119
private void dispatchPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
84-
mMagicIndicator.onPageScrolled(position, positionOffset, positionOffsetPixels);
85-
}
86-
87-
@Override
88-
public void onAnimationUpdate(ValueAnimator animation) {
89-
float positionOffsetSum = (Float) animation.getAnimatedValue();
90-
int position = (int) positionOffsetSum;
91-
float positionOffset = positionOffsetSum - position;
92-
if (positionOffsetSum < 0) {
93-
position = -1;
94-
positionOffset = 1.0f + positionOffset;
120+
for (MagicIndicator magicIndicator : mMagicIndicators) {
121+
magicIndicator.onPageScrolled(position, positionOffset, positionOffsetPixels);
95122
}
96-
dispatchPageScrolled(position, positionOffset, 0);
97-
}
98-
99-
@Override
100-
public void onAnimationEnd(Animator animation) {
101-
mMagicIndicator.onPageScrollStateChanged(ScrollState.SCROLL_STATE_IDLE);
102-
mScrollAnimator = null;
103123
}
104124
}

0 commit comments

Comments
 (0)