麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > Android > 正文

Android底部和標簽導航欄—TabLayout+Fragment

2019-11-09 17:53:10
字體:
來源:轉載
供稿:網友

這里寫圖片描述

介紹

Google官方在2014年Google I/O上推出了全新的設計語言——Material Design。一并推出了一系列實現Material Design效果的控件庫——Android Design Support Library。其中,有TabLayout, NavigationView,Floating labels for editing text,Floating Action Button,Snackbar, CoordinatorLayout, CollapsingToolbarLayout等等控件。在今后的學習中,我將一一介紹它們的特點和用法。 在移動應用中切換不同場景/功能,iOS中以底部三按鈕、四按鈕來實現的,而在Android中,則是抽屜式菜單或左右滑動式設計的。如何實現類似Google Play應用商店式的左右滑動,這就得靠TabLayout來實現了。

基本使用方式

方式一:

1.在布局中加入該控件:

<android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="wrap_content" android:layout_height="wrap_content"/>

2.在代碼中

tabLayout= (TabLayout) findViewById(R.id.tabLayout);tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));

這里寫圖片描述

方式二:

<android.support.design.widget.TabLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><android.support.design.widget.TabItemandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Tab1"/>...</android.support.design.widget.TabLayout>

參數屬性

上面的Tab顏色感覺不好看,打算換換: 1.改變選中于是現在我的Tab變成了這個樣子: 這里寫圖片描述

4.改變TabLayout內部字體大小

總覺得這個字體有點小了,于是想找方法把這個字變得大一點,

好像沒有直接變大的方法,可是找到了這個:

app:tabTextAppearance="@android:style/TextAppearance.Holo.Large"http://設置文字的外貌

效果: 這里寫圖片描述

5.改變指示器下標的高度

既然字體變大了,指示器太小就顯得不太好看了,

設置指示器下標的高度: 效果: 這里寫圖片描述 6.添加圖標

有時候Tab只有文字感覺有點單調了:

tabLayout.addTab(tabLayout.newTab().setText("Tab 1").setIcon(R.m
ipmap.ic_launcher));

這里寫圖片描述 7.Tab的模式

數據很多的時候我們應該怎么辦呢,簡書中的第二個Tab就是可以滑動的:

我們先多加幾個tab:

tabLayout.addTab(tabLayout.newTab().setText("Tab 4"));tabLayout.addTab(tabLayout.newTab().setText("Tab 5"));tabLayout.addTab(tabLayout.newTab().setText("Tab 6"));tabLayout.addTab(tabLayout.newTab().setText("Tab 7"));

然后設置屬性為:

app:tabMode="scrollable"

默認是fixed:固定的,標簽很多時候會被擠壓,不能滑動。 這里寫圖片描述

8.加入Padding

設置Tab內部的子控件的Padding:

app:tabPadding="xxdp"app:tabPaddingTop="xxdp"app:tabPaddingStart="xxdp"app:tabPaddingEnd="xxdp"app:tabPaddingBottom="xxdp"

設置整個TabLayout的Padding:

app:paddingEnd="xxdp"app:paddingStart="xxdp"

9.內容的顯示模式

app:tabGravity="center"http://居中,如果是fill,則是充滿

10.Tab的寬度限制

設置最大的tab寬度:

app:tabMaxWidth="xxdp"

設置最小的tab寬度:

app:tabMinWidth="xxdp"

11.Tab的“Margin”

TabLayout開始位置的偏移量:

app:tabContentStart="100dp"

12.TabLayout的監聽事件

選中了某個tab的監聽事件OnTabSelectedListener():

