我在视图寻呼机 2 中使用 4 个片段。突然出现此错误。崩溃并不总是出现。我搜索了其他问题,但找不到有关 viewpager2 的任何解决方案。
来自手机的崩溃报告无法获得全貌
setUpViewPager()从调用这个在onStart()的MainActivity
public void setupViewPager() {
MainActivityViewPager adapter = new MainActivityViewPager(getSupportFragmentManager(), getLifecycle());
binding.viewpager.setUserInputEnabled(false);
binding.viewpager.setOffscreenPageLimit(3);
binding.viewpager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
if (prevMenuItem != null) {
prevMenuItem.setChecked(false);
} else {
binding.bottomNavigation.getMenu().getItem(0).setChecked(false);
}
binding.bottomNavigation.getMenu().getItem(position).setChecked(true);
prevMenuItem = binding.bottomNavigation.getMenu().getItem(position);
}
});
binding.viewpager.setAdapter(adapter);
}
Run Code Online (Sandbox Code Playgroud)
主ActivityViewPager
public class MainActivityViewPager extends FragmentStateAdapter {
public MainActivityViewPager(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
super(fragmentManager, lifecycle);
}
@NonNull
@Override
public Fragment createFragment(int position) {
switch …
Run Code Online (Sandbox Code Playgroud) 在我的活动中,我正在加载片段并将它们添加到用户单击项目时的后台堆栈中。这工作正常并且后台加载良好。
不幸的是,当我旋转设备时,活动是空白的。我已经在 SO 和 Google 上尝试了所有可能的方法。
我尝试通过在用户单击时简单地替换片段并将背面作为导航处理来自己管理导航。这工作正常,但如果堆栈大于 1,我将失去我编码以更改导航抽屉以显示后退箭头的自动功能。
我尝试删除整个堆栈并按照用户在旋转设备时单击的顺序添加各个片段。这行不通。似乎删除和替换不正常。
我尝试使用 fragmentManager.findbytag 添加片段,但它抛出一个非法状态异常“片段已经添加”。我在 SO 上找到了一个解决方案来消除过渡。工作一次然后停止。不知道为什么。
每次更改时,我都会敬酒以检查显示 backstack 计数,我意识到添加后堆栈仍然显示正确的计数,但页面仍然是空白的。它甚至需要 2 次后退才能将活动退出到上一个活动。
我放置了一个断点来检查是否在片段中调用了 onCreateView,是的,每次旋转手机时都会调用它。
基本上,我的代码现在看起来像这样,因为我已经放弃了。
@Override
protected void onCreate(Bundle savedInstanceState) {
mPosition = 1;
super.onCreate(savedInstanceState);
if(savedInstanceState != null) {
mLastArtistFragmentTag = savedInstanceState.getString(SAVE_FRAGMENT_LAST_ARTIST);
mLastAlbumFragmentTag = savedInstanceState.getString(SAVE_FRAGMENT_LAST_ALBUM);
mLastSongFragmentTag = savedInstanceState.getString(SAVE_FRAGMENT_LAST_SONG);
mLastFragmentType = savedInstanceState.getInt(SAVE_FRAGMENT_LAST_TYPE);
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Load();
}
}, 100);
}
void Load() {
findViewById(R.id.loading).setVisibility(View.GONE);
ViewStub stub = (ViewStub) findViewById(R.id.container_stub);
stub.setLayoutResource(R.layout.activity_music);
stub.inflate();
if(mLastArtistFragmentTag == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.base_container, …
Run Code Online (Sandbox Code Playgroud) 我有一些片段被交换进我的主要活动.初始片段称为BrowseHomeFragment并且最初加载正常,但是当我用新片段替换它然后将其替换回来时我得到以下错误
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:686)
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:536)
Run Code Online (Sandbox Code Playgroud)
BrowseHomeFragment的onCreateView方法:
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
InjectionGraph.inject(this);
View view = inflater.inflate(R.layout.fragment_browse, container, false);
ButterKnife.inject(this, view);
addTabsToPagerSlidingTabStrip(inflater);
viewPager.setAdapter(new BrowseHomePagerAdapter(getChildFragmentManager()));
pagerSlidingTabStrip.setViewPager(viewPager);
// has to set page change listener in indicator
pagerSlidingTabStrip.setOnPageChangeListener(pageChangeListener);
viewPager.setCurrentItem(initialTabIndex);
return view;
}
Run Code Online (Sandbox Code Playgroud)
BrowseHomePagerAdapter
public class BrowseHomePagerAdapter extends FragmentStatePagerAdapter {
private int lastPosition = -1;
@Inject
BrowseHomepageMetricRecorder browseHomepageMetricRecorder;
@Inject
NetworkMonitor networkMonitor;
/**
* …
Run Code Online (Sandbox Code Playgroud) 这是我作为错误得到的堆栈跟踪:
流程:com.peems.itcrowd,PID:2949 java.lang.NullPointerException:尝试在android.support.v4.app.FragmentManagerImpl上的空对象引用上调用虚拟方法'int java.util.ArrayList.size()'。 android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215)处的getFragment(FragmentManager.java:873)android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1481)处的android.support.v4.app.FragmentStatePagerAdapter.restoreState .View.dispatchRestoreInstanceState(View.java:15751)在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3231)在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3237)在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3237)在android。在android.support.v4.app.Fragment.restoreViewState(Fragment.java:475)处的view.View.restoreHierarchyState(View.java:15729)在android.support.v4.app.FragmentManagerImpl处android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)处的moveToState(FragmentManager.java:1329)android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)处的android.support.v4.app。 .v4.app.BackStackRecord.executePopOps(BackStackRecord.java:803)在android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2353)在android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java) :2146)在android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098)在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2008)在android.support.v4.app.FragmentManagerImpl $ 1.run(FragmentManager.java:710)在android.os.Handler.handleCallback(Handler.java:751)在android.os.Handler.dispatchMessage(Handler.java:95)在android.os.Looper.loop(Looper .java:154)在android.app.ActivityThread.main(ActivityThread.java:6119)在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:的java.lang.reflect.Method.invoke(本机方法)处886),位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)处com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)处调用(本机方法)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)处com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)处调用(本机方法)
我将解释如何解决此错误。在我的片段中,我调用此方法,然后将执行我的活动并启动另一个包含的片段viewpager
。
@Override
public void checkoutCartResult(Result<Shop> result) {
mShop = result.getData();
sendActionToActivity(ACTION_ORDER, mShop);
DisplayUtil.doToast(getContext(), getString(R.string.checkout_successful));
}
private void sendActionToActivity(String action, Shop shop) {
if (mListener == null) {
return;
}
Bundle bundle = new Bundle();
bundle.putString(Constants.ACTION_KEY, action);
bundle.putParcelable(Constants.DATA_KEY_1, Parcels.wrap(shop));
mListener.onFragmentInteraction(bundle);
}
Run Code Online (Sandbox Code Playgroud)
上面的方法将触发此片段:
public class ShopFragment extends BaseFragment implements ShopView,
ViewPager.OnPageChangeListener {
private static final String TAG = ShopFragment.class.getName();
private static final String …
Run Code Online (Sandbox Code Playgroud) android nullpointerexception android-fragments android-viewpager fragmentmanager
我正在使用一个FragmentStatePagerAdapter
. 将getItem(int position)
返回错误的位置。我有5个碎片。这是我更改片段时的位置:
Fragment0 -> Fragment1: position = 2
Fragment1 -> Fragment2: position = 3
Fragment2 -> Fragment3: position = 4
Fragment3 -> Fragment4: getItem is not called!
Fragment4 -> Fragment3: position = 2
Fragment3 -> Fragment2: position = 1
Fragment2 -> Fragment1: position = 0
Fragment1 -> Fragment0: getItem is not called!
Run Code Online (Sandbox Code Playgroud)
这是我的适配器的代码:
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
public class AppFragmentPageAdapter extends FragmentStatePagerAdapter {
final int PAGE_COUNT = 5;
private String tabTitles[] …
Run Code Online (Sandbox Code Playgroud) 我希望有人能帮帮忙。我有一个非活动类,需要在其中使用静态方法访问fragmentmanager ,不幸的是我不知道如何正确传递上下文。
任何帮助表示赞赏,
非活动类别:
public class testClass {
..
public synchronized static void checkNewdata(List<data>input, Context context) {
..
FragmentManager ft = ((FragmentActivity)???).getSupportFragmentManager();
DialogFragment newFragment = MyNotification.newInstance();
newFragment.setCancelable(false);
newFragment.show(ft, "mydialog");
..
}
}
Run Code Online (Sandbox Code Playgroud)
还从非活动类中调用方法checkNewdata,在该类中我尝试传递上下文,但这不起作用:
public class SearchResponse extends SuccessResponse {
private Context mcontext;
public SearchResponse(Context context){
mcontext = context;
}
..
@Override
public void save() {
..
testClass.checkNewdata(mainData, context);
..
}
}
Run Code Online (Sandbox Code Playgroud) 当我替换一个片段时,它会被破坏。我尝试在活动的 onCreate 中创建片段并将其引用保留在活动中,并在我“重新显示”或“重新打开”它时通过调用替换引用来使用它,但这并没有帮助,片段被销毁(替换时)由另一个片段)并重新创建。解决办法应该是什么?
我想要实现的是说WhatsApp,其中不可见时不应销毁片段,除非我没有使用滑动手势而是使用常规按钮。
谢谢。
android android-fragments fragmenttransaction fragmentmanager
我已经尽我所能来解决我的问题,这与许多其他使用fragmentmanager找不到视图的人一样。
尝试了我在网上找到的和能想到的一切。
这是我的 MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MenuFragment menuFragment = new MenuFragment();
FragmentManager fmStart = getSupportFragmentManager();
FragmentTransaction fmTrans = fmStart.beginTransaction();
fmTrans.add(R.id.fragmentContainerID, menuFragment);
fmTrans.commitAllowingStateLoss();
}
public void addFragment(Fragment fragment, boolean addToBackStack, String tag) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
if (addToBackStack) {
ft.addToBackStack(tag);
}
ft.replace(R.id.fragmentContainerID, fragment, tag);
ft.commitAllowingStateLoss();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误与许多其他错误相同:
java.lang.IllegalArgumentException: No view found for id 0x7f080073 (se.iteda.hangman:id/fragmentContainerID) for fragment MenuFragment{d8a58aa (60d879ee-e84c-425e-a1a1-8e9be9c3b3a8) id=0x7f080073}
Run Code Online (Sandbox Code Playgroud)
我想要做的是在开始时加载一个片段(MenuFragment),在该片段中,我有 2 个可以更改片段的按钮。