您的位置:首页 > 其它

TabLayout+ViewPager+Fragment完成滑动界面

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


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

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

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

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

1、创建tab_1.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#990033"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Tab_1_Toast"
android:id="@+id/button1_Toast"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
一个Button而已。

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

package com.example.hejingzhou.sb;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

/**
* Created by Hejingzhou on 2016/4/9.
*/
public class Tab_Fragment_1 extends Fragment {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View viewTab_1 = inflater.inflate(R.layout.tab_1, container, false);
Click(viewTab_1);
return viewTab_1;
}

private void Click(View view) {
Button btnToast_1 = (Button) view.findViewById(R.id.button1_Toast);
btnToast_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), "第一个界面的Button", Toast.LENGTH_SHORT).show();
}
});
}

}


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

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

package com.example.hejingzhou.sb;

import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.ViewGroup;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private String TAG = getClass().getSimpleName();
    private ViewPager viewPager;
    private TabLayout tabLayout;
    private List<Fragment> fragmentsList;//fragment容器
    private List<String> titleList;//标签容器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        load();//加载
    }

    private void load() {
        tabLayout = (TabLayout) findViewById(R.id.tabLayout);
        viewPager = (ViewPager) findViewById(R.id.viewPager);

        fragmentsList = new ArrayList<>();
        titleList = new ArrayList<>();

        fragmentsList.add(new Tab_Fragment_1());
        fragmentsList.add(new Tab_Fragment_2());//将fragment添加到fragmentList的list容器里
        for (int i = 0; i < 3; i++) { //重复添加 只是填充  没什么用
            fragmentsList.add(new Tab_Fragment_1());
        }
        titleList.add("新闻");
        titleList.add("笑话");
        titleList.add("段子");
        titleList.add("视频");
        titleList.add("图片");

        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);//tab的模式如果标签多的话用MODE_SCROLLABLE  少的话用MODE_FIXED
        //tabLayout.setBackgroundColor(Color.BLUE);

        FragViewAdapter adapter = new FragViewAdapter(getSupportFragmentManager(), fragmentsList, titleList);
        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.setTabsFromPagerAdapter(adapter);//虽然过时了但是不能去掉,去掉后
        //如果是滑动操作的话没事,但是使用标签点击的时候就不行了。
        /**
         * @deprecated Use {@link #setupWithViewPager(ViewPager)} to link a TabLayout with a ViewPager
         *             together. When that method is used, the TabLayout will be automatically updated
         *             when the {@link PagerAdapter} is changed.
         */
        /*@Deprecated
        public void setTabsFromPagerAdapter(@Nullable final PagerAdapter adapter) {
            setPagerAdapter(adapter, false);
        }*/

        /**
         * 选择tablayout的监听,一般是用不到的
         */
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                if (tab.getText().equals("新闻")) {
                    Toast.makeText(getApplicationContext(), "滑动或点击了新闻", Toast.LENGTH_SHORT).show();
                }
                if (tab.getPosition() == 1) {
                    Toast.makeText(getApplicationContext(), "滑动或点击了笑话", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                if (tab.isSelected()) {
                    Toast.makeText(getApplicationContext(), "切换了Pager", Toast.LENGTH_SHORT).show();
                }
                Log.i(TAG, "tab.getTag()" + tab.getTag());
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                //不知道干啥的
            }
        });
    }

    /**
     * 创建适配器,主要是为了fragmet与标题进行匹配的 继承FragmentPagerAdapter
     */
    class FragViewAdapter extends FragmentPagerAdapter {
        List<Fragment> fragmentList_;
        List<String> titleList_;

        public FragViewAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList) {
            super(fm);
            fragmentList_ = fragmentList;
            titleList_ = titleList;
        }

        @Override//fragment匹配
        public Fragment getItem(int position) {
            Log.i(TAG, "getItem  " + fragmentList_.get(position));
            return fragmentList_.get(position);
        }

        @Override//获取fragment的数量
        public int getCount() {
            return titleList_.size();
        }

        @Override//对标题进行匹配
        public CharSequence getPageTitle(int position) {
            Log.i(TAG, "getPageTitle  " + titleList_.get(position));
            return titleList_.get(position);
        }

        @Override//销毁 不知道这样做行不行
        public void destroyItem(ViewGroup container, int position, Object object) {
            super.destroyItem(container, position, object);
            fragmentList_.get(position).onDestroy();
        }
    }
}


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

效果:





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

源码: http://download.csdn.net/detail/csdnhejingzhou/9485901
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: