2017-09-15 135 views
1

我正在使用視圖來輸入用戶的四位數PIN。用戶界面由4個edittext組成,每個edittext的maxLength設置爲1.在輸入編輯文本1的值時,焦點會轉移到第二個編輯文本等等。每個Edittext輸入類型是:numberPassword。Edittext輸入密碼,清除焦點後隱藏文字android

<EditText 
      android:id="@+id/ed_1" 
      android:layout_width="20dp" 
      android:layout_height="20dp" 
      android:gravity="center" 
      android:inputType="numberPassword" 
      android:maxLength="1" /> 

在java中,轉移焦點,我們已應用以下文本觀察者到每個的EditText的:

ed1.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (s.toString().length() == 1) { 
       ed1.clearFocus(); 
       ed2.requestFocus(); 
       ed2.setCursorVisible(true); 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 

問題是,的EditText的值不改變爲*,它示出了實輸入號碼(不改變爲密碼)。只有第一個和最後一個更改爲*,其中中心二意味着edittext 2和edittext 3仍然具有可見的密碼。

現在:我們有4個輸入Edittexts

所需的輸出應該是:| * | * | * | * |

當我們通過指定的java代碼填充值並切換焦點時,它們變爲:(輸入值:1234):| * | 2 | 3 | * |

如果我們重點關注中間編輯文本,則值更改爲密碼。是因爲消除了焦點,而將字段更改爲密碼所需的轉換時間需要更多時間?有沒有什麼方法可以強制將這個值更改爲密碼。

+0

因爲您沒有對該兩個編輯文本使用該屬性。設置此屬性android:inputType =「textPassword」及其完成的先生 –

+0

我希望它本來就這麼簡單。每個編輯文本都是問題中指定的編輯文本的精確複本。每個人都有android:inputType =「numberPassword」 – user3099103

+0

嘗試將代碼放入Runnable中,然後發佈它,這有幫助嗎? – lionscribe

回答

0

嘗試轉換

yourEditText.setTransformationMethod(new PasswordTransformationMethod()); 

這是一個困難的方法,但

String e1,e2,e3,e4; 
@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
if (s.toString().length() == 1 && !ed1.getText().equals("*")) { 
e1=ed1.getText(); 
ed1.setText("*"); 
ed2.requestFocus(); 
ed2.setCursorVisible(true); } } 

您可以使用此方法

+0

不工作!還是一樣的 – user3099103

+0

更新回答! –

+0

ed1.setText(「*」);在onTextChanged將再次調用條件爲true的onTextChanged,並將進入無限循環..因此導致ANR。 – user3099103

1

因爲您將maxLength設置爲1,所以它只會獲得單個字符。你也在onTextChanged中編寫了clearFocus的代碼,所以它會將焦點設置到下一個EditText。您必須在xml中像下面一樣更改。

<EditText 
    android:id="@+id/ed_1" 
    android:layout_width="20dp" 
    android:layout_height="20dp" 
    android:gravity="center" 
    android:inputType="numberPassword" 
    android:maxLength="4" /> 

也刪除onTextChanged()中的clearFocus。

+0

UI不能通過使用最大長度爲4的單一編輯文本來實現。我們需要4個編輯文本,每個編輯文本的最大長度爲1.並且在填充一個後,焦點應該切換到下一個編輯文本。 – user3099103

0

剛剛從你的代碼中刪除ed1.clearFocus();後運行以前的文字下面的代碼。不要強迫edittext放鬆焦點,只要告訴其他edittext重新獲得焦點ed2.requestFocus();。只要下一個edittext獲得焦點,以前的edittext就會自動移除焦點。它會首先轉換價值,然後離開它的焦點。

+0

試了一下。但無法正常工作 – user3099103

0

好像TextWatcher需要一些時間吧chenge密碼類型, 所以我想出了這個解決方案使用處理器,它工作正常。請嘗試以下代碼

ed1.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     if (s.toString().length() == 1) { 

      // use Handler for 1 second delay so that it will change text 
      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        ed2.requestFocus(); 
       } 
      },1000); 

     } 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 

    } 
}); 
+0

抱歉..不能正常工作 – user3099103

+0

你得到了什麼錯誤?它在我的機器上運行良好。 –