TabLayout是2015发布在Design Support Library中的一个组件。
最近用TabLayout进行代码布局的时候发现一个不大不小的问题。
首先介绍如何对TabLayout进行代码布局:
首先要有一个FragmentActivity:
package com.example.testapp;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
/**
* Created by SXT on 2016/3/25.
*/
public class TabViewPager4 extends FragmentActivity{
private SimpleFragmentAdapter pagerAdapter;
private ViewPager viewPager;
private TabLayout tabLayout;
private LinearLayout linearLayout;
private Context mContext;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mContext = this;
linearLayout = new LinearLayout(mContext);
linearLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
linearLayout.setOrientation(LinearLayout.VERTICAL);
tabLayout = new TabLayout(mContext);
tabLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
viewPager = new ViewPager(this);
viewPager.setId(View.generateViewId());
//1.0f weight
viewPager.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1.0f));
viewPager.setBackgroundColor(Color.WHITE);
linearLayout.addView(tabLayout);
linearLayout.addView(viewPager);
pagerAdapter = new SimpleFragmentAdapter(getSupportFragmentManager(), this);
viewPager.setAdapter(pagerAdapter);
tabLayout.setupWithViewPager(viewPager);
// tabLayout.post(new Runnable() {
// @Override
// public void run() {
// tabLayout.setupWithViewPager(viewPager);
// }
// });
tabLayout.setSelectedTabIndicatorColor(Color.BLUE);//tabLayout标签条颜色
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);//tabLayout对齐方式,必须将tabMode设置为MODE_FIXED才有效
tabLayout.setTabMode(TabLayout.MODE_FIXED);//有两种模式,MODE_FIXED表示固定tabs,并同时显示所有的tabs。
//MODE_SCROLLABLE:可滚动tabs,显示一部分tabs,在这个模式下能包含长标签和大量的tabs,最好用于用户不需要直接比较tabs。
setContentView(linearLayout);
}
}
FragmentPagerAdapter:
package com.example.testapp;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
/**
* Created by SXT on 2016/3/25.
*/
public class SimpleFragmentAdapter extends FragmentPagerAdapter {
final int PAGE_COUNT = 3;
private String tabTitles[] = new String[]{"tab1","tab2","tab3"};
private Context mContext;
public SimpleFragmentAdapter(FragmentManager fm, Context context) {
super(fm);
this.mContext = context;
}
@Override
public Fragment getItem(int position) {
return PageFragment4.newInstance(position + 1,mContext);
}
@Override
public int getCount() {
return PAGE_COUNT;
}
@Override
public CharSequence getPageTitle(int position) {
return tabTitles[position];
}
}
Fragment:
package com.example.testapp;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
* Created by SXT on 2016/3/25.
*/
public class PageFragment4 extends Fragment {
private static final String ARG_PAGE = "ARG_PAGE";
private static Context mContext = null;
private int mPage;
public static PageFragment4 newInstance(int page, Context context){
mContext = context;
Bundle args = new Bundle();
args.putInt(ARG_PAGE, page);
PageFragment4 pageFragment = new PageFragment4();
pageFragment.setArguments(args);
return pageFragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPage = getArguments().getInt(ARG_PAGE);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
/
LinearLayout linearLayout = new LinearLayout(mContext);
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
linearLayout.setOrientation(LinearLayout.VERTICAL);
TextView textView = new TextView(mContext);
textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
textView.setGravity(Gravity.CENTER);
textView.setText("Fragment #" + mPage);
linearLayout.addView(textView);
return linearLayout;
}
}
完全没有涉及到Xml文件布局,但是在使用代码布局中有一个需要注意的地方,在FragmentActivity中,必须要为viewPager.setId(View.generateViewId());如果没有这句代码那么每个Tab间移动的时候非常缓慢,而且不显示Viewpager中的内容。
另外,在为viewpager setId的时候,如果setId的参数是除零以外的其他数,则会报错(android studio会报错,eclipse不会)。据说这是因为防止Id冲突。为了解决这个问题,有两种方法:
一、使用上述viewPager.setId(View.generateViewId());的方法
二、新建一个id.xml存放id值,用R.id获取