2015-11-10 82 views
4

我有一個選項卡視圖設置,它具有使用viewpager每個選項卡的自定義片段。這是我的代碼:Android的TabLayout ViewPager不充氣在背後的標籤片段

控股片段

public class FragInboxMainView extends Fragment implements CGFragment { 
    private CGController controller; 
    private CGFragment thisFragment; 

    @Bind(R.id.inboxViewPager)ViewPager inboxViewPager; 
    @Bind(R.id.inboxTabs)TabLayout inboxTabLayout; 
    @Bind(R.id.inbox_progress_wheel)ProgressWheel inboxProgressWheel; 

    public FragInboxMainView(){} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_inbox_mainview, container, false); 
     ButterKnife.bind(this, rootView); 
     thisFragment = this; 
     Globals g = Globals.getInstance(); 
     /** Show loading spinner */ 
     this.inboxProgressWheel.setBarColor(ContextCompat.getColor(controller.getContext(), g.getUserObject().getUserThemeColor())); 
     this.inboxProgressWheel.setVisibility(View.VISIBLE); 
     /** Display the profile information based off the ID */ 
     controller.displayInbox(thisFragment); 

     return rootView; 
    } 


    public void hideProgressSpinner() { 
     this.inboxProgressWheel.setVisibility(View.GONE); 
    } 


    public ViewPager getInboxViewPager() { 
     return this.inboxViewPager; 
    } 

    public TabLayout getInboxTabLayout() { 
     return this.inboxTabLayout; 
    } 
} 

其佈局文件

<?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" 
       xmlns:wheel="http://schemas.android.com/apk/res-auto" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical"> 
    <android.support.design.widget.TabLayout 
     android:id="@+id/inboxTabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:tabMode="scrollable" /> 
    <com.pnikosis.materialishprogress.ProgressWheel 
     android:id="@+id/inbox_progress_wheel" 
     android:layout_width="80dp" 
     android:layout_height="80dp" 
     android:layout_gravity="center" 
     wheel:matProg_barColor="#5588FF" 
     wheel:matProg_progressIndeterminate="true" 
     android:visibility="gone"/> 


    <android.support.v4.view.ViewPager 
     android:id="@+id/inboxViewPager" 
     android:layout_width="match_parent" 
     android:layout_height="0px" 
     android:layout_weight="1" 
     android:background="@android:color/white" /> 
</LinearLayout> 

標籤片段和通脹文件

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    android:id="@+id/main_content" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.baoyz.widget.PullRefreshLayout 
     android:id="@+id/tabPullRefresh" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    <view 
     android:id="@+id/tabRecyclerHolder" 
     class="android.support.v7.widget.RecyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingTop="8dp" 
     android:paddingBottom="8dp" 
     android:clipToPadding="false" 
     android:layout_centerInParent="true"/> 

    </com.baoyz.widget.PullRefreshLayout> 
    <com.melnykov.fab.FloatingActionButton 
     android:id="@+id/tabFab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|right" 
     android:layout_margin="16dp" 
     android:src="@mipmap/ic_add_white"/> 
</android.support.design.widget.CoordinatorLayout> 

public class TabRecyclerHolder extends Fragment { 

    @Bind(R.id.tabRecyclerHolder) RecyclerView tabRecyclerHolder; 
    @Bind(R.id.tabPullRefresh) PullRefreshLayout tabPullRefresh; 
    @Bind(R.id.tabFab) FloatingActionButton recyclerFab; 

    private String tabTitle = "Title"; 


    public TabRecyclerHolder(){} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.tab_recycler_holder, container, false); 

     ButterKnife.bind(this, rootView); 

     recyclerFab.hide(false); 

     tabPullRefresh.setRefreshStyle(PullRefreshLayout.STYLE_MATERIAL); 

     return rootView; 
    } 

    public RecyclerView getTabRecyclerHolder() { 
     return this.tabRecyclerHolder; 
    } 

    public FloatingActionButton getRecyclerFab() { 
     return this.recyclerFab; 
    } 

    public String getTabTitle() { 
     return this.tabTitle; 
    } 

    public void setTabTitle(String title) { 
     this.tabTitle = title; 
    } 

    public PullRefreshLayout getTabPullRefresh() { 
     return this.tabPullRefresh; 
    } 
} 

