如何在 Android kotlin 片段中初始化上下文
How to initialize context in fragment on Android kotlin
在我的应用程序中,我想在 fragment
显示时显示消息。
我使用 viewPager
和 BottomNavBar
来显示 4 fragments
!
我希望在单击 BottomNavBar
项目时显示 fragment
并且我希望在 visibility fragment
显示消息 时显示。
我写下面的代码:
class HomeRegisteredFragment : Fragment() {
lateinit var toolbarTile: TextView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_home_registered, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//Initialize
activity?.let {
toolbarTile = it.findViewById(R.id.homePage_toolbarTitle)
}
//Set title
toolbarTile.text = resources.getString(R.string.registered)
context?.let { ContextCompat.getColor(it, R.color.blue_active) }?.let {
toolbarTile.setTextColor(it)
}
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if (isVisibleToUser) {
Log.e("showFragLog", "Show")
context?.let { Toast.makeText(it, "Show", Toast.LENGTH_SHORT).show() }
}
}
}
在我上面的代码中,当单击我的 BottomNavBar
显示 fragment
时,显示日志消息但不显示 Toast 消息。
当点击另一个 BottomNavBar
项目并再次点击前一个 BottomNavBar
项目时,然后显示 Toast 消息。
我想第一次没有在setUserVisibleHint
方法中初始化context
。
我如何初始化 context
以便每次显示 Toast?
如果您正在寻找应用程序上下文来显示 toast 消息,请尝试以下方法,看看它是否有效。此外,初始化它的 onCreate 方法,以便您在那时拥有 activity 上下文。
val appContext = context!!.applicationContext
在变量中存储上下文是一种可怕的做法,大多数时候会导致内存泄漏,请使用 requireContext() 此方法已在支持库 27.1.0 中引入。现在你很可能会有更新的版本,甚至使用 androidx 所以没有理由存储上下文
我用以下代码更改了您的代码:
class HomeRegisteredFragment : Fragment() {
lateinit var toolbarTile: TextView
lateinit var handler: Handler
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_home_registered, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//Initialize
activity?.let {
toolbarTile = it.findViewById(R.id.homePage_toolbarTitle)
}
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if (isVisibleToUser) {
//Initialize
handler = Handler()
//Set delay
handler.postDelayed({
Toast.makeText(requireContext(),"Show",Toast.LENGTH_SHORT).show()
}, 10)
}
}
}
首先你应该使用requireContext()
而不是context()
以避免内存泄漏。
对于每次显示 Toast,您可以在 setUserVisibleHint
中初始化处理程序,然后在延迟一段时间后 运行 您的代码!
希望对你有帮助
在我的应用程序中,我想在 fragment
显示时显示消息。
我使用 viewPager
和 BottomNavBar
来显示 4 fragments
!
我希望在单击 BottomNavBar
项目时显示 fragment
并且我希望在 visibility fragment
显示消息 时显示。
我写下面的代码:
class HomeRegisteredFragment : Fragment() {
lateinit var toolbarTile: TextView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_home_registered, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//Initialize
activity?.let {
toolbarTile = it.findViewById(R.id.homePage_toolbarTitle)
}
//Set title
toolbarTile.text = resources.getString(R.string.registered)
context?.let { ContextCompat.getColor(it, R.color.blue_active) }?.let {
toolbarTile.setTextColor(it)
}
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if (isVisibleToUser) {
Log.e("showFragLog", "Show")
context?.let { Toast.makeText(it, "Show", Toast.LENGTH_SHORT).show() }
}
}
}
在我上面的代码中,当单击我的 BottomNavBar
显示 fragment
时,显示日志消息但不显示 Toast 消息。
当点击另一个 BottomNavBar
项目并再次点击前一个 BottomNavBar
项目时,然后显示 Toast 消息。
我想第一次没有在setUserVisibleHint
方法中初始化context
。
我如何初始化 context
以便每次显示 Toast?
如果您正在寻找应用程序上下文来显示 toast 消息,请尝试以下方法,看看它是否有效。此外,初始化它的 onCreate 方法,以便您在那时拥有 activity 上下文。
val appContext = context!!.applicationContext
在变量中存储上下文是一种可怕的做法,大多数时候会导致内存泄漏,请使用 requireContext() 此方法已在支持库 27.1.0 中引入。现在你很可能会有更新的版本,甚至使用 androidx 所以没有理由存储上下文
我用以下代码更改了您的代码:
class HomeRegisteredFragment : Fragment() {
lateinit var toolbarTile: TextView
lateinit var handler: Handler
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_home_registered, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//Initialize
activity?.let {
toolbarTile = it.findViewById(R.id.homePage_toolbarTitle)
}
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if (isVisibleToUser) {
//Initialize
handler = Handler()
//Set delay
handler.postDelayed({
Toast.makeText(requireContext(),"Show",Toast.LENGTH_SHORT).show()
}, 10)
}
}
}
首先你应该使用requireContext()
而不是context()
以避免内存泄漏。
对于每次显示 Toast,您可以在 setUserVisibleHint
中初始化处理程序,然后在延迟一段时间后 运行 您的代码!
希望对你有帮助