2011-12-25 97 views
1

我設計了一個創建帳戶活動的佈局。將焦點從一個EditText移動到另一個EditText

當一個EditText失去了重點,我正在做一些檢查輸入,如果有什麼不對,我想重新獲得關注EditText

我已經看到了一些關於這個問題,但它不適合我(或者我做錯了什麼)。

當我觸及不同的觸發requestFocus()的EditText時,焦點保留在當前的EditText上,另一個焦點圖標顯示在EditText中,它指示了焦點。

幫助,請

這裏是我的佈局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:custom="http://schemas.android.com/apk/res/com.cellap.tq" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:focusable="true" 
android:focusableInTouchMode="true" 
android:background="@drawable/create_account_background" > 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:layout_marginTop="70dp" 
    android:layout_marginLeft="5dp" 
    android:layout_marginRight="10dp"> 

    <TextView 
     android:id="@+id/userTextView" 
     android:layout_width="100dp" 
     android:layout_height="wrap_content" 
     android:textColor="#F4DFA7" 
     android:layout_marginRight="5dp" 
     android:text="Username" 
     android:gravity="right" 
     android:layout_gravity="center_vertical"/> 

    <EditText 
     android:id="@+id/userEditText" 
     android:inputType="text|textEmailAddress" 
     android:layout_width="fill_parent" 

     android:layout_height="30dp" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:maxLength="64" 
     android:background="@drawable/edit_text" 
     android:layout_gravity="center_vertical|right" 
     android:textColor="@android:color/white"> 

    </EditText> 
</LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_marginTop="5dp" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="10dp"> 

     <TextView 
      android:id="@+id/passTextView" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:textColor="#F4DFA7" 
      android:layout_marginRight="5dp" 
      android:gravity="right" 
      android:text="Password"/> 

     <EditText 
      android:id="@+id/passEditText" 
      android:layout_width="fill_parent" 
      android:layout_height="30dp" 

      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:maxLength="30" 
      android:layout_gravity="center_vertical" 
      android:inputType="textPassword" 
      android:textColor="@android:color/white" 
      android:background="@drawable/edit_text"> 


     </EditText> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_marginTop="5dp" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="10dp"> 

     <TextView 
      android:id="@+id/passConfirmTextView" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:textColor="#F4DFA7" 
      android:layout_marginRight="5dp" 
      android:gravity="right" 
      android:text="Confirm password"/> 

     <EditText 
      android:id="@+id/passConfirmEditText" 
      android:layout_width="fill_parent" 
      android:layout_height="30dp" 

      android:layout_gravity="center_vertical" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:maxLength="30" 
      android:inputType="textPassword" 
      android:background="@drawable/edit_text" 
      android:textColor="@android:color/white"> 


     </EditText> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_marginTop="5dp" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="10dp"> 

     <TextView 
      android:id="@+id/emailTextView" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:textColor="#F4DFA7" 
      android:layout_marginRight="5dp" 
      android:gravity="right" 
      android:text="Email"/> 

     <EditText 
      android:id="@+id/emailEditText" 
      android:layout_width="fill_parent" 
      android:layout_height="30dp" 

      android:layout_gravity="center_vertical" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:maxLength="255" 
      android:scrollHorizontally="false" 
      android:inputType="textEmailAddress" 
      android:background="@drawable/edit_text" 
      android:textColor="@android:color/white"> 


     </EditText> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_marginTop="5dp" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="10dp"> 

     <TextView 
      android:id="@+id/confirmEmailTextView" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:textColor="#F4DFA7" 
      android:layout_marginRight="5dp" 
      android:gravity="right" 
      android:text="Confirm email"/> 

     <EditText 
      android:id="@+id/confirmEmailEditText" 
      android:layout_width="fill_parent" 
      android:layout_height="30dp" 

      android:layout_gravity="center_vertical" 
      android:maxLength="255" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:inputType="textEmailAddress" 
      android:background="@drawable/edit_text" 
      android:textColor="@android:color/white"> 


     </EditText> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:layout_marginTop="5dp" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="10dp"> 

     <TextView 
      android:id="@+id/signupTextView" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:textColor="#F4DFA7" 
      android:layout_marginRight="5dp" 
      android:gravity="right" 
      android:text="Sign up:"/> 

     <TextView 
      android:id="@+id/signUpText" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:textColor="#FF0000" 
      android:paddingRight="5dp" 

      /> 



    </LinearLayout> 


    <com.cellap.tq.ButtonView 
     android:id="@+id/create_btn" 
     android:layout_width="216dp" 
     android:layout_height="49dp" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginTop="30dp" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     custom:button="create_btn"/> 


    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:orientation="horizontal" 
     android:layout_marginTop="15dp" 
     android:layout_marginBottom="5dp" 
     android:layout_marginLeft="30dp" 
     android:layout_marginRight="30dp"> 

     <Button 
      android:id="@+id/fbconnect_btn" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:layout_marginRight="5dp" 
      android:background="@drawable/fbconnect_btn"/> 

    </LinearLayout> 

