草庐IT

android - fragment 不与 fragment 管理器相关联

coder 2023-12-04 原文

我正在使用 Navigation Component 为具有一个 Activity 和多个 fragment 的应用程序编写一些仪器测试。

我的启动画面代码如下:

class SplashFragment : Fragment(), KodeinAware {

    override val kodein by Admin.instance.kodein

    private var realm: Realm? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.splash, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        (activity as? AppCompatActivity)?.supportActionBar?.hide()

        realm = Realm.getInstance(RealmUtil.realmConfig)

        val result = realm!!.where<User>().findFirst()
        val user = if (result != null) realm!!.copyFromRealm(result) else null

        Handler().postDelayed({
            if (user == null)
                findNavController().navigate(R.id.action_splashFragment_to_loginFragment) //navigate to login screen if no user exists
            else
                findNavController().navigate(R.id.action_splashFragment_to_businessListFragment) //navigate to business list if user already logged in
        }, 2000)
    }

    override fun onDestroy() {
        super.onDestroy()

        realm?.close()
    }
}

我正在尝试测试启动画面之后出现的 fragment ,但我不断收到以下错误:

java.lang.IllegalStateException: Fragment SplashFragment{a1ca381 (5f5b98ae-c130-4e9b-9b77-0495561ef4f5)} not associated with a fragment manager.
at androidx.fragment.app.Fragment.requireFragmentManager(Fragment.java:891)
at androidx.navigation.fragment.NavHostFragment.findNavController(NavHostFragment.java:106)
at androidx.navigation.fragment.FragmentKt.findNavController(Fragment.kt:29)
at com.chargebot.collect.admin.fragment.onboarding.SplashFragment$onViewCreated$1.run(SplashFragment.kt:44)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at androidx.test.espresso.base.Interrogator.loopAndInterrogate(Interrogator.java:148)
at androidx.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:519)
at androidx.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:478)
at androidx.test.espresso.base.UiControllerImpl.injectKeyEvent(UiControllerImpl.java:201)
at androidx.test.espresso.base.UiControllerImpl.injectString(UiControllerImpl.java:357)
at androidx.test.espresso.action.TypeTextAction.perform(TypeTextAction.java:108)
at androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.perform(ViewInteraction.java:360)
at androidx.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:251)
at androidx.test.espresso.ViewInteraction.access$100(ViewInteraction.java:64)
at androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:157)
at androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:154)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我的测试类如下:

@RunWith(AndroidJUnit4::class)
@MediumTest
class SignInTest {

    @get: Rule
    val login = ActivityScenarioRule(Home::class.java)

    @Test
    fun loginWithoutEmail_ShouldDisplayError() {
        val scenario = launchFragmentInContainer<LoginFragment>()

        onView(withId(R.id.password)).perform(typeText("samplePassword"), closeSoftKeyboard())
        onView(withId(R.id.login)).perform(click())

        onView(withId(com.google.android.material.R.id.snackbar_text)).check(matches(withText(R.string.enter_email)))
    }

    @Test
    fun loginWithoutPassword_ShouldDisplayError() {
        val scenario = launchFragmentInContainer<LoginFragment>()

        onView(withId(R.id.email)).perform(typeText("sample@password.com"), closeSoftKeyboard())
        onView(withId(R.id.login)).perform(click())

        onView(withId(com.google.android.material.R.id.snackbar_text)).check(matches(withText(R.string.enter_password)))
    }
}

由于上述错误,我的所有测试函数都不会执行。自从我在初始屏幕上运行的测试成功运行后出现异常的原因是什么?

