Различные способы использования фрагментов - PullRequest
2 голосов
/ 05 мая 2020

Я разрабатываю приложение с помощью Firebase. Но всякий раз, когда я использую метод onViewCreated, кнопка не реагирует ни на какие щелчки. Но когда я использую onCreateView, он работает.

Вот мой LoginFragment (кнопка не реагирует на щелчки):

class LoginFragment : Fragment(R.layout.fragment_login) {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val binding = FragmentLoginBinding.inflate(layoutInflater)
        binding.buttonGoogleSignin.setOnClickListener {
            toast("THIS IS NOT WORKING")
            Authentication.getInstance().signIn(context!!, getString(R.string.default_web_client_id)) {
                startActivityForResult(mGoogleClient.signInIntent, RC_GOOGLE_SIGN_IN)
            }
        }
    }
}

В этом коде моя кнопка реагирует на щелчки:

class LoginFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInFlater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ) {
        val view = inflater.inflate(R.layout.fragment_login, container, false)
        val binding = FragmentLoginBinding.bind(view)
        binding.buttonGoogleSignin.setOnClickListener {
            toast("THIS IS WORKING")
            Authentication.getInstance().signIn(context!!, getString(R.string.default_web_client_id)) {
                startActivityForResult(mGoogleClient.signInIntent, RC_GOOGLE_SIGN_IN)
            }
        }
        return view
    }
}

Может мне кто-нибудь объяснить, почему первый подход не сработал?

1 Ответ

1 голос
/ 05 мая 2020

Проблема в том, что в onViewCreated вы создаете объект привязки с помощью FragmentLoginBinding.inflate(layoutInflater), но не подключаете эту привязку к представлению, поэтому все, что вы делаете с этим объектом, не повлияет на представление.

FragmentLoginBinding.inflate(layoutInflater) создает новый объект привязки, а также расширяет новое представление, к которому он подключен. Но вы не используете это представление в своем фрагменте, поэтому использование этого метода - неправильный выбор.

Таким образом, вы можете сделать что-то вроде:

val binding = FragmentLoginBinding.bind(getView())

внутри onViewCreated, если вы действительно хотите, и это создаст привязку с представлением, которое у вас есть в вашем фрагменте.

Сказано, что создание привязки уже в onCreateView на самом деле рекомендуется Android документацией .

...