Android 中的接口回调

2015-05-11 11:44:38 661浏览

    在Android中到处可见接口回调机制,尤其是UI事件处理方面。举一个最常见的例子button点击事件,button有一个点击方法onClick(),我们知道onclick()是一个回调方法,当用户点击button就执行这个方法。在源码中是这样定义的:

1.    

 

 //这个是View的一个回调接口

2.      /**

3.      * Interface definition for a callback to be invoked when a view is clicked.

4.      */

5.      public interface OnClickListener {

6.      /**

7.      * Called when a view has been clicked.

8.      *

9.      * @param v The view that was clicked.

10.  */

11.  void onClick(View v);

12.  }

下面看一个简单的例子:

1.      import android.app.Activity;

2.      import android.os.Bundle;

3.      import android.view.View;

4.      import android.view.View.OnClickListener;

5.      import android.widget.Button;

6.      import android.widget.Toast;

7.       

8.      public class MainActivity extends Activity implements OnClickListener{

9.       

10.  private Button button;

11.   

12.  @Override

13.  public void onCreate(Bundle savedInstanceState) {

14.  super.onCreate(savedInstanceState);

15.  setContentView(R.layout.activity_main);

16.  button = (Button)findViewById(R.id.button1);

17.   

18.   

19.  button.setOnClickListener(this);

20.  }

21.   

22.  @Override

23.  public void onClick(View v) {

24.  Toast.makeText(getApplication(), "OnClick", Toast.LENGTH_LONG).show();

25.  }

26.   

27.  }

这就是一个很典型的例子,当然也可以这样写:

29.  import android.app.Activity;

30.  import android.os.Bundle;

31.  import android.view.View;

32.  import android.view.View.OnClickListener;

33.  import android.widget.Button;

34.   

35.  public class SSSS extends Activity {

36.   

37.  private Button button;

38.  private OnClickListener clickListener = new OnClickListener() {

39.   

40.  @Override

41.  public void onClick(View v) {

42.  // TODO Auto-generated method stub

43.   

44.  }

45.  };

46.   

47.  @Override

48.  protected void onCreate(Bundle savedInstanceState) {

49.  // TODO Auto-generated method stub

50.  super.onCreate(savedInstanceState);

51.  button = (Button)findViewById(R.id.button1);

52.  button.setOnClickListener(clickListener);

53.  }

54.   

55.  }

    下面是View类的setOnClickListener方法,把和回调相关代码贴出来。什么贴它呢,因为Button继承于TextView,而TextView继承于View,在View里面处理的回调:

1.    

  public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {

2.      /**

3.      * Listener used to dispatch click events.

4.      * This field should be made private, so it is hidden from the SDK.

5.      * {@hide}

6.      */

7.      protected OnClickListener mOnClickListener;

8.       

9.      /**

10.  *

11.  * Register a callback to be invoked when this view is clicked. If this view is not

12.  * clickable, it becomes clickable.

13.  *

14.  * @param l The callback that will run

15.  *

16.  * @see #setClickable(boolean)

17.  */

18.   

19.  public void setOnClickListener(OnClickListener l) {

20.  if (!isClickable()) {

21.  setClickable(true);

22.  }

23.  mOnClickListener = l;

24.  }

25.   

26.   

27.  /**

28.  * Call this view's OnClickListener, if it is defined.

29.  *

30.  * @return True there was an assigned OnClickListener that was called, false

31.  * otherwise is returned.

32.  */

33.  public boolean performClick() {

34.  sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);

35.   

36.  if (mOnClickListener != null) {

37.  playSoundEffect(SoundEffectConstants.CLICK);

38.   

39.  mOnClickListener.onClick(this);

40.  return true;

41.  }

42.   

43.  return false;

44.  }

45.  }



    那现在一起来总结一下基本的回调是如何实现的,首先创建一个接口,这个接口用于你在某个情景下执行相应的操作。接着创建一个功能类,比如这个类可以显示一个对话框、可以滑动菜单、可以下载数据等等。然后,在这个类里面声明回调接口的对象,之后在这个类里面创建在某个情景下需要执行的方法,而且在这个方法里面为声明的接口对象赋值。最后在其他的类中使用这个功能类就可以了。所以说,最少也是需要三个类共同来完成这个回调机制。
    这下大家应该就比较明白了,那我们就自己按照这个方式和流程完成一个这样的例子。以Dialog为例,一般我们在开发时候,经常会用到Dialog。比如一个弹出框,里面有确认和取消。通常情况下,我们可能会这样写:

1.      

final Dialog dialog = new Dialog(this, R.style.MyDialogStyle);

2.      dialog.setContentView(R.layout.dialog_exit_train);

3.      dialog.show();

4.      ImageButton ib_affirm = (ImageButton) dialog

5.      .findViewById(R.id.dialog_exit_ib_affirm);

6.      ImageButton ib_cancel = (ImageButton) dialog

7.      .findViewById(R.id.dialog_exit_ib_cancel);

8.       

9.      ib_affirm.setOnClickListener(new View.OnClickListener() {

10.   

11.  @Override

12.  public void onClick(View v) {

13.   

14.  saveUserData();

15.  dialog.dismiss();

16.  TestActivity.this.finish();

17.  }

18.  });

19.   

20.  ib_cancel.setOnClickListener(new View.OnClickListener() {

21.   

22.  @Override

23.  public void onClick(View v) {

24.   

25.  dialog.dismiss();

26.  }
 [html] view plaincopy在CODE上查看代码片派生到我的代码片

31.  import android.app.Dialog;

32.  import android.content.Context;

33.  import android.os.Bundle;

34.  import android.text.TextPaint;

35.  import android.view.View;

36.  import android.view.Window;

37.  import android.view.WindowManager;

38.  import android.widget.Button;

39.  import android.widget.TextView;

40.   

41.  import com.fanfou.app.opensource.R;

42.   

43.  /**

44.  *

45.  *

46.  */

47.  public class AlertInfoDialog extends Dialog implements View.OnClickListener {

48.  //创建接口

49.  public static interface OnOKClickListener {

50.  public void onOKClick();

51.  }

52.   

53.  private final Context mContext;

54.  private TextView mTitleView;

55.  private TextView mTextView;

56.   

57.  private Button mButtonOk;

58.  private CharSequence mTitle;

59.   

60.  private CharSequence mText;

61.  //生命接口对象

62.  private OnOKClickListener mClickListener;

63.   

64.  public AlertInfoDialog(final Context context, final String title,

65.  final String text) {

66.  super(context, R.style.Dialog);

67.  this.mContext = context;

68.  this.mTitle = title;

69.  this.mText = text;

70.  }

71.   

72.  private void init() {

73.  setContentView(R.layout.dialog_alert);

74.   

75.  this.mTitleView = (TextView) findViewById(R.id.title);

76.  final TextPaint tp = this.mTitleView.getPaint();

77.  tp.setFakeBoldText(true);

78.  this.mTitleView.setText(this.mTitle);

79.   

80.  this.mTextView = (TextView) findViewById(R.id.text);

81.  this.mTextView.setText(this.mText);

82.   

83.  this.mButtonOk = (Button) findViewById(R.id.button_ok);

84.  this.mButtonOk.setOnClickListener(this);

85.   

86.  }

27.  });
28.   
29.   

标签:

热门专区

暂无热门资讯

课程推荐

微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
京ICP备12003911号-6   Copyright © 2013 - 2019

京公网安备 11010802030908号