1

我已經創建了用於創建密碼佈局的庫項目。我創建了四個用於輸入密碼的文本框,每個文本框只能包含一個字符。但我無法創建返回密碼的事件。當用戶輸入4位密碼時,我想發起一個事件。如何爲自定義控件創建事件

這裏是XML佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<LinearLayout 
    android:id="@+id/ll_passcodedigits" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_horizontal" > 

    <EditText 
     android:id="@+id/et_passcode" 
     android:layout_width="60dp" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:inputType="textPassword" 
     android:maxLength="1" /> 

    <EditText 
     android:id="@+id/et_passcode2" 
     android:layout_width="60dp" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:inputType="textPassword" 
     android:maxLength="1" /> 

    <EditText 
     android:id="@+id/et_passcode3" 
     android:layout_width="60dp" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:inputType="textPassword" 
     android:maxLength="1" /> 

    <EditText 
     android:id="@+id/et_passcode4" 
     android:layout_width="60dp" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:inputType="textPassword" 
     android:maxLength="1" /> 
</LinearLayout> 

</LinearLayout> 

,這裏是類的代碼:

public class Passcode extends LinearLayout { 

EditText firstEditText, secondEditText, thirdEditText, fourEditText; 

public Passcode(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 

} 

public Passcode(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    LayoutInflater inflater = LayoutInflater.from(context); 
    inflater.inflate(R.layout.passcode_layout, this); 

    loadViews(); 
} 

private void loadViews() { 
    firstEditText = (EditText) findViewById(R.id.et_passcode); 
    secondEditText = (EditText) findViewById(R.id.et_passcode2); 
    thirdEditText = (EditText) findViewById(R.id.et_passcode3); 
    fourEditText = (EditText) findViewById(R.id.et_passcode4); 

    // Text changed event for first EditText 
    firstEditText.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 
      if (s.length() == 1) { 
       firstEditText.setFocusable(false); 
       secondEditText.requestFocus(); 
      } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    // Text changed event for second EditText 
    secondEditText.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 
      if (s.length() == 1) { 
       secondEditText.setFocusable(false); 
       thirdEditText.requestFocus(); 
      } else if (s.length() == 0) { 
       firstEditText.setFocusable(true); 
       firstEditText.requestFocus(); 
      } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    // Text changed event for third EditText 
    thirdEditText.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 

      if (s.length() == 1) { 
       thirdEditText.setFocusable(false); 
       fourEditText.requestFocus(); 
      } else if (s.length() == 0) { 
       secondEditText.setFocusable(true); 
       secondEditText.requestFocus(); 

      } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    // Text changed event for fourth EditText 
    fourEditText.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 

      if (s.length() == 1) { 
       thirdEditText.setFocusable(false); 

      } else if (s.length() == 0) { 
       thirdEditText.setFocusable(true); 
       thirdEditText.requestFocus(); 

      } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

     } 
    }); 
} 



    } 

回答

1

您可以定義自己的聽衆。

一下添加到Passcode

public interface OnPasscodeCompletedListener { 
    public void onComplete(String passcode); 
} 

private OnPasscodeCompletedListener listener = null; 

public void setOnPasscodeCompletedListener(OnPasscodeCompletedListener listener) { 
    this.listener = listener; 
} 

然後,在你所有的文本改變了聽衆,添加此當你有所有4位數字:

if (listener != null) { 
    // Concatenate the values from EditText to create the passcode 
    listener.onComplete(passcode); 
} 

之後,用它怎麼樣你」 d使用onClickListener。例如:

private OnPasscodeCompletedListener onPasscodeCompletedListener 
    = new OnPasscodeCompletedListener() { 
    @Override 
    public void onComplete(String passcode) { 
    Log.i(TAG, "passcode = " + passcode); 
    } 
}; 
passcodeView.setOnPasscodeCompletedListener(onPasscodeCompletedListener); 
+0

謝謝。它工作正常 –