1

我正在使用FragmentPagerAdapter創建3頁的viewpager,直到我升級到sdk 23,它工作正常。我正在使用一個片段並根據getItem(位置)發送不同的參數來填充不同的數據。升級後,Android無法確認其中一個頁面,我必須找到位置2(頁面3),然後滑回位置0(頁面1),然後Android使用正確的數據填充頁面。通過調試器運行確認Android在TabAdapter.java的getItem函數中跳過了第二種情況。我也得到 W/FragmentManager: moveToState: Fragment state for TabContentFragment{3ac2d125 #3 id=0x7f0f0097} not updated inline; expected state 3 found 2。我一直在使用this similar question as reference,但仍然無法實現,但我將問題轉移到了我正在使用的FragmentManager上。但隨着它搞亂了幾個小時後,我一直沒能得到Android的看到,有3頁不2.FragmentManager在從Android SDK 22更新到23之後出現錯誤

TabAdapter.java

import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

import com.movies.R; 
import com.movies.date.LiveStatus; 
import com.movies.fragments.TabContentFragment; 
import com.movies.fragments.TabFragment; 
import com.movies.utils.BundleKeys; 

public class TabAdapter extends FragmentPagerAdapter { 

private Context context; 

public TabAdapter(FragmentManager fm, Context context) { 
    super(fm); 
    this.context = context; 
} 

/** 
* Return fragment with respect to Position . 
*/ 

@Override 
public Fragment getItem(int position) { 
    TabContentFragment fragment = new TabContentFragment(); 
    Bundle args = new Bundle(); 
    switch (position){ 
     case 0: 
      args.putInt(BundleKeys.STATE_KEY, LiveStatus.EVENT_STARTED); 
      break; 
     case 1: 
      args.putInt(BundleKeys.STATE_KEY, LiveStatus.EVENT_NOT_STARTED); 
      break; 
     case 2: 
      args.putInt(BundleKeys.STATE_KEY, LiveStatus.EVENT_OVER); 
      break; 
    } 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public int getCount() { 
    return TabFragment.MAX_TABS; 
} 

/** 
* This method returns the title of the tab according to the position. 
*/ 

@Override 
public CharSequence getPageTitle(int position) { 

    switch (position) { 
     case 0: 
      return this.context.getString(R.string.tab_title_live); 
     case 1: 
      return this.context.getString(R.string.tab_title_upcoming); 
     case 2: 
      return this.context.getString(R.string.tab_title_replay); 
     default: 
      return null; 
     } 
    } 
} 

數據從包拉這樣

this.state = getArguments().getInt(BundleKeys.STATE_KEY); 
持有的TabFragment

TabFragment.java

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.design.widget.TabLayout; 
import android.support.v4.app.Fragment; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import com.movies.R; 
import com.movies.adapters.TabAdapter; 

public class TabFragment extends Fragment { 

public static final int MAX_TABS = 3; 
public static TabLayout tabLayout; 
public static ViewPager viewPager; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    /** 
    * Inflate tab_layout and setup Views. 
    */ 
    View view = inflater.inflate(R.layout.tab_layout, null); 
    tabLayout = (TabLayout) view.findViewById(R.id.tabs); 
    viewPager = (ViewPager) view.findViewById(R.id.event_info_viewpager); 

    /** 
    * Set an Adapter for the View Pager 
    */ 
    viewPager.setAdapter(new TabAdapter(getFragmentManager(), getContext())); 

    /** 
    * Now , this is a workaround , 
    * The setupWithViewPager doesn't works without the runnable . 
    * Maybe a Support Library Bug . 
    */ 

    tabLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      tabLayout.setupWithViewPager(viewPager); 
     } 
    }); 
    return view; 
    } 
} 

活動開始fragm耳鼻喉科是這樣的:

mFragmentManager = getSupportFragmentManager(); 
    mFragmentTransaction = mFragmentManager.beginTransaction(); 
    mFragmentTransaction.replace(R.id.container_view, new TabFragment()).commit(); 

回答

1

我不知道如果我正確或不理解你的問題,但要等到瀏覽到它,它的聲音,我喜歡你的最後一個(第三)標籤沒有被創建。

默認情況下,ViewPager限於僅創建2個屏幕外視圖(左邊一個和右邊一個)。通常情況下,應用程序從最左側的標籤開始,也就是說,如果您總共有3個應用程序,則最靠右的標籤纔會被創建,直到您靠近它爲止。

您可以使用ViewPager.setOffScreenPageLimit(#)在您的MainActivity中覆蓋此值,其中ViewPager實際上是您的ViewPager的名稱,#是您希望從頭開始創建的選項卡數。在你的情況下,它聽起來像你想這個數字是2.

+0

當應用程序啓動它從第1頁開始,但應該在其上的信息不存在,但如果我一直滑動到右側(最後一頁)顯示最後一頁的信息,然後當我滾動回頁面1時,第1頁的信息出現。這不是一個網絡延遲sorta的事情,因爲我會離開第1頁的應用程序5分鐘,什麼也沒有發生,然後一旦我去到第3頁,然後返回到第1頁 –

+0

如果你可以顯示特定片段的代碼控制器我可以看看它。你在第一個片段上使用任何AsyncTasks? –

+0

沒有使用asynctasks。它的啓動方式是託管活動啓動tabfragment(見帖子底部)TabFragment將視圖膨脹並啓動tabadapter,然後啓動tabcontentfragment並根據頁面位置傳遞不同的數據片段。 –