fragmentPagerAdapter碎片适配器的使用,可以滚动的标题栏

功能:模拟QQ浏览器的标题头,可以滑动,代码如下:

知识点:fragmentPagerAdapter的使用,注意ViewPager和Fragment都必须为v4下的包,否则会出错
关键点:
1.通过xml文件来控制textView的字体颜色
2.对标题栏划出屏幕的处理

 动态创建标题头的方法

LayoutParams params=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);//包裹内容
params.rightMargin=15;//右边距        //动态添加textview时参数的设置
ColorStateList colors = getResources().getColorStateList(R.drawable.title_color);
tv.setTextColor(colors); //选择器的添加
tv.setLayoutParams(params);
tv.setGravity(Gravity.CENTER_VERTICAL);//垂直居中

MainActivity.java                 位置的计算图解见下面

import java.util.ArrayList;
import android.os.Bundle;
import android.content.res.ColorStateList;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
思路:
1.初始化控件
2.根据标题的数量初始化titleTab
    1.设置标题文本
    2.设置颜色
    3.动态添加到线性布局
    4.添加到集合方便管理
3.初始fragment,填充到viewpager
    1.初始fragment,传入标题
    2.放到集合
    3.实现viewpageradapter
    4.设置适配器
4.给titletab设置点击事件,
    1.点击后viewpager跳转到相应的页面,
    2.标题的状态随着改变
5.左右切换fragment监听
    1.让与当前选中的fragment对应的titletab变成选中状态
    2.滚动到屏幕里面来
 */
public class MainActivity extends FragmentActivity {
    
    private String[] titles=new String[]{"推荐", "热点", "北京", "视频", "社会",
            "订阅", "图片", "娱乐", "科技", "汽车", "体育", "财经", "军事", "国际", "段子", "趣图"};
    /**
     * 装标题栏的滑动组件,通过该控件来控制textview的位置
     */
    private HorizontalScrollView titlesGroup;
    /**
     * 装标题,通过该布局对象来获取子控件
     */
    private LinearLayout titleLayout;
    private ViewPager viewPager;
    /**
     * 装fragment的集合
     */
    private ArrayList<Fragment> list;
    /**
     * 记录当前选中的textView标题
     */
    private int currentTextView=0;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        titlesGroup = (HorizontalScrollView) findViewById(R.id.titlesGroup);
        titleLayout = (LinearLayout) findViewById(R.id.titleParent);
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        initData();
        //为视图页设置适配器
        viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
        
        //第一次启动程序的设置
        titleLayout.getChildAt(0).setEnabled(false);
    
