每个view都有多种可以绑定的事件监听器,可以使用setOnEvent
模式实现一个特定的事件监听类实现,对所有view都有效的包括:
setOnClickListener
- 当view被点击的时候回调
setOnDragListener
-当view被拖动时回调
setOnFocusChangeListener
- 当view改变焦点的时候回调
setOnGenericMotionListener
- 任意的手势时回调
setOnHoverListener
-在视图上悬停的时候调用
setOnKeyListener
- 当view有焦点时候按硬件键时候回调
setOnLongClickListener
- 长时间按压时回调
setOnTouchListener
- 触摸view回调
Button btnExample = (Button) findViewById(R.id.btnExample);
btnExample.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do something here
}
使用android:onClick="sendMessage"
属性
对于AdapterView
也需要一些重要的监听器:
- setOnItemClickListener
当其中的一项被点击的时候
- setOnItemLongClickListener
当其中的一项长时间点击时
- setOnItemSelectedListener
当某项被选中时
问题: 有时当某一项过于复杂不能正确相应点击操作时,可能是因为项内的item获取了焦点,查看http://stackoverflow.com/questions/6703390/listview-setonitemclicklistener-not-working-by-adding-button并且在item布局文件中加入android:descendantFocusability = "blocksDescendants"
除了上述的监听器,对于输入模块有几个特别的:
addTextChangedListener
- 每当输入区域的内容改变时调用
setOnEditorActionListener
- 当软键盘上的动作按钮被按压时调用
EditText etValue = (EditText) findViewById(R.id.etValue);
etValue.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Fires right as the text is being changed (even supplies the range of text)
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// Fires right before text is changing
}
@Override
public void afterTextChanged(Editable s) {
// Fires right after the text has changed
tvDisplay.setText(s.toString());
}
});
可以在用户使用软键盘完成输入时需要做出动作时调用,首先我们需要建立一个动作按钮例如软件盘中”enter” 键
<EditText
android:inputType="text"
android:singleLine="true"
android:imeOptions="actionDone"
android:id="@+id/etValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<requestFocus />
EditText>
特别的是,singleLine
和imeOptions
是输入按钮的要求,现在我们可以建立监听器了:
etValue.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
String text = v.getText().toString();
Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
这适用于的情景:输入完成后明确要求展现一个动作的要求
与EditText相似,许多inputView有自己的监听器例如NumberPickers有setOnValueChangedListener
和SeekBar有setOnSeekBarChangeListener
NumberPicker npValue = (NumberPicker) findViewById(R.id.npValue);
npValue.setOnValueChangedListener(new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
// Changes based on number here
}
});