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){
}
}