制作如图的界面
1、 在layout中 添加 Tablayout 和 ViewPager
<android.support.design.widget.TabLayout android:id="@+id/tablayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/base_titlebar_bg" app:tabIndicatorColor="#ff0000" app:tabIndicatorHeight="3dp" app:tabMode="fixed" app:tabSelectedTextColor="#ff0000" app:tabTextColor="#00ff00"/> <android.support.v4.view.ViewPager android:id="@+id/vp_content" android:layout_width="match_parent" android:layout_height="match_parent"/>2、创建 Fragment
mListFragment = new ArrayList<>(); mListFragment.add(new VedioListFragment("视频")); mListFragment.add(new BaseFragment("音乐"));
3、创建 fragmentManager
注意:必须是getSupportFragmentManager()
mFragmentManager = getSupportFragmentManager(); mFragmentPagerAdapter = new MyFragmentPagerAdapter(mFragmentManager);4、给viewPager 添加 FragmentAdapter
vpContent.setAdapter(mFragmentPagerAdapter);5、将tablayout 和 viewPager 关联起来
注意:必须设置 两个 一个viewpager 另外一个 viewPagerAdapter
tablayout.setupWithViewPager(vpContent); tablayout.setTabsFromPagerAdapter(mFragmentPagerAdapter);
6、viewPagerAdapter
注意:1 、必须 复写 public CharSequence getPageTitle(int position);方法 以便Tablayout 获取 标题
2、@Override
public boolean isViewFromObject(View view, Object object) { return view == object; }这个方法不能复写 否则有可能 显示Fragment 的内容 不正常(无法显示内容)
说起来全是泪 啊!我搞了一下午才发现这个问题! 到现在也不太明白!!!!!!!!!!
public class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm ) { super(fm); } @Override public int getCount() { return mListFragment.size(); } @Override public Fragment getItem(int position) { return mListFragment.get(position); } /* @Override public boolean isViewFromObject(View view, Object object) { return view == object; } */ @Override public CharSequence getPageTitle(int position) { return mListFragment.get(position).getTitle(); } }
以上fragment fragmentManager viewPager FragmentPagerAdapter 都是support v4 包中的
还有activity 要继承AppCompatActivity 因为support design 还是 要support v7 包对他的支持
public class GuideActivity extends AppCompatActivity
还有一个问题就是tablayout 是support design 中的类 使用起来还是 有一些莫名的错误
我遇到的问题:
.NoClassDefFoundError: android.support.v7.internal.widget.TintManager
以运行就包上面的错误,也不知道什么问题,搞了很长时间,网上所导入的包又能不是同一个版本照成的 如下
比如都才用的 23.1.0 版本的 如果不是同一版本 有可能产生莫名的异常,所以尽量让他们版本一致!!!!!!
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile files('libs/butterknife-6.0.0.jar') compile 'com.android.support:support-v4:23.1.0' compile 'com.android.support:appcompat-v7:23.1.0' compile 'com.android.support:design:23.1.0' compile project(':vitamiolibrary') compile project(':splashandguidlelibrary') }
但是我一致了,还是没有解决上面的 异常!!!!!!!!
我还是不明白,那么我就把
compile 'com.android.support:support-v4:23.1.0'
给去掉了,奇迹发生了尽然 可以了显示正常了!!!!!!!!!!!
但是然后我又将 它 添加回去 再次编译一下,结果也不会产生那个异常了,真是很奇怪!!
再提下Fragement的小 知识 : onCreateView 只是必须重写的方法
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
可以有很多种方式
1方式、 返回一个 textview 在 fragment中间显示一个 哈哈哈
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { TextView textView = new TextView(getContext()); textView.setText(title+ "哈哈哈 "); textView.setTextSize(30); textView.setGravity(Gravity.CENTER); container.addView(textView); // 这句也可以不加 return textView ; }
第2种方式 :
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = View.inflate(getActivity(),R.layout.item_layout,null); return view ; }
第3种方式:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.item_layout,container,false); return view ; }第一个参数 被填充的布局文件 view的父控件 主要用来获取一些 布局参数 第三个参数 是否自动添加到父控件上(一般我们都是手动添加所以 一般设为false) 通常都是false
如果 改为true
爆出了 java.lang.StackOverflowError 异常