TabLayout 遇到那些坑 tab标签不显示问题
生活随笔
收集整理的這篇文章主要介紹了
TabLayout 遇到那些坑 tab标签不显示问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
別人寫(xiě)的參考下,知道問(wèn)題所在
如何使用 :注意事項(xiàng)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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.support.design.widget.TabLayoutandroid:id="@+id/tabs"android:layout_width="match_parent"android:layout_height="wrap_content"app:tabIndicatorColor="@color/colorAccent"app:tabSelectedTextColor="@color/colorAccent">
<android.support.design.widget.TabItemandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="android"/>
<android.support.design.widget.TabItemandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="java"/>
<android.support.design.widget.TabItemandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="javascript"/>
<android.support.design.widget.TabItemandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:icon="@drawable/ic_launcher"/></android.support.design.widget.TabLayout>
</RelativeLayout>
java代碼:
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ViewPager viewPager = (ViewPager) findViewById(R.id.vp_pager);MyAdapter myAdapter = new MyAdapter();viewPager.setAdapter(myAdapter);TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));tabLayout.addTab(tabLayout.newTab().setText("Tab 4"));tabLayout.setupWithViewPager(viewPager);}class MyAdapter extends PagerAdapter {@Overridepublic int getCount() {return 4;}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {ImageView imageView = new ImageView(MainActivity.this);imageView.setBackgroundResource(R.drawable.ic_launcher);container.addView(imageView);return imageView;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}}
}
- ?
然而,看到運(yùn)行結(jié)果的我一臉懵逼.?
然后,我又嘗試著注釋掉了這行代碼
tabLayout.setupWithViewPager(viewPager);
- 1
雖然Tab和 ViewPagre 失去了關(guān)聯(lián),但是最起碼按我的想法展示出來(lái)了.
現(xiàn)在已經(jīng)找到了罪魁禍?zhǔn)?就是 tabLayout.setupWithViewPager(viewPager); 搞的鬼,然后我點(diǎn)進(jìn)去查看一下源碼,
/*** The one-stop shop for setting up this {@link TabLayout} with a {@link ViewPager}.** <p>This method will link the given ViewPager and this TabLayout together so that any* changes in one are automatically reflected in the other. This includes adapter changes,* scroll state changes, and clicks. The tabs displayed in this layout will be populated* from the ViewPager adapter's page titles.</p>** <p>After this method is called, you will not need this method again unless you want* to change the linked ViewPager.</p>** <p>If the given ViewPager is non-null, it needs to already have a* {@link PagerAdapter} set.</p>** @param viewPager The ViewPager to link, or {@code null} to clear any previous link.*/public void setupWithViewPager(@Nullable final ViewPager viewPager) {if (mViewPager != null && mPageChangeListener != null) {// If we've already been setup with a ViewPager, remove us from itmViewPager.removeOnPageChangeListener(mPageChangeListener);}if (viewPager != null) {final PagerAdapter adapter = viewPager.getAdapter();if (adapter == null) {throw new IllegalArgumentException("ViewPager does not have a PagerAdapter set");}mViewPager = viewPager;// Add our custom OnPageChangeListener to the ViewPagerif (mPageChangeListener == null) {mPageChangeListener = new TabLayoutOnPageChangeListener(this);}mPageChangeListener.reset();viewPager.addOnPageChangeListener(mPageChangeListener);// Now we'll add a tab selected listener to set ViewPager's current itemsetOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));// Now we'll populate ourselves from the pager adaptersetPagerAdapter(adapter, true);} else {// We've been given a null ViewPager so we need to clear out the internal state,// listeners and observersmViewPager = null;setOnTabSelectedListener(null);setPagerAdapter(null, true);}}貌似沒(méi)神魔問(wèn)題,再看看 setPagerAdapterprivate void setPagerAdapter(@Nullable final PagerAdapter adapter, final boolean addObserver) {if (mPagerAdapter != null && mPagerAdapterObserver != null) {// If we already have a PagerAdapter, unregister our observermPagerAdapter.unregisterDataSetObserver(mPagerAdapterObserver);}mPagerAdapter = adapter;if (addObserver && adapter != null) {// Register our observer on the new adapterif (mPagerAdapterObserver == null) {mPagerAdapterObserver = new PagerAdapterObserver();}adapter.registerDataSetObserver(mPagerAdapterObserver);}// Finally make sure we reflect the new adapterpopulateFromPagerAdapter();}
貌似也沒(méi)什么問(wèn)題啊,此時(shí)我萬(wàn)念俱灰,又抱著一絲希望點(diǎn)開(kāi)看看 populateFromPagerAdapter();
private void populateFromPagerAdapter() {removeAllTabs();if (mPagerAdapter != null) {final int adapterCount = mPagerAdapter.getCount();for (int i = 0; i < adapterCount; i++) {addTab(newTab().setText(mPagerAdapter.getPageTitle(i)), false);}// Make sure we reflect the currently set ViewPager itemif (mViewPager != null && adapterCount > 0) {final int curItem = mViewPager.getCurrentItem();if (curItem != getSelectedTabPosition() && curItem < getTabCount()) {selectTab(getTabAt(curItem));}}} else {removeAllTabs();}}
- ?
找到了,
removeAllTabs();
- 1
就只這行代碼,竟然在這兒 remove 掉了我之前設(shè)置的所有 Tab ,我真是想日了個(gè)狗啊,這在官方文檔上沒(méi)一點(diǎn)提示啊.
然后我又修改了一下代碼(先要修改了調(diào)用tabLayout.setupWithViewPager(viewPager);的順序):
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ViewPager viewPager = (ViewPager) findViewById(R.id.vp_pager);MyAdapter myAdapter = new MyAdapter();viewPager.setAdapter(myAdapter);TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);classifidNewsTabLayout.setupWithViewPager(classifiedNewsViewPager);for (int i=0;i<classifidNewsTabLayout.getTabCount();i++) {classifidNewsTabLayout.getTabAt(i).setText(classifiedNesTitleString[i]);}}class MyAdapter extends PagerAdapter {@Overridepublic int getCount() {return 4;}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {ImageView imageView = new ImageView(MainActivity.this);imageView.setBackgroundResource(R.drawable.ic_launcher);container.addView(imageView);return imageView;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}}
}
- ?
就好了
?
然后就知道為題所在了
圖片上字寫(xiě)錯(cuò)了,不多報(bào)錯(cuò),只會(huì)表示顯示空白.
demo 參考:git地址
總結(jié)
以上是生活随笔為你收集整理的TabLayout 遇到那些坑 tab标签不显示问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: idea 搭建spring boot 项
- 下一篇: 儿童微信网名女孩