事件监听器

事件监听器

每个view都有多种可以绑定的事件监听器,可以使用setOnEvent 模式实现一个特定的事件监听类实现,对所有view都有效的包括:
setOnClickListener - 当view被点击的时候回调
setOnDragListener -当view被拖动时回调
setOnFocusChangeListener - 当view改变焦点的时候回调
setOnGenericMotionListener- 任意的手势时回调
setOnHoverListener -在视图上悬停的时候调用
setOnKeyListener - 当view有焦点时候按硬件键时候回调
setOnLongClickListener - 长时间按压时回调
setOnTouchListener- 触摸view回调

在java代码中

Button btnExample = (Button) findViewById(R.id.btnExample);
btnExample.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do something here    
    }

在XML文件中

使用android:onClick="sendMessage" 属性

适配器view 事件的监听

对于AdapterView 也需要一些重要的监听器:
- setOnItemClickListener 当其中的一项被点击的时候
- setOnItemLongClickListener 当其中的一项长时间点击时
- setOnItemSelectedListener 当某项被选中时
问题: 有时当某一项过于复杂不能正确相应点击操作时,可能是因为项内的item获取了焦点,查看http://stackoverflow.com/questions/6703390/listview-setonitemclicklistener-not-working-by-adding-button并且在item布局文件中加入android:descendantFocusability = "blocksDescendants"

EditText 共同的监听器

除了上述的监听器,对于输入模块有几个特别的:
addTextChangedListener - 每当输入区域的内容改变时调用
setOnEditorActionListener - 当软键盘上的动作按钮被按压时调用

TextChangeListener

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());
    }
});

OnEditorActionListener

可以在用户使用软键盘完成输入时需要做出动作时调用,首先我们需要建立一个动作按钮例如软件盘中”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>

特别的是,singleLineimeOptions 是输入按钮的要求,现在我们可以建立监听器了:

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;
    }
});

这适用于的情景:输入完成后明确要求展现一个动作的要求

Input View Listeners

与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
    }
});

你可能感兴趣的:(android学习)