1 自定义ScrollView
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;
import com.dyjt.dyjtgcs.interfaces.ScrollViewListener;
public class ObservableScrollView extends ScrollView {
private ScrollViewListener scrollViewListener = null;
public ObservableScrollView(Context context) {
super(context);
}
public ObservableScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
public ObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
if (scrollViewListener != null) {
scrollViewListener.onScrollChanged( x, y, oldx, oldy);
}
}
}
2 自定义Viewpager
因为ViewPager中的fragment在添加listview的时候会以最高的为准 剩下的其他fragment会产生大量空白 所以需要viewpager自适应高度 并在activity中调用 resetHeight()方法
/**
* 解决嵌套viewpager时事件冲突的问题
* Created by shenshilei on 2017/5/10.
*/
public class PersonalViewpager extends ViewPager {
private int current;
private int viewHeight = 0;
private boolean scrollble = true;
public PersonalViewpager(Context context) {
super(context);
}
public PersonalViewpager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
View childView = getChildAt(getCurrentItem());
if (childView != null) //有可能没有子view
{
childView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
viewHeight = childView.getMeasuredHeight(); //得到父元素对自身设定的高
// UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小
//EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;
//AT_MOST(至多),子元素至多达到指定大小的值。
heightMeasureSpec = MeasureSpec.makeMeasureSpec(viewHeight, MeasureSpec.EXACTLY);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void resetHeight(int current) {
this.current = current;
if (getChildCount() > current) {
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) getLayoutParams();
if (layoutParams == null) {
layoutParams = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, viewHeight);
} else {
layoutParams.height = viewHeight;
}
setLayoutParams(layoutParams);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (!scrollble) {
return true;
}
return super.onTouchEvent(ev);
}
public boolean isScrollble() {
return scrollble;
}
public void setScrollble(boolean scrollble) {
this.scrollble = scrollble;
}
3自定义Listview
public class MylistView extends ListView {
public MylistView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public MylistView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public MylistView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
4 使用时的xml布局
5 activity
public class Fragment_Shequ extends BaseFragment {
@BindView(R.id.tabLayout)
TabLayout tabLayout;
@BindView(R.id.viewPager)
PersonalViewpager viewPager;
Unbinder unbinder;
@BindView(R.id.top_change_layout_text1)
TextView topChangeLayoutText1;
@BindView(R.id.top_change_layout_view1)
TextView topChangeLayoutView1;
@BindView(R.id.top_change_layout_text2)
TextView topChangeLayoutText2;
@BindView(R.id.top_change_layout_view2)
TextView topChangeLayoutView2;
private View view;
@BindView(R.id.scrollview)
ObservableScrollView scrollview;
@BindView(R.id.top_layout)
RelativeLayout top_layout;
TextView tc;
@BindView(R.id.top_change_layout)
LinearLayout top_change_layout;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (view == null) {
view = View.inflate(getActivity(), R.layout.fragment_2, null);
}
unbinder = ButterKnife.bind(this, view);
initView();
return view;
}
private void initView() {
List sd = new ArrayList<>();
sd.add("案例分享");
sd.add("学习考核");
// 添加多个tab
for (int i = 0; i < sd.size(); i++) {
TabLayout.Tab tab = tabLayout.newTab();
tab.setText(sd.get(i));
// tab.setIcon(R.mipmap.ic_launcher);//icon会显示在文字上面
tabLayout.addTab(tab);
}
MyViewPagerAdapter adapter = new MyViewPagerAdapter(sd, getChildFragmentManager());
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
tabLayout.post(new Runnable() {
@Override
public void run() {
setIndicator(tabLayout, 50, 50);
}
});
scrollview.setScrollViewListener(new ScrollViewListener() {
@Override
public void onScrollChanged(int x, int y, int oldx, int oldy) {
if (y > top_layout.getHeight()) {
top_change_layout.setVisibility(View.VISIBLE);
} else {
top_change_layout.setVisibility(View.GONE);
}
}
});
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//选中了tab的逻辑
Log.i("info","----"+tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
//未选中tab的逻辑
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
//再次选中tab的逻辑
}
});
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
viewPager.resetHeight(position);
switch (position) {
case 0:
topChangeLayoutText1.setTextColor(getActivity().getResources().getColor(R.color._color_333));
topChangeLayoutView1.setVisibility(View.VISIBLE);
topChangeLayoutText2.setTextColor(getActivity().getResources().getColor(R.color._color_666));
topChangeLayoutView2.setVisibility(View.GONE);
break;
case 1:
topChangeLayoutText1.setTextColor(getActivity().getResources().getColor(R.color._color_666));
topChangeLayoutView1.setVisibility(View.GONE);
topChangeLayoutText2.setTextColor(getActivity().getResources().getColor(R.color._color_333));
topChangeLayoutView2.setVisibility(View.VISIBLE);
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
viewPager.resetHeight(0);
}
@OnClick({R.id.top_change_layout_left, R.id.top_change_layout_right})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.top_change_layout_left:
viewPager.setCurrentItem(0);
break;
case R.id.top_change_layout_right:
viewPager.setCurrentItem(1);
break;
}
}
class MyViewPagerAdapter extends FragmentStatePagerAdapter {
Fragment fragment;
private List list;
@Override
public Parcelable saveState() {
return null;
}
public MyViewPagerAdapter(List list, FragmentManager fm) {
super(fm);
this.list = list;
}
@Override
public Fragment getItem(int i) {
if (i==0){
fragment = new ShequZiFragment();
}else{
fragment = new ShequZiXxFragment();
}
Bundle bundle = new Bundle();
bundle.putInt("pageNum", i);
fragment.setArguments(bundle);
return fragment;
}
@Override
public int getCount() {
return list.size();
}
@Override
public CharSequence getPageTitle(int position) {
return list.get(position);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
//设置tablayout 底部下划线的宽
public static void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
try {
Class> tabLayout = tabs.getClass();
Field tabStrip = null;
try {
tabStrip = tabLayout.getDeclaredField("slidingTabIndicator");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
tabStrip.setAccessible(true);
LinearLayout llTab = null;
try {
llTab = (LinearLayout) tabStrip.get(tabs);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());
for (int i = 0; i < llTab.getChildCount(); i++) {
View child = llTab.getChildAt(i);
child.setPadding(0, 0, 0, 0);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
params.leftMargin = left;
params.rightMargin = right;
child.setLayoutParams(params);
child.invalidate();
}
} catch (Exception e) {
}
}