1.Fragment的onCreateView()方法里,学习用代码添加布局,控件,及它们的属性设置。
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// LayoutParams相当于一个Layout的信息包,它封装了Layout的位置、高、宽等信息。
FrameLayout.LayoutParams params=new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
// 新建一个布局
FrameLayout f1=new FrameLayout(getActivity());
// 给布局设置参数
f1.setLayoutParams(params);
// TypedValue.applyDimension将数值转换为dp单位等,
// sp也可以TypedValue.COMPLEX_UNIT_SP,后两个参数不变。
final int margin= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,8,getResources().getDisplayMetrics());
// 给参数设置外边距
params.setMargins(margin,margin,margin,margin);
// 新建一个TextView
TextView v=new TextView(getActivity());
// 设置布局参数
v.setLayoutParams(params);
// 设置内容对齐方式
v.setGravity(Gravity.CENTER);
// 设置文本
v.setText("PAGE"+(position+1));
// 布局添加一个控件
f1.addView(v);
return f1;
}
2.Fragment的实例化方法
/**
* 实例化Fragment的方法,可以在新建Fragment对象时,使用Bundle携带数据
*/
public static NewsFragment newInstance(int position){
NewsFragment f=new NewsFragment();
Bundle b=new Bundle();
b.putInt(ARG_POSITION,position);
f.setArguments(b);
return f;
}
/**
* 使用从Bundle回传的数据
*/
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
position=getArguments().getInt(ARG_POSITION);
}
3.定时执行任务,Timer ,Handler,AsyncTask
// 新建Timer对象
Timer timer = new Timer();
// 使用schedule方法定时执行任务
timer.schedule(new TimerTask() {
@Override
public void run() {
//往Handler发送一个消息
Message message = mHandler.obtainMessage();
message.what = UPDATE_WEATHER_CODE;
mHandler.sendMessage(message);
// 这是执行一个AsyncTask去网络获取数据
new RequestNetworkDataTask().execute(httpArg);
}
}, 1000, 60000);
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
// 处理相对应的消息,更新UI
case UPDATE_WEATHER_CODE:
if (isFirst) {
Toast.makeText(WeatherActivity.this, "获取成功", Toast.LENGTH_SHORT).show();
isFirst = false;
} else {
Toast.makeText(WeatherActivity.this, "更新完成", Toast.LENGTH_SHORT).show();
}
break;
}
}
};
4、根据ViewPager的页面数在Tab控制栏,添加布局
/**
* 根据ViewPager的Adapter更新视图
*/
private void notifyDataSetChanged() {
// ViewGroup的方法,移除所有视图
mTabsContainer.removeAllViews();
// 根据ViewPager的Adapter得到页面的数量
tabCount=pager.getAdapter().getCount();
for (int i = 0; i < tabCount; i++) {
// ViewPager的页标题=pager.getAdapter().getPageTitle(i).toString()
addTab(i,pager.getAdapter().getPageTitle(i).toString());
}
}
/**
* 装ViewGroup进入 LinearLayout中
*/
private void addTab(final int position, String title) {
ViewGroup tab= (ViewGroup) mLayoutInflater.inflate(R.layout.category_tab,this,false);
TextView category_text= (TextView) tab.findViewById(R.id.category_text);
category_text.setText(title);
category_text.setGravity(Gravity.CENTER);
category_text.setSingleLine();
category_text.setFocusable(true);
category_text.setTextColor(getResources().getColor(R.color.category_tab_text));
// 给该ViewGroup设置监听器。方法作用,点击该布局,更换下面的ViewPager页面
tab.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//ViewPager方法,根据position设置当前ViewPager的页面
pager.setCurrentItem(position);
}
});
// 将上面的ViewGroup就是tab,装进另一个LinearLayout就是mTabsContainer中
mTabsContainer.addView(tab,position,mDefaultTabLayoutParams);
}
5、ViewPager页面变化监听器
/**
* ViewPager页面变化监听器
*/
private class PageListener implements ViewPager.OnPageChangeListener{
/**
* 当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法会一直得到调用。其中三个参数的含义分别为:
* @param position 当前页面,及你点击滑动的页面
* @param positionOffset 当前页面偏移的百分比
* @param positionOffsetPixels 当前页面偏移的像素位置
*/
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
currentPosition=position;
currentPositionOffset=positionOffset;
scrollToChild(position,(int)(positionOffset* mTabsContainer.getChildAt(position).getWidth()));
invalidate();
}
@Override
public void onPageSelected(int position) {
}
/**
* onPageScrollStateChanged(int state),此方法是在状态改变的时候调用
* 其中state这个参数,有三种状态(0,1,2)。
* state ==1的时辰默示正在滑动,state==2的时辰默示滑动完毕了,state==0的时辰默示什么都没做。
*/
@Override
public void onPageScrollStateChanged(int state) {
if(state == ViewPager.SCROLL_STATE_IDLE){
if(pager.getCurrentItem() == 0){
/**
* HorizontalScrollView的方法
* scrollTo(int x, int y) 是将View中内容滑动到相应的位置,参考的坐标系原点为parent View的左上角。
* 调用scrollTo(100, 0)表示将View中的内容移动到x = 100, y = 0的位置
* 参数1,x轴,参数2,y轴
* scrollBy(int x, int y)其实是对scrollTo的包装,移动的是相对位置。
*/
scrollTo(0,0);
}else if(pager.getCurrentItem() == tabCount-1){
scrollTo(getScrollRange(),0);
}else {
scrollToChild(pager.getCurrentItem(),0);
}
}
}
}