在代碼中,我做這樣的:

final EditText userEditText = (EditText)findViewById(R.id.userEditText); 

    userEditText.setOnFocusChangeListener(new OnFocusChangeListener() { 

     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if(!hasFocus){ 
       Log.i(TAG, "userEditText lost focus"); 

       m_userName = userEditText.getText().toString(); 
       if(m_userName.length() < 6){ 
        m_signUpText.setText("Username should have at least 6 characters"); 
        userEditText.requestFocus(); 
       } 
       else{ 
        checkUserNameExists(); 
       } 

      } 
     } 
    }); 

回答

1

找到了解決辦法here

此解決方案(無需添加機器人:可調焦= 「真」 \機器人:focusableInTouchMode = 「真」):

final EditText userEditText = (EditText)findViewById(R.id.userEditText); 

userEditText.setOnFocusChangeListener(new OnFocusChangeListener() { 

    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if(!hasFocus){ 
      Log.i(TAG, "userEditText lost focus"); 
      if(null == m_requestFocus){ 
       m_userName = userEditText.getText().toString(); 
       if(m_userName.length() < 6){ 
        m_signUpText.setText("Username should have at least 6 characters"); 
        m_requestFocus = userEditText; 
       } 
       else{ 
        checkUserNameExists(); 
       } 
      } 
     } 
     else{ 
      if(null != m_requestFocus & m_requestFocus != userEditText){ 
       v.clearFocus(); 
       m_requestFocus.requestFocus(); 
       m_requestFocus = null; 
      } 
     } 
    } 
}); 

要澄清的問題:

用戶編輯EditText A - >用戶觸摸EditText B編輯它 - > EditText調用onFocusListener.onFocusChanged - > EditText一個requestFocus - > EditText B仍然有焦點並鍵入任何文本,寫入其編輯文本。只有一個焦點的標記,出現在EditText答:

0

首先,爲什麼你提供

android:focusable="true" android:focusableInTouchMode="true"

來佈局,而不是EditText字段?

二 - requestFocus()從dev.andro定義: 「叫這嘗試焦點賦予特定視圖或者其後代之一。」

結論將是一個問題,因爲我很難理解你所說的。這是工作,重點是停留在userEditText但其他EditText是有選擇器聚焦View?

+0

我提供的,因爲多數民衆贊成我在類似的問題中看到了一些答案。如果我不提供它,它也會這樣做。 我不明白你的意思是選擇器,但編輯我的問題來澄清它。 – piojo 2011-12-25 22:18:45

0

This適合我,它看起來不那麼hackish。

所做的是將Runnable中的requestFocus()發送到進程消息隊列。與上面的鏈接不同,我不需要清除其他字段的焦點,也不需要postDelayed。我的代碼

 new Handler().post(new Runnable() { 

       @Override 
       public void run() { 
        ev1.requestFocus(); 
       } 
     }); 
4

你可以聽這個動作EditorInfo.IME_ACTION_NEXT爲先的EditText,然後要求重點此調用requestFocus()第二個,這是一個例子:

firstEditText.setOnEditorActionListener(new OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView v, int actionId, 
       KeyEvent event) { 

      if (actionId == EditorInfo.IME_ACTION_NEXT) { 
       secondEditText.requestFocus(); 
       return true; 
      } 
      return false; 
     } 
    }); 
+0

正是我需要的!謝謝 – Jey10 2016-04-01 21:16:59

相關問題