我正在使用 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/
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我正在使用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].有没有一种方法可以
我安装了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
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下: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列,在这种情况下
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来
我想用这两种语言中的任何一种(最好是ruby)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生
这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什