我的標籤適配器

public class TabPagerAdapter extends FragmentStatePagerAdapter { 

    private CGController controller; 
    private List<Object> items; 

    public TabPagerAdapter(FragmentManager fm, CGController controller, List<Object> items) { 
     super(fm); 
     this.controller = controller; 
     this.items = items; 
    } 

    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    @Override 
    public Fragment getItem(int num) { 
     return (TabRecyclerHolder)items.get(num); 
    } 

    @Override 
    public String getPageTitle(int num){ 
     return ((TabRecyclerHolder)items.get(num)).getTabTitle(); 
    } 
} 

處理代碼

public void viewInbox() { 
    /** Set up the views */ 
    receivedHolder = new TabRecyclerHolder(); 
    receivedHolder.setTabTitle(Constants.TAB_INBOX_RECEIVED); 
    sentHolder = new TabRecyclerHolder(); 
    sentHolder.setTabTitle(Constants.TAB_INBOX_SENT); 

    tabs.add(receivedHolder); 
    tabs.add(sentHolder); 

    /** Set up the tabs */ 
    final ViewPager inboxViewPager = inboxFragment.getInboxViewPager(); 
    TabLayout inboxTabLayout = inboxFragment.getInboxTabLayout(); 

    /** Set the adapter for the view pager */ 
    inboxViewPager.setAdapter(new TabPagerAdapter(inboxFragment.getChildFragmentManager(), controller, tabs)); 
    /** set up the tab look and feel */ 
    inboxTabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
    inboxTabLayout.setTabMode(TabLayout.MODE_FIXED); 

    inboxViewPager.setOffscreenPageLimit(3); 
    inboxViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(inboxTabLayout)); 
    inboxTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      inboxViewPager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }); 

    /** And, display! */ 
    inboxTabLayout.setupWithViewPager(inboxViewPager); 

    receivedAdapter = new RecyclerListAdapter(controller, items); 
    final RecyclerView receivedList = receivedHolder.getTabRecyclerHolder(); 
    receivedList.setLayoutManager(new LinearLayoutManager(controller.getContext())); 
    receivedList.setAdapter(receivedAdapter); 
} 

有一些代碼,我已經錯過了,但它不是pertanent的問題。 最初查看片段時,代碼完美工作。然而,由於我的應用程序包含一個單獨的活動,並且僅替換了導航到的每個片段的內容視圖,因此每個片段都會添加到後退堆棧中,然後在按下後退按鈕時彈出。我的問題是,當導航回到這個片段時,選項卡中的視圖沒有被誇大,這意味着沒有元素可以被訪問(並且因此應用程序在試圖在回收視圖中顯示數據時崩潰)。

我看過這個問題:TabLayout ViewPager Not Loading When Using Backstack並實現了它的建議(在設置尋呼機適配器時使用getChildFragmentManager())但是這並沒有解決我的問題。

幫助,將不勝感激!

+0

顯示java.lang.NullPointerException時試圖訪問應該在內部膨脹的元素該標籤。如果我刪除任何試圖訪問內部片段的代碼,並讓它在不崩潰的情況下顯示,則它在標籤內沒有任何顯示。 – CynePhoba12

+0

http://pastebin.com/ECKF8VKg 片段顯示並顯示加載微調器,但是當應用程序下載了所有數據並嘗試告訴微調器隱藏它時找不到它。 – CynePhoba12

+0

我刪除了我的評論,以免混淆您的問題。嘗試記錄viewInbox()方法,並確保在重新創建片段時調用它。 – Luksprog

回答

0

更改此public View onCreateView(LayoutInflater inflater,...public void onViewCreated (View view, Bundle savedInstanceState)

所以你將有這樣的事情

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) {   
    return inflater.inflate(R.layout.tab_recycler_holder, container, false); 
} 

然後

@Override 
public void onViewCreated (View view, Bundle savedInstanceState){ 
    ButterKnife.bind(this, view); 
    recyclerFab.hide(false); 
    tabPullRefresh.setRefreshStyle(PullRefreshLayout.STYLE_MATERIAL); 
    ... 

看看是否有幫助

+0

不幸的是=( – CynePhoba12