今天上班没啥任务,就写了个小demo玩玩,以前都是用底部导航栏+fragment实现主页,今天想试试类似网易新闻实现滑动页面导航效果,即上面是可以滑动的分类导航卡,下面是根据上面导航卡进行变动的内容显示,效果如下:
首先,我们先来分析一下实现方式:
1.导航卡是TabLayout实现导航卡并可以左右滑动(我们这里实现7个导航卡效果)
2.中间是Viewpager+fragment实现左右滑动
3.中间的ViewPager和顶部的TabLayout要进行联动,即点击导航卡后下面的ViewPager内容跟着变,同理滑动ViewPager后导航卡TabLayout跟着变(TabLayout自带实现)
首先,我们先来进行总布局的xml文件(注意,我们要使用Tablayout需要先使用design包,compile 'com.android.support:design:23.1.1')
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.TabLayout
android:id="@+id/tablayout"
app:tabIndicatorColor="#0000ff"
app:tabIndicatorHeight="1px"
app:tabMode="scrollable"
app:tabGravity="center"
app:tabTextColor="#ff0000"
app:tabSelectedTextColor="#00ff00"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</android.support.v4.view.ViewPager>
</LinearLayout>
LinearLayout布局,方向vertical;其中app:tabIndicatorColor="#0000ff"是设置指示器那个蓝色横条颜色,app:tabIndicatorHeight="1px"是设置横条的高度,app:tabMode="scrollable"是设置为可以滑动,如果不设置这个值,那么就不能滑动,效果就变了(如下),
页面直接显示所有的导航卡并平分,这样效果会导致如果导航卡的文字太多显示不全(我写的是tab01,tab02.。。。。。。结果数字没显示出来,因为空间太小显示不全),所以如果我们导航卡过多,就使用滑动的方式来实现,效果就完美了。
app:tabSelectedTextColor="#ff0000" 设置选中后的字体颜色
app:tabTextColor="#FF000000" 设置导航卡字体的颜色
其他属性都可以根据自己的需求写,我这里就不多说了
然后ViewPager里面包含的fragment的布局,我们只放个textview来显示下是第几页就行了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/fra_tv"
android:padding="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#450000ff"
android:textColor="@android:color/holo_red_light"
android:textSize="18sp"/>
</LinearLayout>
布局我们写完了,现在我们写实现的逻辑
1.我们先写viewpager里面需要的MyFragment
package com.custom.my.tablayout.fragment;
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;
import com.custom.my.tablayout.R;
/**
* Created by Administrator on 2016/3/31.
*/
public class MyFragment extends Fragment {
private TextView content;
private String text;
public MyFragment(String text){ //用于初始化的时候传递一个文字显示在textview中便于知道是第几页,把后面看完就懂了
this.text = text;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return initView(inflater, container);
}
private View initView(LayoutInflater inflater, ViewGroup container) {
View view = inflater.inflate(R.layout.fragment_my,null);
content = (TextView) view.findViewById(R.id.fra_tv);
content.setText(text);
return view;
}
}
package com.custom.my.tablayout.activity;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import com.custom.my.tablayout.R;
import com.custom.my.tablayout.fragment.MyFragment;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TabLayout tabLayout;
private ViewPager viewPager;
private List<String> titles; //七个导航卡
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView(); //加载布局
initData(); //加载数据
}
private void initData() {
titles = Arrays.asList("tab1","tab2","tab3","tab4","tab5","tab6","tab7"); //给七个导航卡取名字
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { //给viewpager绑定内容fragment
@Override
public Fragment getItem(int position) {
return new MyFragment(titles.get(position)); //初始化并将导航卡的名字传过去显示在fragment中
}
@Override
public int getCount() {
return titles.size(); //数量
}
@Override
public CharSequence getPageTitle(int position) { //这个方法是重点!tablayout就是根据这个来绑定导航卡的名字的
return titles.get(position);
}
});
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { //设置联动,点击导航卡后viewpager跟着滑动
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
private void initView() {
tabLayout = (TabLayout) findViewById(R.id.tablayout); //获取tablayout
viewPager = (ViewPager) findViewById(R.id.viewpager); //获取viewpager
}
}
然后运行,完成了,是不是很简单,当然这是使用默认的显示方式,比如我们想让每个导航卡自己来设置样式呢,其实也很简单
首先,我们写个item布局,将item背景设为红色,导航卡名字设为蓝色,然后看是不是我们想要的效果,当然你也可以再放图标之类的
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#ff0000"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tab_tv"
android:padding="5dp"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="#2222ff"/>
</LinearLayout>
package com.custom.my.tablayout.activity;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import com.custom.my.tablayout.R;
import com.custom.my.tablayout.fragment.MyFragment;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TabLayout tabLayout;
private ViewPager viewPager;
private List<String> titles;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
titles = Arrays.asList("tab1","tab2","tab3","tab4","tab5","tab6","tab7");
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
return new MyFragment(titles.get(position));
}
@Override
public int getCount() {
return titles.size();
}
// @Override
// public CharSequence getPageTitle(int position) { //注释掉,因为tablayout导航卡名字是根据这里进行绑定的,现在我们自定义了,不需要了
// return titles.get(position);
// }
});
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
tabLayout.setupWithViewPager(viewPager);
for(int i = 0;i < tabLayout.getTabCount();i++){ //获取七个导航卡并遍历
TabLayout.Tab tab = tabLayout.getTabAt(i);
if(tab != null){
tab.setCustomView(initTabItemView(i)); //将每个导航卡都绑定为我们自己写的布局
}
}
}
private void initView() {
tabLayout = (TabLayout) findViewById(R.id.tablayout);
viewPager = (ViewPager) findViewById(R.id.viewpager);
}
private View initTabItemView(int position){ //获取item的布局,然后将名字放进去
View tabView = LayoutInflater.from(this).inflate(R.layout.tab_item,null);
TextView tv = (TextView) tabView.findViewById(R.id.tab_tv);
tv.setText(titles.get(position));
return tabView;
}
}
然后就完成了
用法大概就是这样,很多细节的地方大家多用用就会了,其实用起来还是很简单的,也很实用