EditText输入框二次点击触发应用运行时错误原因排查
我有一个用于输入数字的EditText输入框,当输入框为空时可多次点击无异常;但只要输入任意字符并关闭键盘后,第二次点击该输入框就会触发运行时错误。查阅Android官方EditText文档未找到相关解决方法,以下是代码及报错日志:
Java代码
package com.example.aplikacja_testowa; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class CallSettings extends AppCompatActivity { private TextView textView; private EditText editText; private Button saveButton; public static final String SHARED_PREFS = "sharedPrefs"; public static final String TEXT = "text"; private String text; int dem=0; int them; int selectTheme = 2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); them=SmsSettings.loadData(CallSettings.this, "style.txt", null, dem); selectTheme = them; Log.i("TAG", "onCreate selectTheme: "+selectTheme); FontSettings.setDynamicTheme(CallSettings.this, selectTheme); setContentView(R.layout.activity_call_settings); textView = findViewById(R.id.callInstruction); editText = findViewById(R.id.textPhoneNumber); saveButton = findViewById(R.id.save_button); } public void savePhoneNumber(View v){ SmsSettings.saveData(this, "callnumber.txt", editText, 0); Toast.makeText(this, R.string.number_saved, Toast.LENGTH_SHORT).show(); } }
XML布局
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".CallSettings"> <TextView android:id="@+id/callInstruction" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/after_ent_the_num" app:layout_constraintBottom_toTopOf="@+id/textPhoneNumber" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/textPhoneNumber" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:hint="@string/inp_ph_num" android:inputType="phone" android:minHeight="48dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/save_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="80dp" android:onClick="savePhoneNumber" android:text="@string/save_sett" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textPhoneNumber" /> </androidx.constraintlayout.widget.ConstraintLayout>
报错日志
E/InputEventReceiver: Exception dispatching input event. E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback E/MessageQueue-JNI: android.content.res.Resources$NotFoundException: Resource ID #0x0 at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:190) at android.content.res.Resources.getDrawable(Resources.java:766) at android.content.Context.getDrawable(Context.java:525) at android.widget.Editor$InsertionPointCursorController.getHandle(Editor.java:5070) at android.widget.Editor$InsertionPointCursorController.show(Editor.java:5049) at android.widget.Editor.onTouchUpEvent(Editor.java:2136) at android.widget.TextView.onTouchEvent(TextView.java:8510) ... D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.aplikacja_testowa, PID: 14480 android.content.res.Resources$NotFoundException: Resource ID #0x0 at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:190) at android.content.res.Resources.getDrawable(Resources.java:766) at android.content.Context.getDrawable(Context.java:525) at android.widget.Editor$InsertionPointCursorController.getHandle(Editor.java:5070) ...
报错核心是Resources$NotFoundException: Resource ID #0x0,说明系统尝试获取ID为0的不存在资源。从调用链来看,是EditText的编辑控制器InsertionPointCursorController在获取光标手柄Drawable时失败,这通常是当前主题缺少EditText光标或选择手柄相关的资源配置导致的。
你调用了FontSettings.setDynamicTheme切换主题,但该主题可能未正确定义以下关键属性:
textCursorDrawable:光标样式textSelectHandleLeft/textSelectHandleRight/textSelectHandleTop:文本选择手柄样式
当EditText有内容时,点击会触发光标手柄的显示逻辑,此时系统找不到对应资源就会崩溃;空输入时无需显示手柄,因此无异常。
方案1:修复动态主题配置
检查FontSettings.setDynamicTheme中设置的主题,确保每个主题都包含EditText相关样式定义:
<!-- 在你的主题style中添加 --> <style name="YourDynamicTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- 光标样式,可使用系统默认或自定义Drawable --> <item name="android:textCursorDrawable">@drawable/your_cursor_drawable</item> <!-- 选择手柄样式 --> <item name="android:textSelectHandleLeft">@android:drawable/text_select_handle_left</item> <item name="android:textSelectHandleRight">@android:drawable/text_select_handle_right</item> <item name="android:textSelectHandleTop">@android:drawable/text_select_handle_top</item> </style>
如果不想自定义Drawable,直接引用系统默认资源即可。
方案2:在EditText中显式设置样式
如果无法修改动态主题,可直接在EditText的XML中添加属性,强制指定光标和手柄资源:
<EditText android:id="@+id/textPhoneNumber" ... android:textCursorDrawable="@android:drawable/text_cursor" android:textSelectHandleLeft="@android:drawable/text_select_handle_left" android:textSelectHandleRight="@android:drawable/text_select_handle_right" android:textSelectHandleTop="@android:drawable/text_select_handle_top" />
这样无论主题如何切换,EditText都会使用你指定的资源,避免资源缺失问题。
方案3:检查动态主题切换逻辑
确认FontSettings.setDynamicTheme的实现没有导致Context资源错乱,比如是否正确调用setTheme()方法,且调用时机在setContentView()之前(你的代码时机正确,但需确保selectTheme对应有效的主题ID)。若selectTheme值无效,可能加载错误主题导致资源缺失。
内容的提问来源于stack exchange,提问作者Stanislaw

