You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:04:56