tabLayout.setOnTabSelectedListener(newTabLayout.OnTabSelectedListener() {@Overridepublic voidonTabSelected(TabLayout.Tab tab) {//選中了tab的邏輯}@Overridepublic voidonTabUnselected(TabLayout.Tab tab) {//未選中tab的邏輯}@Overridepublic voidonTabReselected(TabLayout.Tab tab) {//再次選中tab的邏輯}});

13.和ViewPager的聯動

最后也是最重要的:

tabLayout.setupWithViewPager(Viewpager);

標簽導航欄使用

1.獲得Android Design Support Library庫: 依賴。

'compile 'com.android.support:design:22.2.1'

2.定義布局文件: 通過使用可知,上面那些標簽時通過TabLayout實現,而下面內容的變化則是ViewPager+Fragment實現的。 因此在MainActivity中:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical"> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="scrollable" /> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#ffffff" /></LinearLayout>

Fragment: 切換ViewPager,顯示不同的Fragment,在這里用一個布局相同的Fragment示例。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" /></LinearLayout>

3.具體實現代碼: (1)創建Fragment

public class PageFragment extends Fragment { public static final String ARGS_PAGE = "args_page"; private int mPage; public static PageFragment newInstance(int page) { Bundle args = new Bundle(); args.putInt(ARGS_PAGE, page); PageFragment fragment = new PageFragment(); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPage = getArguments().getInt(ARGS_PAGE); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_page,container,false); TextView textView = (TextView) view.findViewById(R.id.textView); textView.setText("第"+mPage+"頁"); return view; }}

(2)適配器類

class MyFragmentPagerAdapter extends FragmentPagerAdapter { public final int COUNT = 5; private String[] titles = new String[]{"Tab1", "Tab2", "Tab3", "Tab4", "Tab5"}; private Context context; public MyFragmentPagerAdapter(FragmentManager fm, Context context) { super(fm); this.context = context; } @Override public Fragment getItem(int position) { return PageFragment.newInstance(position + 1); } @Override public int getCount() { return COUNT; } @Override public CharSequence getPageTitle(int position) { return titles[position]; }}

(3)TabLayout的使用: 根據官方文檔說明,TabLayout的使用有以下兩種方式:

通過TabLayout的addTab()方法添加新構建的Tab實例到TabLayout中:

TabLayout tabLayout = ...; tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));

2.第二種則是使用ViewPager和TabLayout一站式管理Tab,也就是說不需要像第一種方式那樣手動添加Tab:

ViewPager viewPager = ...; TabLayout tabLayout = ...; viewPager.addOnPageChangeListener(new TabLayoutOnPageChangeListener(tabLayout));

而我們TabLayout的Demo就是用得第二種方式:

//Fragment+ViewPager+FragmentViewPager組合的使用 ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager); MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), this); viewPager.setAdapter(adapter); //TabLayout TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout); tabLayout.setupWithViewPager(viewPager);

這里寫圖片描述 下面就來解釋一下TabGravity和TabMode

TabGravity:放置Tab的Gravity,有GRAVITY_CENTER 和 GRAVITY_FILL兩種效果。顧名思義,一個是居中,另一個是盡可能的填充(注意,GRAVITY_FILL需要和MODE_FIXED一起使用才有效果)

TabMode:布局中Tab的行為模式(behavior mode),有兩種值:MODE_FIXED 和 MODE_SCROLLABLE。

MODE_FIXED:固定tabs,并同時顯示所有的tabs。

MODE_SCROLLABLE:可滾動tabs,顯示一部分tabs,在這個模式下能包含長標簽和大量的tabs,最好用于用戶不需要直接比較tabs。

下面用代碼來比較這兩種模式的不同:

