Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import android.widget.EditText
import android.widget.LinearLayout
import android.widget.ScrollView
import android.widget.Spinner
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.widget.TooltipCompat
import androidx.core.view.isEmpty
Expand Down Expand Up @@ -552,23 +553,35 @@ class DesignEditor : LinearLayout {

fun isLayoutModified(): Boolean = isModified

/**
* Configures the View for the design editor by disabling focus and input.
*
* For [TextView] subclasses, it explicitly disables text selection to prevent the
* internal `android.widget.Editor` from intercepting drag events, avoiding a
* `NullPointerException` on Android 12+ (API 31) caused by conflictive base class interactions.
*/
private fun View.configureForDesignMode() {
isFocusable = false
isFocusableInTouchMode = false

if (this is TextView) {
keyListener = null
isCursorVisible = false
setTextIsSelectable(false)
}
}

private fun rearrangeListeners(view: View) {
view.configureForDesignMode()

when (view) {
is Spinner -> {
view.onItemSelectedListener =
object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(
parent: AdapterView<*>?,
v: View?,
position: Int,
id: Long,
) {
showDefinedAttributes(view)
}

override fun onNothingSelected(parent: AdapterView<*>?) {
}
view.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, v: View?, position: Int, id: Long) {
showDefinedAttributes(view)
}
override fun onNothingSelected(parent: AdapterView<*>?) {}
}
}
is AdapterView<*> -> {
view.setOnItemClickListener { _, _, _, _ ->
Expand Down