android - 由于没有窗口焦点而取消事件 : MotionEvent

标签 android android-studio

故事是这样的:

我正在尝试在 Android Studio 中构建猜谜游戏。用户必须猜测一个介于 0 和 1000 之间的数字。每次用户猜测时,计算机都会告诉您猜测是小于实际数字(冷)还是大于实际数字(热)。我决定让用户在 editTextView 中输入他的猜测。我将 onFocus 事件监听器绑定(bind)到 editTextView,这样当用户按下 enter 或点击其他地方时,它会将猜测提交给计算机。我在模拟器中运行了代码,并从控制台收到了一些类似于以下内容的消息:

W/ViewRootImpl:由于没有窗口焦点而取消事件:MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=605.52246, y[0]=969.4336, toolType [0]=TOOL_TYPE_FINGER,buttonState=0,metaState=0,flags=0x0,edgeFlags=0x0,pointerCount=1,historySize=0,eventTime=238238,downTime=235422,deviceId=0,source=0x1002

public class GameActivity extends AppCompatActivity implements View.OnFocusChangeListener {
    public final int MAXNUMBER = 1000;
    private int theAnswer; // stores the number the user has to guess
    public int guesses = 0;
    public EditText userGuess;
    public TextView hotOrCold;
    public String isHotOrCold(int userInput){
        return theAnswer < userInput?"Hot":"Cold"; // Utility to tell the user if his guess is greater than or less than the number.
    }
    public boolean isValidInput(int num){
        return num >= 0 && num <= MAXNUMBER;
    }
    public void resetGame(){
        guesses = 0;
        theAnswer = (int) (Math.random() * (MAXNUMBER + 1));
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

        userGuess = (EditText)findViewById(R.id.userGuess);
        hotOrCold = (TextView) findViewById(R.id.hotOrCold);
        resetGame();
        userGuess.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        /* When focus is lost check that the text field
        * has valid values.
        */
        Log.i("","RAN!");
        if (!hasFocus) {
            guesses++;
            int userInput = Integer.valueOf(userGuess.getText().toString()); // get user input
            Log.i("userInput is: ",userInput+"");
            if (isValidInput(userInput)){
                if (theAnswer == userInput){
                    Toast.makeText(getApplicationContext(),"Congrats! The number was: "+userInput+". You got it in " + guesses + " guesses!",Toast.LENGTH_LONG); // Tell user he got it right
                    hotOrCold.setText("Hot Or Cold"); // set text to default
                    resetGame();
                } else {
                    hotOrCold.setText(isHotOrCold(userInput)); // Tells user if he is hot or cold.
                }
            } else {
                // do nothing
            }
        } else {
            Log.i("Did Run","");
        }
    }
}

这是生成消息的代码。如果您需要更多信息或希望我详细说明某些内容,请告诉我!

假设 ID 正确,并且程序中的所有 View 都存在于 Activity 中。似乎函数 onFocusChange 没有在用户按下 enter 键或更改焦点时运行。

编辑: 当我打开 edittext 元素上的 focusable 属性时出现了一个新错误。这是错误:

W/ResourceType: Failure getting entry for 0x01080346 (t=7 e=838) (error -75)
    [ 07-13 12:54:05.572  2725: 2725 I/         ]
    RAN!

它只在程序开始时发生一次

以下代码提供代码链接到的 Activity 。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.alexander.guessinggame.GameActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Hot or Cold"
        android:id="@+id/hotOrCold"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:textIsSelectable="false"
        android:textSize="50sp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="*Hot:too big, cold:too small"
        android:id="@+id/textView3"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:textIsSelectable="false"
        android:textSize="17sp" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:id="@+id/userGuess"
        android:layout_above="@+id/textView3"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="111dp"
        android:numeric="integer"
        android:selectAllOnFocus="true"
        android:editable="true"
        android:focusableInTouchMode="true"
        android:focusable="true"
        android:enabled="true"
        android:singleLine="true"
        android:clickable="true"
        android:maxLength="4" />

</RelativeLayout>

如果有任何需要,请尽管问我!

谁能告诉我以下错误是什么意思?当我点击编辑文本框时,它们就会出现。

  1. W/EGL_emulation:eglSurfaceAttrib 未实现
  2. W/OpenGLRenderer:无法在表面 0xa9fc6300 上设置 EGL_SWAP_BEHAVIOR,错误=EGL_SUCCESS
  3. E/Surface:getSlotFromBufferLocked:未知缓冲区:0xae3f3fb0

最佳答案

你可以覆盖:

onKeyUp(int keyCode, KeyEvent event)

关于android - 由于没有窗口焦点而取消事件 : MotionEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38341339/

相关文章:

android - 从拍摄的视频的内容 uri 获取文件

android - 是否可以通过 selenium (appium) 代码访问 android 手机设置?

android - 从首选项中删除图标

android - 如何从相机拍摄的照片制作缩略图?

android - 错误膨胀类 ImageButton 停止应用程序启动

java - 如何使用 Mididriver 或其他 Android 库来选择乐器和音符?

java - 您可以在 IntelliJ IDEA 中批量选择引号之间的文本吗?

android-studio - 未知属性 Android : error on Android STUDIO 3. 2.1

android-studio - “此文件不是项目的一部分请将其包含在适当的构建文件中(build.gradle,CMakeLists.txt ....)

android - 上传Bitmap.CompressFormat之前的图像压缩