class MyFragmentPagerAdapter extends FragmentPagerAdapter { //tabs的數據集 public final int COUNT = 10; private String[] titles = new String[]{"Tab2221", "T2", "Tb3", "Tab4", "Tab5555555555","Tab2221", "T2", "Tb3", "Tab4", "Tab5555555555"};...} //1.MODE_SCROLLABLE模式 tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); //2.MODE_FIXED模式 tabLayout.setTabMode(TabLayout.MODE_FIXED);

1.MODE_SCROLLABLE模式 這里寫圖片描述 2.MODE_FIXED模式 這里寫圖片描述

案例2:標簽欄

這里寫圖片描述

1. 配置build.gradle

dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' compile 'com.android.support:design:22.2.0' compile 'com.android.support:recyclerview-v7:22.2.0' compile 'com.android.support:cardview-v7:22.2.0'}

com.android.support:design:22.2.0就是我們需要引入的Android Design Support Library,其次我們還引入了Recyclerview和Cardview

2.AppBarLayout,Toolbar與TabLayout 先看看主界面的布局 (activity_tab_layout.xml)

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".TabLayoutActivity" android:orientation="vertical"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabIndicatorColor="#ADBE107E" app:tabMode="scrollable"/> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"/></LinearLayout>

這里用到了AppBarLayout和Toolbar,AppBarLayout是Android Design Support Library新加的控件繼承自LinearLayout,它用來將Toolbar和TabLayout組合起來作為一個整體。 這布局文件最關鍵的一點就是android.support.design.widget.TabLayout 標簽中的app:tabMode=”scrollable”,他設置tab的模式為“可滑動的”,現在我們把這句話去掉,來看看效果: 這里寫圖片描述 上面的tab由于太多(13個)卻不能滑動就重疊了。 接下來在java中引用 (TabLayoutActivity.java)

public class TabLayoutActivity extends AppCompatActivity { private DrawerLayout mDrawerLayout; private ViewPager mViewPager; private TabLayout mTabLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tab_layout); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); mViewPager = (ViewPager) findViewById(R.id.viewpager); initViewPager(); } private void initViewPager() { mTabLayout = (TabLayout) findViewById(R.id.tabs); List<String> titles = new ArrayList<>(); titles.add("精選"); titles.add("體育"); titles.add("巴薩"); titles.add("購物"); titles.add("明星"); titles.add("視頻"); titles.add("健康"); titles.add("勵志"); titles.add("圖文"); titles.add("本地"); titles.add("動漫"); titles.add("搞笑"); titles.add("精選"); for(int i=0;i<titles.size();i++){ mTabLayout.addTab(mTabLayout.newTab().setText(titles.get(i))); } List<Fragment> fragments = new ArrayList<>(); for(int i=0;i<titles.size();i++){ fragments.add(new ListFragment()); } FragmentAdapter mFragmentAdapteradapter = new FragmentAdapter(getSupportFragmentManager(), fragments, titles); //給ViewPager設置適配器 mViewPager.setAdapter(mFragmentAdapteradapter); //將TabLayout和ViewPager關聯起來。 mTabLayout.setupWithViewPager(mViewPager); //給TabLayout設置適配器 mTabLayout.setTabsFromPagerAdapter(mFragmentAdapteradapter); }

在這里我們設定了13個標題內容并創建了相應的TabLayout和Fragment,設置了ViewPager適配器和TabLayout適配器并將將TabLayout和ViewPager關聯起來。 ListFragment的代碼(ListFragment.java)

public class ListFragment extends Fragment { private RecyclerView mRecyclerView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mRecyclerView =(RecyclerView) inflater.inflate(R.layout.list_fragment, container, false); return mRecyclerView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mRecyclerView.setLayoutManager(new LinearLayoutManager(mRecyclerView.getContext())); mRecyclerView.setAdapter(new RecyclerViewAdapter(getActivity())); }}

這里用RecyclerView來代替ListView來看看RecyclerViewAdapter(RecyclerViewAdapter.java)

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { private Context mContext; public RecyclerViewAdapter(Context mContext) { this.mContext = mContext; } @Override public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_card_main, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(final RecyclerViewAdapter.ViewHolder holder, int position) { final View view = holder.mView; view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); } @Override public int getItemCount() { return 10; } public static class ViewHolder extends RecyclerView.ViewHolder { public final View mView; public ViewHolder(View view) { super(view); mView = view; } }}

最后FragmentAdapter(FragmentAdapter.java)

public class FragmentAdapter extends FragmentStatePagerAdapter { private List<Fragment> mFragments; private List<String> mTitles; public FragmentAdapter(FragmentManager fm, List<Fragment> fragments, List<String> titles) { super(fm); mFragments = fragments; mTitles = titles; } @Override public Fragment getItem(int position) { return mFragments.get(position); } @Override public int getCount() { return mFragments.size(); } @Override public CharSequence getPageTitle(int position) { return mTitles.get(position); }}

底部欄實現

這里寫圖片描述

布局 下面我們開始實現底部Tab,layout布局比較簡單,我們只用把TabLayout放置在底部即可

<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/appbar" android:orientation="vertical"> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1.0" android:scrollbars="none" /> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" style="@style/MyCustomTabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>