我的nav_graph如下:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/splashFragment">

    <fragment
        android:id="@+id/splashFragment"
        android:name="com.chargebot.collect.admin.fragment.onboarding.SplashFragment"
        android:label="SplashFragment"
        tools:layout="@layout/splash">
        <action
            android:id="@+id/action_splashFragment_to_loginFragment"
            app:destination="@id/loginFragment"
            app:popUpTo="@+id/splashFragment"
            app:popUpToInclusive="true" />
        <action
            android:id="@+id/action_splashFragment_to_businessListFragment"
            app:destination="@id/businessListFragment"
            app:popUpTo="@+id/splashFragment"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/registrationFragment"
        android:name="com.chargebot.collect.admin.fragment.onboarding.RegistrationFragment"
        android:label="RegistrationFragment"
        tools:layout="@layout/registration">
        <action
            android:id="@+id/action_registrationFragment_to_businessListFragment"
            app:destination="@id/businessListFragment"
            app:popUpTo="@+id/registrationFragment"
            app:popUpToInclusive="true" />
        <action
            android:id="@+id/action_registrationFragment_to_loginFragment"
            app:destination="@id/loginFragment"
            app:popUpTo="@+id/registrationFragment"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/loginFragment"
        android:name="com.chargebot.collect.admin.fragment.onboarding.LoginFragment"
        android:label="LoginFragment"
        tools:layout="@layout/login">
        <action
            android:id="@+id/action_loginFragment_to_businessListFragment"
            app:destination="@id/businessListFragment"
            app:popUpTo="@+id/loginFragment"
            app:popUpToInclusive="true" />
        <action
            android:id="@+id/action_loginFragment_to_registrationFragment"
            app:destination="@id/registrationFragment"
            app:popUpTo="@+id/loginFragment"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/businessListFragment"
        android:name="com.chargebot.collect.admin.fragment.business.BusinessListFragment"
        android:label="BusinessListFragment"
        tools:layout="@layout/businesses_list">
        <action
            android:id="@+id/action_businessListFragment_to_newBusinessFragment"
            app:destination="@id/newBusinessFragment" />
        <action
            android:id="@+id/action_businessListFragment_to_branchesFragment"
            app:destination="@id/branchesFragment" />
    </fragment>
    <fragment
        android:id="@+id/newBusinessFragment"
        android:name="com.chargebot.collect.admin.fragment.business.NewBusinessFragment"
        android:label="NewBusinessFragment"
        tools:layout="@layout/add_business_layout">
        <action
            android:id="@+id/action_newBusinessFragment_to_businessListFragment"
            app:destination="@id/businessListFragment" />
    </fragment>
    <fragment
        android:id="@+id/branchesFragment"
        android:name="com.chargebot.collect.admin.fragment.branch.BranchesFragment"
        android:label="BranchesFragment"
        tools:layout="@layout/branches_layout">
        <action
            android:id="@+id/action_branchesFragment_to_transactionsFragment"
            app:destination="@id/transactionsFragment" />
        <action
            android:id="@+id/action_branchesFragment_to_newBranchFragment"
            app:destination="@id/newBranchFragment" />
        <action
            android:id="@+id/action_branchesFragment_to_collectorsFragment"
            app:destination="@id/collectorsFragment" />
    </fragment>
    <fragment
        android:id="@+id/transactionsFragment"
        android:name="com.chargebot.collect.admin.fragment.transactions.TransactionsFragment"
        android:label="TransactionsFragment"
        tools:layout="@layout/transactions" />
    <fragment
        android:id="@+id/newBranchFragment"
        android:name="com.chargebot.collect.admin.fragment.branch.NewBranchFragment"
        android:label="NewBranchFragment"
        tools:layout="@layout/add_branch_layout" />
    <fragment
        android:id="@+id/collectorsFragment"
        android:name="com.chargebot.collect.admin.fragment.collector.CollectorsFragment"
        android:label="CollectorsFragment"
        tools:layout="@layout/client_list_layout">
        <action
            android:id="@+id/action_collectorsFragment_to_newCollectorFragment"
            app:destination="@id/newCollectorFragment" />
        <action
            android:id="@+id/action_collectorsFragment_to_transactionsFragment"
            app:destination="@id/transactionsFragment" />
        <action
            android:id="@+id/action_collectorsFragment_to_collectorTransactions"
            app:destination="@id/collectorTransactions" />
    </fragment>
    <fragment
        android:id="@+id/newCollectorFragment"
        android:name="com.chargebot.collect.admin.fragment.collector.NewCollectorFragment"
        android:label="NewCollectorFragment"
        tools:layout="@layout/new_client_layout" />
    <fragment
        android:id="@+id/collectorTransactions"
        android:name="com.chargebot.collect.admin.fragment.transactions.CollectorTransactionsFragment"
        android:label="CollectorTransactions"
        tools:layout="@layout/transaction_layout">
        <action
            android:id="@+id/action_collectorTransactions_to_collectorsFragment"
            app:destination="@id/collectorsFragment"
            app:popUpTo="@id/collectorsFragment" />
    </fragment>

</navigation>

最佳答案

我发现在我的案例中,问题与线程有关。我解决了它:

 lifecycleScope.launchWhenResumed {
      findNavController().navigate(R.id.action_splashFragment_to_loginFragment)
 }

很高兴知道这是否对您有帮助?!

关于android - fragment 不与 fragment 管理器相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55631819/

有关android - fragment 不与 fragment 管理器相关联的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  3. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  4. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  5. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  6. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  7. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  8. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  9. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

  10. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

随机推荐