如何为自定义控件创建事件

时间:2014-04-07 13:34:21

标签: android android-layout android-view android-custom-view android-event

我创建了一个用于创建密码布局的库项目。我创建了四个用于输入密码的文本框,每个文本框只能包含一个字符。但我无法创建一个返回密码的事件。我想在用户输入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 个答案:

答案 0 :(得分: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);
}

之后,请像使用onClickListener一样使用它。例如:

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