diff --git a/layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/DesignEditor.kt b/layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/DesignEditor.kt index be85294cc1..b7578c9771 100644 --- a/layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/DesignEditor.kt +++ b/layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/DesignEditor.kt @@ -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 @@ -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 { _, _, _, _ ->