Как инициализировать контекст во фрагменте на Android kotlin - PullRequest
0 голосов
/ 28 марта 2019

В моем приложении я хочу показать сообщение, когда fragment имеет шоу.
Я использовал viewPager и BottomNavBar для шоу 4 fragments!
Я хочу, чтобы при нажатии на BottomNavBar элементы отображались fragment, а при видимость 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 .

Я думаю, что в первый раз не инициализировать context в методе setUserVisibleHint.

Как я могу инициализировать context для шоу Тост в каждый раз?

Ответы [ 3 ]

2 голосов
/ 29 марта 2019

Я изменил ваши коды с кодами ниже:

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() во избежание утечки памяти.
Для show Toast каждый раз вы можете инициализировать обработчик в setUserVisibleHint, а затем через некоторое время запустить ваш код!

Я надеюсь помочь вам

1 голос
/ 28 марта 2019

Хранение контекста в переменной является ужасной практикой и в большинстве случаев приводит к утечкам памяти, используйте requireContext () , этот метод был представлен в библиотеке поддержки 27.1.0.В настоящее время, скорее всего, у вас будет более новая версия или даже вы используете androidx , поэтому нет оправдания для сохранения контекста

0 голосов
/ 28 марта 2019

Если вы ищете контекст приложения для отображения всплывающего сообщения, попробуйте следующий способ и посмотрите, работает ли он. Кроме того, инициализируйте его методом onCreate, чтобы у вас был контекст активности на этом этапе.

val appContext = context !!. ApplicationContext

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...