        //为ViewPager设置监听事件
        viewPager.setOnPageChangeListener(new OnPageChangeListener() {
            
            @Override
            public void onPageSelected(int position) {
                titleLayout.getChildAt(position).setEnabled(false);
                //改变上一次点击的TextView的状态
                titleLayout.getChildAt(currentTextView).setEnabled(true);
                currentTextView=position;//更改标记
                //改变选中的TextView的位置
                changePosition(position);
            }
            /**
             * 作用:让超出屏幕的标题显示到手机中间位置
             * 改变TextView的位置,避免当前选中的textView显示到屏幕外
             */
            private void changePosition(int position) {
                //得到需要改变位置的标题(滚动到屏幕中间)
                TextView tv=(TextView) titleLayout.getChildAt(position);
                //获取屏幕一半的宽度
                int screenWidth = (getResources().getDisplayMetrics().widthPixels)/2;
                int tvWidth=tv.getWidth()/2;//控件一半的宽度
                //获得该控件与父控件左边缘的距离
                int leftMarg = tv.getLeft();
                int dx=leftMarg-(screenWidth-tvWidth);
                titlesGroup.smoothScrollTo(dx, 0);//缓和的移动到这个位置
            }

            @Override
            public void onPageScrolled(int position, float positionOffset,
                    int positionOffsetPixels) {
                
            }
            
            @Override
            public void onPageScrollStateChanged(int state) {
                
            }
        });
        
    }
    
    /**
     * 将创建的fragment填充给ViewPager
     */
    class MyAdapter extends FragmentPagerAdapter{

        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return list.size();//确定ViewPager显示的碎片个数
        }

        @Override
        public Fragment getItem(int position) {
            return list.get(position);
        }
        
    }
    
    /**
     * 初始化数据(标题栏条目与Fragment)
     */
    private void initData() {
        list=new ArrayList<Fragment>();
        for (int i = 0; i < titles.length; i++) {
            TextView tv=new TextView(MainActivity.this);
            tv.setText(titles[i]);
            tv.setTextSize(25);
            tv.setBackgroundResource(R.drawable.title_bgimg);
            tv.setClickable(true);//设置为可点击
            //根据enbled属性改变文本颜色
            ColorStateList colorStateList = getResources().getColorStateList(R.drawable.title_color);
            tv.setTextColor(colorStateList);
            tv.setTag(i);//为该文本设置标记,好确认点击的是哪个textView
            tv.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    int tag=(Integer) v.getTag();//获取该TextView的标记
                    //改变ViewPager显示的页面,该方法执行后会执行viewPager的监听事件
                    viewPager.setCurrentItem(tag);//setCurrentItem(tag,false),这样就是直接跳转到tag这页.不会经过中间页
                }//默认第二个参数为true,假设当前显示的第一页,当你点击显示第四页的标题头时2,这样viewPager会经过第二页和第三页
            });
            titleLayout.addView(tv);//将创建的标题添加到横向滚动条里
            initFragment(titles[i]);//创建该标签下的fragment
        }
    }
    /**
     * 初始化fragment
     * @param i为对应的标题的索引,这里将标题名做为数据给碎片显示
     */
    private void initFragment(String title) {
        MyFragment fragment=new MyFragment();
        Bundle bundle=new Bundle();
        bundle.putString("value", title);
        fragment.setArguments(bundle);
        list.add(fragment);//将创建的碎片添加到集合
    }
    
    
}

MyFragment.java  注意继承的v4包下的

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyFragment extends Fragment{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_layout, null);
        TextView textView=(TextView) view.findViewById(R.id.textView);
        //获取activity传过来的数据
        String value = getArguments().getString("value");
        textView.setText(value);
        return view;
    }
}

主布局 activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
<!--HorizontalScrollView只能有一个子条目,所以需要放一个布局  -->
   <HorizontalScrollView 
       android:id="@+id/titlesGroup"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:scrollbars="none">
       
       <!-- 用来存放标题头 -->
       <LinearLayout 
           android:id="@+id/titleParent"
           android:layout_width="match_parent"
           android:gravity="center"
           android:layout_height="wrap_content"
           android:orientation="horizontal">
       
   </LinearLayout>
   </HorizontalScrollView>
   
   <View 
       android:layout_width="match_parent"
       android:layout_height="2dp"
       android:background="#000000"/>
   
    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

碎片显示的布局文件fragment_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:background="#ffcccc">
    
    <TextView 
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textSize="40sp"
        android:textColor="#000000"/>

</RelativeLayout>

标题栏的字体和背景图片的设置:res/drawable下

title_bgimg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
   <!-- 一张为白色的图片,一张为底部为蓝色线条的图片 -->
    <item android:state_enabled="true" android:drawable="@drawable/bg_normal"></item>
    <item android:state_enabled="false" android:drawable="@drawable/bg_tab"></item>
</selector>

title_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 设置文字的颜色  当设置为false后,该文本再次点击将无效果,默认为true       灰色-->
    <item android:state_enabled="false" android:color="#000000"/>
    <item android:state_enabled="true" android:color="#82858b"></item>
</selector>

效果图:和位置的计算方式

 

posted @ 2016-08-18 21:11  ts-android  阅读(1109)  评论(0编辑  收藏  举报