Запустите операцию из метода onClick объекта Listview (фрагмент) - PullRequest
1 голос
/ 13 января 2020

Я недавно начал изучать Android разработку в Kotlin. Я следовал этому руководству и все прошло хорошо.

Теперь я пытаюсь объединить содержание этих двух руководств:
https://developer.android.com/training/contacts-provider/retrieve-details.html#kotlin
и
https://developer.android.com/guide/components/fragments#Example

для отображения сведений о контакте с использованием фрагментов. У меня проблемы с запуском действия в методе onItemClick (в руководстве используется ListView):

 override fun onItemClick(parent: AdapterView<*>, view: View?, position: Int, id: Long) {
    // Get the Cursor
    val cursor: Cursor? = (parent.adapter as? CursorAdapter)?.cursor?.apply {
        // Move to the selected contact
        moveToPosition(position)
        // Get the _ID value
        contactId = getLong(Companion.CONTACT_ID_INDEX)
        // Get the selected LOOKUP KEY
        //contactKey = getString(CONTACT_KEY_INDEX)
        mContactKey = getString(Companion.CONTACT_KEY_INDEX)
        // Create the contact's content Uri
        contactUri = ContactsContract.Contacts.getLookupUri(contactId, mContactKey)
        /*
         * You can use contactUri as the content URI for retrieving
         * the details for a contact.
         */
    }
    val intent = Intent().apply{
        setClass(activity,DetailsActivity::class.java)
        putExtra("contactID",contactId)
        putExtra("mContackKey",mContactKey)
        putExtra("contactUri",contactUri)
    }
    startActivity(intent)
}

Если я создаю намерение для запуска действия, как показано в руководстве, я получаю ошибка компилятора " Предполагаемый тип - FragmentActivity ?, но ожидался контекст ".

Затем я изменил Intent на одно из следующих значений:

val intent = Intent().apply{
        setClass(requireContext(),DetailsActivity::class.java)
        putExtra("contactID",contactId)
        putExtra("mContackKey",mContactKey)
        putExtra("contactUri",contactUri)
    }
    startActivity(intent)

или

 val intent = Intent().apply{
        context?.let { setClass(it,DetailsActivity::class.java) }
        putExtra("contactID",contactId)
        putExtra("mContackKey",mContactKey)
        putExtra("contactUri",contactUri)
    }
    startActivity(intent)

, при этом я не получаю сообщение об ошибке компилятора, но в Logcat вижу сообщение " W / ActivityThread: handleWindowVisibility: нет активности для токена android .os. BinderProxy@9dc9013"

Можете ли вы указать мне правильный способ создания экземпляра действия из метода onClick объекта ListView внутри фрагмента? Спасибо!

В примечании по теме: вы рекомендуете эти руководства или их содержание устарело?

Редактировать: полный класс фрагмента здесь

Ответы [ 2 ]

1 голос
/ 13 января 2020

Попробуйте следующий код для открытия нового действия из фрагмента:

activity?.let{
    val intent = Intent (it, DetailsActivity::class.java)
    intent.putExtra("contactID",contactId);
    intent.putExtra("mContackKey",mContactKey);
    intent.putExtra("contactUri",contactUri);
    it.startActivity(intent)
}
0 голосов
/ 13 января 2020

startActivity() - это функция из класса Context (из которой Activity является подклассом), а не из класса Fragment.

Таким образом, вы можете сделать прямой голый вызов startActivity() из кода подкласса Context (как любая реализация Activity), но когда вы вызываете его из фрагмента, вы должны вызывать его в контексте: context.startActivity().

Свойство Fragment.context имеет значение NULL, так что вы можете использовать requireContext().startActivity(). При ответе на клики оно не будет нулевым, поэтому это безопасно.

...