2013-12-09 56 views
18

我想開發一個Log在頁面中,我有用戶名,密碼和一個按鈕。當我第一次點擊按鈕時,什麼也沒有發生,但是當我第二次點擊按鈕時,它就能正常工作。我很困惑,它爲什麼會發生?按鈕不調用OnClickListener與第一次點擊

activity_login.xml

<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:background="@drawable/splash_bg" 
tools:context=".LoginActivity" > 
<LinearLayout 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_alignParentRight="true" 
android:orientation="vertical" 
android:layout_margin="30dp" > 

<EditText 
    style="@style/EditText1" 
    android:id="@+id/userEditText" 
    android:layout_marginBottom="50dp" 
    android:inputType="textNoSuggestions" 
    android:singleLine="true" 
    android:hint="username" /> 
<EditText 
    style="@style/EditText1" 
    android:id="@+id/passEditText" 
    android:inputType="textPassword" 
    android:layout_marginBottom="50dp" 
    android:hint="password" /> 
<Spinner 
    android:id="@+id/locationSpinner" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:popupBackground="#ffffff" 
    style="@style/EditText1" 
    android:layout_marginBottom="50dp" /> 
<Button 
    style="@style/Button1" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:onClick="onLoginClick" 
    android:text="continue" 
     /> 

loginActivity.java

@SuppressLint("DefaultLocale") 
    public void onLoginClick(View view) { 
     String username = mUserEditText.getText().toString(); 
     String password = mPassEditText.getText().toString(); 
     String location = mLocationData.get(
       mLocationSpinner.getSelectedItemPosition()).toLowerCase(); 
     if (username.isEmpty() || password.isEmpty()) { 
      CreatorMessenger 
        .getInstance() 
        .showMessage(this, "Error!!", 
          "You need to enter username and password both to continue!!"); 
      return; 
     } 
     User user; 
     user = new User(username);/* 
          * } 
           */ 
     user.setLocation(location); 
     AppManager.getInstance().setLoggedInUser(user); 

     APICaller.getInstance().login(username, password, location); 
    } 
+0

使用Logger在logcat中查看它是否正在輸入方法。你會看到它不是focusableInTouchMode參數。 – Jorgeblom

+0

那我該怎麼做,請幫幫我? –

+0

也許我對這個類似問題的回答可能有所幫助:http://stackoverflow.com/a/42092582/1617737 –

回答

9

是是我得到了答案,很多RND後,我得到了解決,我只需要實現setOnClickListener(),和setOnFocusChangeListener()。所以我把這個解決方案放在這裏。

ActivityLogin.java

buttonLogin= (Button) findViewById(R.id.buttonLogin); 
    buttonLogin.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("hello", "hellow"); 
      String username = mUserEditText.getText().toString(); 
      String password = mPassEditText.getText().toString(); 
      String location = mLocationData.get(mLocationSpinner.getSelectedItemPosition()).toLowerCase(); 
      if(username.isEmpty()||password.isEmpty()){ 
      popbox(); 
       return; 
      } 
      User user; 
      user = new User(username); 
      user.setLocation(location); 
      AppManager.getInstance().setLoggedInUser(user); 
      APICaller.getInstance().login(username, password, location); 
     } 
    }); 
    buttonLogin.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (hasFocus) { 
      v.performClick(); 
     } 
    } 
}); 
} 

activity_login.xml

<Button 
     android:id="@+id/buttonLogin" 
     style="@style/Button1" 

     android:text="continue" 
     /> 
+1

所以你基本上在OnFocus()方法上調用onClick()。禁用焦點應該是一樣的,但很高興解決了這個問題。 –

+0

其實對我的問題很好。我需要按鈕是可以聚焦的,這樣我點擊按鈕時我的editText視圖onFocusChange事件纔會被觸發,並且我還需要點擊按鈕的事件才能在第一次點擊時觸發。如果我刪除了它的可聚焦性,那麼edittext不會失去它的焦點並且它的事件不會觸發,並且如果沒有焦點更改偵聽器,它必須按兩次按鈕。所以謝謝 :) – Tomislav3008

11

設置此 -

android:focusableInTouchMode="true" 

對此 -

android:focusableInTouchMode="false" 

on button。

說明 - 如果您將按鈕設置爲可調焦,則在第一次單擊時將焦點傳遞給按鈕,然後在第二次觸摸時傳遞該點擊。 EditText是一個可聚焦的View,它首先獲得焦點,因此其他視圖必須首先從EditText重新獲得焦點,除非它們不需要焦點來工作,就像按鈕一樣。如果您只需要使用OnClick功能,那麼您不需要專注,因此您可以再次點擊一次。

PS:雖然它不應該要求,但設置android:focusable爲false也會有幫助,如果第一個不起作用。

2

如果在您的按鈕XML或IMG,或襯墊佈局有:

android:focusableInTouchMode="true" 

要解決,只是 刪除此。

1

我建議在「onCreate()」方法中使用請求焦點。

當您使用android:focusableInTouchMode="true"時,您可能不希望通過'EditText'字段捕獲焦點。

例如: 1.活動有一個視圖包含 - >安卓focusableInTouchMode 2.打開一個對話框片段,但後退按鈕需要點擊兩次啓動它。 3.您應該在分段對話框後調用requestFocus()onCreateView()

相關問題