FragmentManager在从Android SDK 22更新到23之后出现错误

问题描述:

我正在使用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(); 

我不知道如果我正确或不理解你的问题,但要等到浏览到它,它的声音,我喜欢你的最后一个(第三)标签没有被创建。

默认情况下,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并根据页面位置传递不同的数据片段。 –