分享

TabLayout+ViewPager+Fragment完成滑动界面

 quasiceo 2016-12-31

目录(?)[+]

从昨天下午就搞把这三种一起组合,然后就写,但就是不行,快疯了,写了一遍又一遍就是不行,如果看到我文件包名时,你就知道我有多气愤了。今天中午吃饭的时候就突然想起是不是布局出了点什么问题。一瞅,之前我按照官网上的说是用一般使用水平布局,一打ViewPager布局就发现这布局的宽度几乎为0dp的,就是一场竖道。我去,然后换成相对布局,就重新调了调,然后就行了,我都快哭了。哭


在文件上是两部分一个是Fragment,另一个就是操作了。


我是新建了两个Fragment这就不全贴出来了,上上篇都说了很简单,Fragment有着和Activity 相似的生命周期。用他进行管理操作很简单和Activity只是创建的方法不同。

创建一个布局进行界面显示。


添加  compile 'com.Android.support:design:23.2.1'  备用

1、创建tab_1.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas./apk/res/android"  
  3.     android:background="#990033"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent">  
  6.   
  7.     <Button  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:textAllCaps="false"  
  11.         android:text="Tab_1_Toast"  
  12.         android:id="@+id/button1_Toast"  
  13.         android:layout_centerVertical="true"  
  14.         android:layout_centerHorizontal="true" />  
  15. </RelativeLayout>  
一个Button而已。

2、然后创建一个管理它的类这个类继承Fragment  (Tab_Fragment_1)

  1. package com.example.hejingzhou.sb;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.annotation.Nullable;  
  5. import android.support.v4.app.Fragment;  
  6. import android.support.v7.widget.LinearLayoutManager;  
  7. import android.support.v7.widget.RecyclerView;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11. import android.widget.Button;  
  12. import android.widget.Toast;  
  13.   
  14. /** 
  15.  * Created by Hejingzhou on 2016/4/9. 
  16.  */  
  17. public class Tab_Fragment_1 extends Fragment {  
  18.   
  19.   
  20.     @Nullable  
  21.     @Override  
  22.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  23.         View viewTab_1 = inflater.inflate(R.layout.tab_1, container, false);  
  24.         Click(viewTab_1);  
  25.         return viewTab_1;  
  26.     }  
  27.   
  28.     private void Click(View view) {  
  29.         Button btnToast_1 = (Button) view.findViewById(R.id.button1_Toast);  
  30.         btnToast_1.setOnClickListener(new View.OnClickListener() {  
  31.             @Override  
  32.             public void onClick(View v) {  
  33.                 Toast.makeText(getActivity(), "第一个界面的Button", Toast.LENGTH_SHORT).show();  
  34.             }  
  35.         });  
  36.     }  
  37.   
  38. }  

这样的一个例子就熟悉了操作过程,和管理过程。

