我正在使用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頁開始,但應該在其上的信息不存在,但如果我一直滑動到右側(最後一頁)顯示最後一頁的信息,然後當我滾動回頁面1時,第1頁的信息出現。這不是一個網絡延遲sorta的事情,因爲我會離開第1頁的應用程序5分鐘,什麼也沒有發生,然後一旦我去到第3頁,然後返回到第1頁 –
如果你可以顯示特定片段的代碼控制器我可以看看它。你在第一個片段上使用任何AsyncTasks? –
沒有使用asynctasks。它的啓動方式是託管活動啓動tabfragment(見帖子底部)TabFragment將視圖膨脹並啓動tabadapter,然後啓動tabcontentfragment並根據頁面位置傳遞不同的數據片段。 –