如何从Kotlin中的片段A开始活动B



com.udacity.shoestore:

主要活动ShoeListActivity2ShoeListFragment2欢迎片段说明书碎片

布局:

activity_mainactivity_shoe_list2fragment_指令fragment_loginfragment_shoe_list2fragment_welcome

清单文件:

<activity
android:name=".ShoeListActivity2"
android:exported="false"
android:label="@string/title_activity_shoe_list2"
android:theme="@style/AppTheme.NoActionBar.NoActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>
...
<activity
android:name=".MainActivity"
android:exported="true"
android:screenOrientation="unspecified">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

从指令片段中,我试图启动ShoeListActivity片段,但它崩溃了。在尝试调试时,它会尝试加载MainActivity。

首先我尝试了

binding.listShoesButton.setOnClickListener {
val intent=Intent(this@InstructionsFragment, this@ShoeListActivity2)
startActivity(intent)    
} 

但IDE不会接受这一意图。

然后我发现它希望Intent像一样

val intent = Intent(ACTION_MAIN)
startActivity(intent, ShoeListActivity2::class.java)

但它也不喜欢这样。所以我尝试了

binding.listShoesButton.setOnClickListener {
val intent = Intent(context, ShoeListActivity2::class.java)
startActivity(intent)
}

但在崩溃之前,它只是试图进入主要活动。

从InstructionsFragment启动ShoeListActivity2的正确方法是什么?

谢谢。附言:我也试过

binding.listShoesButton.setOnClickListener {
val intent = Intent(this@InstructionsFragment, ShoeListActivity2::class.java)
startActivity(intent)
}

但是编辑器将其标记为错误;意向;红色下划线。

您需要获取父Activity的Context,因为Fragment没有自己的Context

你可以这样做:

val intent = Intent (getActivity(), ShoeListActivity2::class.java)
getActivity().startActivity(intent)

您对以下代码的尝试几乎是正确的

binding.listShoesButton.setOnClickListener {
val intent = Intent(context, ShoeListActivity2::class.java)
startActivity(intent)
}

但是这里";上下文";是一个可为Null的对象,IDE会给出错误,因为Intent的构造函数参数要求Context不为Null。因此,理想情况下,我们需要传递安全性为空的上下文。我们可以通过以下两种方式做到这一点:

1:使用let scope 使用零安全

binding.listShoesButton.setOnClickListener {
context?.let{
val intent = Intent(it, ShoeListActivity2::class.java)
startActivity(intent)
}        
}

2:在try-catch 中使用内置的requiredContext或requireActivity函数

binding.listShoesButton.setOnClickListener {
try {
val intent = Intent(requireActivity(), ShoeListActivity2::class.java)
startActivity(intent)
} catch(e : IllegalStateException){
}
}

最新更新