gpt4 book ai didi

android - 单元测试 NPE,当我添加 fragment 自定义转换时

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:49:51 25 4
gpt4 key购买 nike

当我添加自定义转换 时,OnBackPressed() 测试抛出 NPE。没有自定义转换也没关系。为什么?

此 NPE 仅发生在单元测试中,而不发生在应用程序中。

 class MyActivity {
@Override
public void onBackPressed() {
.......
super.onBackPressed();
}

private void putFragment(Fragment fragment) {
String tag = fragment.getClass().getName();

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// TEST FAILED IF I ADD THE FOLLOWING LINE
transaction.setCustomAnimations(
R.anim.slide_in_left_fade_in,
R.anim.fade_out_short_anim_time,
R.anim.fade_in_short_anim_time,
R.anim.slide_out_right_fade_out);

transaction.replace(R.id.ub__add_profiles_content, fragment, tag);
transaction.addToBackStack(tag);
transaction.commit();
}
}

class MyActivityTest extends RiderRobolectricBase {

@Test
public void onBackPressed() {
putFragment(someFragment);

mMyActivity.onBackPressed();
}
}

异常(exception):

java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1304)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:909)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1625)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:561)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:166)
at MyActivity.onBackPressed(MyActivity.java:28)

最佳答案

Onbackpress 您正在从后台堆栈中反转之前的步骤。第一个是删除现有 fragment 。该 fragment 与 Activity 分离并且
您没有保留此 fragment 的实例。

java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1304)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:909)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1625)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:561)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:166)
at MyActivity.onBackPressed(MyActivity.java:28)

你调用putFragment(someFragment)
所以当你去调用setCustomAnimations的时候。不会保存之前的 View 以供在转换中使用。

// TEST FAILED IF I ADD THE FOLLOWING LINE
transaction.setCustomAnimations(
R.anim.slide_in_left_fade_in,
R.anim.fade_out_short_anim_time,
R.anim.fade_in_short_anim_time,
R.anim.slide_out_right_fade_out);

您可以在 fragment 的 oncreate 方法中保留该实例:

setRetainInstance(true);

至于这个在你的应用程序中的工作,我在你的 Activity 的 onBackPressed 事件中看不到代码。

关于android - 单元测试 NPE,当我添加 fragment 自定义转换时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33577645/

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