3、接下来我们需要在创建主界面的自动创建的main_activity.xml中添加TabLayout和ViewPaget  TabLayout是由android.support.design.widget包提供。这就是引入compile 'com.android.support:design:23.2.1'的原因了。

  1. package com.example.hejingzhou.sb;  
  2.   
  3.   
  4.   
  5.   
  6. import android.support.annotation.Nullable;  
  7. import android.support.design.widget.TabLayout;  
  8. import android.support.v4.app.Fragment;  
  9. import android.support.v4.app.FragmentManager;  
  10. import android.support.v4.app.FragmentPagerAdapter;  
  11. import android.support.v4.view.PagerAdapter;  
  12. import android.support.v4.view.ViewPager;  
  13. import android.support.v7.app.AppCompatActivity;  
  14. import android.os.Bundle;  
  15. import android.util.Log;  
  16. import android.view.ViewGroup;  
  17. import android.widget.Toast;  
  18.   
  19.   
  20. import java.util.ArrayList;  
  21. import java.util.List;  
  22.   
  23.   
  24. public class MainActivity extends AppCompatActivity {  
  25.     private String TAG = getClass().getSimpleName();  
  26.     private ViewPager viewPager;  
  27.     private TabLayout tabLayout;  
  28.     private List<Fragment> fragmentsList;//fragment容器  
  29.     private List<String> titleList;//标签容器  
  30.   
  31.   
  32.     @Override  
  33.     protected void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.activity_main);  
  36.         load();//加载  
  37.     }  
  38.   
  39.   
  40.     private void load() {  
  41.         tabLayout = (TabLayout) findViewById(R.id.tabLayout);  
  42.         viewPager = (ViewPager) findViewById(R.id.viewPager);  
  43.   
  44.   
  45.         fragmentsList = new ArrayList<>();  
  46.         titleList = new ArrayList<>();  
  47.   
  48.   
  49.         fragmentsList.add(new Tab_Fragment_1());  
  50.         fragmentsList.add(new Tab_Fragment_2());//将fragment添加到fragmentList的list容器里  
  51.         for (int i = 0; i < 3; i++) { //重复添加 只是填充  没什么用  
  52.             fragmentsList.add(new Tab_Fragment_1());  
  53.         }  
  54.         titleList.add("新闻");  
  55.         titleList.add("笑话");  
  56.         titleList.add("段子");  
  57.         titleList.add("视频");  
  58.         titleList.add("图片");  
  59.   
  60.   
  61.         tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);//tab的模式如果标签多的话用MODE_SCROLLABLE  少的话用MODE_FIXED  
  62.         //tabLayout.setBackgroundColor(Color.BLUE);  
  63.   
  64.   
  65.         FragViewAdapter adapter = new FragViewAdapter(getSupportFragmentManager(), fragmentsList, titleList);  
  66.         viewPager.setAdapter(adapter);  
  67.         tabLayout.setupWithViewPager(viewPager);  
  68.         tabLayout.setTabsFromPagerAdapter(adapter);//虽然过时了但是不能去掉,去掉后  
  69.         //如果是滑动操作的话没事,但是使用标签点击的时候就不行了。  
  70.         /** 
  71.          * @deprecated Use {@link #setupWithViewPager(ViewPager)} to link a TabLayout with a ViewPager 
  72.          *             together. When that method is used, the TabLayout will be automatically updated 
  73.          *             when the {@link PagerAdapter} is changed. 
  74.          */  
  75.         /*@Deprecated 
  76.         public void setTabsFromPagerAdapter(@Nullable final PagerAdapter adapter) { 
  77.             setPagerAdapter(adapter, false); 
  78.         }*/  
  79.   
  80.   
  81.         /** 
  82.          * 选择tablayout的监听,一般是用不到的 
  83.          */  
  84.         tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {  
  85.             @Override  
  86.             public void onTabSelected(TabLayout.Tab tab) {  
  87.                 if (tab.getText().equals("新闻")) {  
  88.                     Toast.makeText(getApplicationContext(), "滑动或点击了新闻", Toast.LENGTH_SHORT).show();  
  89.                 }  
  90.                 if (tab.getPosition() == 1) {  
  91.                     Toast.makeText(getApplicationContext(), "滑动或点击了笑话", Toast.LENGTH_SHORT).show();  
  92.                 }  
  93.             }  
  94.   
  95.   
  96.             @Override  
  97.             public void onTabUnselected(TabLayout.Tab tab) {  
  98.                 if (tab.isSelected()) {  
  99.                     Toast.makeText(getApplicationContext(), "切换了Pager", Toast.LENGTH_SHORT).show();  
  100.                 }  
  101.                 Log.i(TAG, "tab.getTag()" + tab.getTag());  
  102.             }  
  103.   
  104.   
  105.             @Override  
  106.             public void onTabReselected(TabLayout.Tab tab) {  
  107.                 //不知道干啥的  
  108.             }  
  109.         });  
  110.     }  
  111.   
  112.   
  113.     /** 
  114.      * 创建适配器,主要是为了fragmet与标题进行匹配的 继承FragmentPagerAdapter 
  115.      */  
  116.     class FragViewAdapter extends FragmentPagerAdapter {  
  117.         List<Fragment> fragmentList_;  
  118.         List<String> titleList_;  
  119.   
  120.   
  121.         public FragViewAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList) {  
  122.             super(fm);  
  123.             fragmentList_ = fragmentList;  
  124.             titleList_ = titleList;  
  125.         }  
  126.   
  127.   
  128.         @Override//fragment匹配  
  129.         public Fragment getItem(int position) {  
  130.             Log.i(TAG, "getItem  " + fragmentList_.get(position));  
  131.             return fragmentList_.get(position);  
  132.         }  
  133.   
  134.   
  135.         @Override//获取fragment的数量  
  136.         public int getCount() {  
  137.             return titleList_.size();  
  138.         }  
  139.   
  140.   
  141.         @Override//对标题进行匹配  
  142.         public CharSequence getPageTitle(int position) {  
  143.             Log.i(TAG, "getPageTitle  " + titleList_.get(position));  
  144.             return titleList_.get(position);  
  145.         }  
  146.   
  147.   
  148.         @Override//销毁 不知道这样做行不行  
  149.         public void destroyItem(ViewGroup container, int position, Object object) {  
  150.             super.destroyItem(container, position, object);  
  151.             fragmentList_.get(position).onDestroy();  
  152.         }  
  153.     }  
  154. }  


把陌生的方法都做注释了,也没啥可说的。

效果:
           

下一步就准备做一个大框架 了,将侧滑菜单导航栏和选项卡和浮动Button与RecyclerView CardView都组合在一起,然后再加上一些免费的额接口我的第一个APP要在毕业前做完。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多