我定義了一個自定義的style,把tabIndicatorHeight設為0dp

<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout"> <item name="tabMaxWidth">@dimen/tab_max_width</item> <item name="tabIndicatorColor">?attr/colorAccent</item> <item name="tabIndicatorHeight">0dp</item> <item name="tabPaddingStart">12dp</item> <item name="tabPaddingEnd">12dp</item> <item name="tabBackground">@color/tab_bgcolor</item> <item name="tabSelectedTextColor">?android:textColorPrimary</item></style>

我們首先設置好ViewPager,然后設置TabLayout與ViewPager的對應關系,最后最關鍵的是使用TabLayout的setCustomView設置自定義的TAB View。

public class BottomTabActivity extends AppCompatActivity { private ViewPager viewPager; private TabLayout tabLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bottom_tab); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitle(R.string.title_buttom_tab); setSupportActionBar(toolbar); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onBackPressed(); } }); viewPager = (ViewPager)findViewById(R.id.viewPager); tabLayout = (TabLayout) findViewById(R.id.tabLayout); SampleFragmentPagerAdapter pagerAdapter = new SampleFragmentPagerAdapter(getSupportFragmentManager(), this); viewPager.setAdapter(pagerAdapter); tabLayout.setupWithViewPager(viewPager); for (int i = 0; i < tabLayout.getTabCount(); i++) { TabLayout.Tab tab = tabLayout.getTabAt(i); if (tab != null) { tab.setCustomView(pagerAdapter.getTabView(i)); } }// viewPager.setCurrentItem(1); tabLayout.getTabAt(0).getCustomView().setSelected(true); }} public class SampleFragmentPagerAdapter extends FragmentPagerAdapter { final int PAGE_COUNT = 3; private String tabTitles[] = new String[]{"TAB1","TAB2","TAB3"}; private Context context; public View getTabView(int position) { View v = LayoutInflater.from(context).inflate(R.layout.custom_tab, null); TextView tv = (TextView) v.findViewById(R.id.news_title); tv.setText(tabTitles[position]); ImageView img = (ImageView) v.findViewById(R.id.imageView); //img.setImageResource(imageResId[position]); return v; } public SampleFragmentPagerAdapter(FragmentManager fm, Context context) { super(fm); this.context = context; } @Override public int getCount() { return PAGE_COUNT; } @Override public Fragment getItem(int position) { return PageFragment.newInstance(position + 1); } @Override public CharSequence getPageTitle(int position) { return tabTitles[position]; } } public static class PageFragment extends Fragment { public static final String ARG_PAGE = "ARG_PAGE"; private int mPage; public static PageFragment newInstance(int page) { Bundle args = new Bundle(); args.putInt(ARG_PAGE, page); PageFragment fragment = new PageFragment(); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPage = getArguments().getInt(ARG_PAGE); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_page, container, false); TextView textView = (TextView) view; textView.setText("Fragment #" + mPage); return view; } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美日韩视频在线播放 | 黄色羞羞视频在线观看 | 成人免费久久网 | 免费观看国产精品视频 | 蜜桃网站在线 | 欧美成人免费电影 | 亚洲一区二区三区精品在线观看 | 久草在线资源福利站 | 色视频在线播放 | 日本黄色一级视频 | 激情小说激情电影 | 羞羞漫画无遮挡观看 | free国产hd老熟bbw | 十级毛片 | 久久国产乱子伦精品 | 999久久久精品 | 在线播放中文 | 亚洲国产高清视频 | 久久我不卡 | 涩涩操| 免费a级毛片永久免费 | 欧美综合日韩 | 九九热视频免费 | 国产一区二区免费 | 久久久久久亚洲综合影院红桃 | 久久国产精品久久久久 | 全黄性性激高免费视频 | 国产一级一片免费播放 | 精品一区二区三区电影 | vidz 98hd| 欧美一级电影网站 | 国产va在线观看 | 91中文字幕在线观看 | 国产精品一区视频 | 亚洲第一页综合 | 成人综合免费视频 | 成人免费在线观看视频 | 日日艹夜夜艹 | 欧美精品久久久久久久久久 | 在线播放中文 | 亚州精品国产 |