代码学习

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);
                }
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值