gpt4 book ai didi

android - Fragment getActivity() 在 Activity JUnit 测试中返回 null

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:16:24 24 4
gpt4 key购买 nike

我为实例化 fragment (实际上是选项卡)的 Activity 编写了 Android JUnit 测试。在测试期间,当我尝试对这些选项卡执行任何操作时,它们会崩溃,因为它们中的 getActivity() 方法返回 null。实际应用程序(不是测试)从不显示此行为,并且 fragment getActivity() 总是在那里返回正确的父 Activity 。我的测试用例如下所示:

public class SetupPanelTest extends ActivityUnitTestCase<MyAct> {

FSetup s;

public SetupPanelTest() {
super(MyAct.class);
}

protected void setUp() throws Exception {
super.setUp();
startActivity(new Intent(), null, null);
final MyAct act = getActivity();

AllTabs tabs = act.getTabs();
String tabname = act.getResources().getString(R.string.configuration);

// This method instantiates the activity as said below
s = (FSetup) tabs.showTab(tabname);
FragmentManager m = act.getFragmentManager();
// m.beginTransaction().attach(s).commit();
// ... and even this does not help when commented out

assertTrue(s instanceof FSetup); // Ok
assertEquals(act, s.getActivity()); // Failure
}

public void testOnPause() {
// this crashes because s.getActivity == null;
s.onPause();
}
}

AllTabs 创建一个 fragment ,然后以这种方式被要求:

 FragmentManager manager = getFragmentManager();
Fragment fragment = manager.findFragmentByTag(tabname);
if (fragment == null || fragment.getActivity() == null) {
Log.v(TAG, "Instantiating ");
fragment = new MyFragment();
manager.beginTransaction().replace(R.id.setup_tab, fragment, tabname).commit();
....

在这里,所有 fragment 最初都是占位符,后来被实际 fragment 替换:

<FrameLayout
android:id="@+id/setup_tab"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

logcat 显示新 fragment 已被实例化。在相同的布局中,还有前面提到的 AllTabs fragment 似乎没有这个问题(否则它在哪里以及如何获取 FragmentManager):

<TabWidget
android:id="@android:id/alltabs"
...

最令人印象深刻的是,当我直接对在正确的 Activity 中获得的 fragment 管理器调用附加时,这仍然没有效果。我试图延迟五秒钟(我已经读过 transaction may be delayed ),我试图通过 runOnUiThread 调用其余的测试 - 没有任何帮助。

问题 是在测试期间也需要这样做以将我的 fragment 附加到 Activity 。我有 fragment 和 Activity ,我无法将一个附加到另一个。

最佳答案

即使您在事务上调用 .commit(),它仍然没有完成, fragment 只是延迟附加。

    FragmentManager m = activity.getFragmentManager();
m.executePendingTransactions();

这最终将所有 fragment 附加到 Activity 。在运行应用程序本身时似乎是多余的,但在 JUnit 测试用例中是必需的。

关于android - Fragment getActivity() 在 Activity JUnit 测试中返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14283596/

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