Compose BasicTextField: вставить картину из буфера ClipboardManager
приложение - собственный чат.
как отловить событие, когда пытаешься вставить картинку из буфера обмена?
сам BasicTextField пусть и остается пустым.
главное - именно отловить событие и получить Uri (с получением Uri проблем нет)
пните, пожалуйста, в какую сторону копать и возможно ли это вообще.
p.s. судя по телеграмму - возможно.
Ответы (1 шт):
нашел решение.
1ым решением является использование классического EditText
вот так:
@SuppressLint("NewApi")
class EditTextWithImageClipBoard @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null
) : androidx.appcompat.widget.AppCompatEditText(context, attrs) {
private val mimeTypesArray = arrayOf("image/*")
var onClipBoardPaste: (ClipData.Item) -> Unit = {}
override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection? {
var ic = super.onCreateInputConnection(outAttrs) ?: return null
EditorInfoCompat.setContentMimeTypes(outAttrs, mimeTypesArray)
val mimeTypes = ViewCompat.getOnReceiveContentMimeTypes(this)
if (mimeTypes != null) {
EditorInfoCompat.setContentMimeTypes(outAttrs, mimeTypes)
ic = InputConnectionCompat.createWrapper(this, ic, outAttrs)
}
return ic
}
init {
setOnReceiveContentListener(mimeTypesArray) { view, payload ->
runCatching { payload.clip.getItemAt(0) }.getOrNull()?.let {
onClipBoardPaste(it)
}
null
}
}
}
основная магия происходит в методе setOnReceiveContentListener
именно он отвечает за обработку события, когда пытаешься вставить что-то либо из буфера обмена.
важно отметить, что из-за метода надо теперь обрабатывать самостоятельно и вставку текста
метод onCreateInputConnection
нужен для случаев, когда над клавиатурой есть еще системная доп.панель, которая предлагает вставить текущую картинку в буфере обмена.
без переопределения этого метода эта доп.панель не будет показывать изображения (только текст)
как это использовать в Compose
?
с классическим AndroidView
в Compose
только недавно, в релизе 1.7.x
появилась похожая вещь
она является 2ым вариантом решения проблемы, но я не проверял
BasicTextField2(
value = value,
onValueChange = { value = it },
modifier = Modifier
.fillMaxWidth()
.receiveContent(setOf(MediaType.Image)) { content ->
val selectedMediaUri = content.platformTransferableContent?.linkUri
null
}
)