gpt4 book ai didi

java - 在 Android 上从 sdk 22 更新到 23 后出现 FragmentManager 错误

转载 作者:行者123 更新时间:2023-11-30 01:17:09 24 4
gpt4 key购买 nike

我正在使用 FragmentPagerAdapter 创建一个 3 页 viewpager,直到我升级到 sdk 23 它工作正常。我正在使用一个 fragment 并根据 getItem(position) 发送不同的参数来填充不同的数据。升级后 Android 不承认其中一个页面,我必须到达位置 2(第 3 页),然后滑回位置 0(第 1 页),然后 Android 用正确的数据填充页面。通过调试器运行确认 Android 跳过了 TabAdapter.java 中 getItem 函数中的情况 2。我也越来越W/FragmentManager: moveToState: TabContentFragment{3ac2d125 #3 id=0x7f0f0097} 的 fragment 状态未内联更新;预期状态 3 找到 2。我一直在使用 this similar question as reference但仍然无法正常工作,但我已将问题归结为我正在使用的 FragmentManager。但是在弄乱它几个小时之后,我无法让 Android 看到有 3 页而不是 2 页。

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;
}
}
}

bundle 中的数据是这样拉出来的

this.state = getArguments().getInt(BundleKeys.STATE_KEY);

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;
}
}

持有 TabFragment 的 Activity 像这样开始 fragment :

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

最佳答案

我不确定我是否正确理解了你的问题,但在我看来你的最后一个(第三个)标签在你导航到它之前没有被创建。

默认情况下,ViewPager 仅限于创建 2 个离屏 View (一个在左侧,一个在右侧)。通常,应用程序从最左侧的选项卡开始,这意味着,如果您总共有 3 个选项卡,则在您导航到更靠近它之前,不会创建最右侧的选项卡。

您可以在 MainActivity 中使用 ViewPager.setOffScreenPageLimit(#) 覆盖它,其中 ViewPager 实际上是您的 ViewPager 的名称,# 是您希望从一开始就创建的选项卡的数量。在你的情况下,听起来你希望这个数字是 2。

关于java - 在 Android 上从 sdk 22 更新到 23 后出现 FragmentManager 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37681083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com