這裏的故事:取消事件,由於沒有窗口焦點:MotionEvent
我想在Android Studio中構建一個猜謎遊戲。用戶必須猜測一個介於0和1000之間的數字。每次用戶猜測時,計算機會告訴您猜測是小於實際數量(Cold)還是大於實際數量(Hot)。我決定讓用戶在editTextView中輸入他的猜測。我將一個onFocus
事件監聽器綁定到editTextView,以便當用戶按Enter鍵或點擊其他位置時,它將猜測提交給計算機。我跑在模擬器中的代碼,我收到從控制檯的一些消息說,類似下面的事情:
W/ViewRootImpl: Cancelling event due to no window focus: 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是正確的,並且活動中存在程序中的所有視圖。似乎功能onFocusChange
沒有運行,只要用戶按下輸入或更改焦點。
編輯: 我有一個新的錯誤,顯示了當我打開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!
它只是在程序
下面的代碼開始發生一次提供了活動的代碼鏈接。
<?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>
如果有什麼需要請不要猶豫,問我!
誰能告訴我以下錯誤是什麼意思?當我點擊edittext框時,它們就出來了。
W/EGL_emulation: eglSurfaceAttrib not implemented
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xa9fc6300, error=EGL_SUCCESS
E/Surface: getSlotFromBufferLocked: unknown buffer: 0xae3f3fb0