FragmentPagerAdapter+ViewPager 實現TabLayout
FragmentPagerAdapter+ViewPager 實現TabLayout
版權聲明:轉載請保留原文連結及作者 最近剛好在寫UI順便記錄一下 在安卓5.0有新增了
TabLauout但他並不能滿足很多時候想顯示的樣子 所以使用V4下的FragmentPagerAdapter來實現.請記得都要import v4否則會報錯 呈現的效果如下
效果
程式碼
- 程式碼分成四類
FragmentPagerAdapterArrayList<Fragment>()- 初始化三個布局
- 更改點擊的布局屬性
布局XML
- 從上面的效果可以看的出來
- 沒選重的狀況下其他兩個字體大小要一置 選重的要變大
- 下底線要與字體長度一樣
- 程式碼如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="55dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:orientation="horizontal">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/id_tab_trend"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/id_tab_tv_trend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#D6EDC6" />
<ImageView
android:id="@+id/id_tab_trend_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/tabline"
android:layout_gravity="center"
android:layout_marginTop="5dp"/>
</LinearLayout>
<LinearLayout
android:id="@+id/id_tab_surrounding"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/id_tab_tv_sourrounding"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#D6EDC6" />
<ImageView
android:id="@+id/id_tab_surrounding_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/tabline"
android:layout_gravity="center"
android:layout_marginTop="5dp"/>
</LinearLayout>
<LinearLayout
android:id="@+id/id_tab_appliances"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/id_tab_tv_appliances"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#D6EDC6" />
<ImageView
android:id="@+id/id_tab_appliances_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/tabline"
android:layout_gravity="center"
android:layout_marginTop="5dp"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
- 在一個
LinearLayout裡面 再放三個`LinearLayout`` - 按照比例分配`android:layout_weight=“1”``
- 點擊後在程式碼將點擊的
layout_weight改成你要的比例在把字體放大
Fragment``` java
mFragment = new ArrayList
### FragmentPagerAdapter``` java
mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
return mFragment.get(position);
}
@Override
public int getCount() {
return mFragment.size();
}
};
mViewPager.setAdapter(mAdapter);
// Touch Replace the content area
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
int currentItem = mViewPager.getCurrentItem();
setTab(currentItem);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
重置
- 這邊來判斷字的寬度 來依照讀取的寬度來設定線的長度
- 這邊只貼其中一組 textview ImageView 請在自行補上其他的
private void resetColor() {
mTvTrend.setTextColor(getResources().getColor(R.color.tab_not_selectedl_Color));
mTvTrend.setTextSize(NOT_SELECTED);
mTvTrend.setText(one);
mTabTrend.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayoutCompat.LayoutParams.WRAP_CONTENT, 1.0f));
mTabtrendImg.setBackgroundResource(R.drawable.tabline);
mTvTrend.measure(0, 0);
LinearLayout.LayoutParams trend = new LinearLayout.LayoutParams(mTvTrend.getMeasuredWidth(), LinearLayout.LayoutParams.WRAP_CONTENT);
mTabtrendImg.setLayoutParams(trend);
點擊
- 在點擊的時候先呼叫一次
resetColor(); - 在設定布局比例 文字大小
public void onClick(View v) {
switch (v.getId()) {
case R.id.id_tab_trend:
setSelect(0);
break;
public void setSelect(int i) {
resetColor();
switch (i) {
case 0:
mTabTrend.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1.5f));
mTvTrend.setTextColor(getResources().getColor(R.color.tab_selectedl_Color));
mTvTrend.setTextSize(SELECTED);
mTvTrend.setText("O N E");
mTabtrendImg.setBackgroundResource(R.drawable.tablineselect);
mTvTrend.measure(0, 0);
LinearLayout.LayoutParams trend = new LinearLayout.LayoutParams(mTvTrend.getMeasuredWidth(), LinearLayout.LayoutParams.WRAP_CONTENT);
mTabtrendImg.setLayoutParams(trend);
break;
滑動
- 別忘了上面寫的ViewPage事件
public void onPageSelected(int position) {
int currentItem = mViewPager.getCurrentItem();
setTab(currentItem);
}
public void setSelect(int i) {
resetColor();
switch (i) {
case 0:
mTabTrend.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1.5f));
mTvTrend.setTextColor(getResources().getColor(R.color.tab_selectedl_Color));
mTvTrend.setTextSize(SELECTED);
mTvTrend.setText("O N E");
mTabtrendImg.setBackgroundResource(R.drawable.tablineselect);
mTvTrend.measure(0, 0);
LinearLayout.LayoutParams trend = new LinearLayout.LayoutParams(mTvTrend.getMeasuredWidth(), LinearLayout.LayoutParams.WRAP_CONTENT);
mTabtrendImg.setLayoutParams(trend);
break;
結尾
- 程式碼可以在寫一個
class來去放 這樣會比較好維護一點 - 下底線圖片要改成
.9會比較好一點