今天用到了android中的回调机制,简单写一下学习心得。我运用回调机制为了给一个自定义控件添加一个自定义监听者,使其达到想要的目的。我先简单说一下下面的代码达到的效果。show.java继承linearlayout,可以在里面动态添加删除textview,设置一个内容改变监听者IsChangeListener来监听show里面的值是否改变,从而在mainactivity中更改ui。
这里是MainActivity.java,代码很简单,初始化三个控件,一个是自定义的show,另外两个是系统的,一个edittext,
一个button,button设置点击事件,将edittext中的值传入show,并在show中添加textview
import
com.example.inlisten.Show.IsChangeListener;
import
android.app.Activity;
import
android.os.Bundle;
import
android.view.Menu;
import
android.view.MenuItem;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
import
android.widget.EditText;
import
android.widget.Toast;
public
class
MainActivity
extends
Activity {
private
Show show;
private
EditText et;
private
Button btn;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = (Show) findViewById(R.id.show);
et = (EditText) findViewById(R.id.et);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
// TODO Auto-generated method stub
show.addValue(et.getText().toString().trim());
et.setText(
""
);
}
});
//4. 在mainactivity里面设置ischange方法
show.setIsChangeListener(
new
IsChangeListener() {
@Override
public
void
isChange() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.
this
,
"ischange"
, Toast.LENGTH_SHORT).show();
}
});
}
}
----------------------------------------------------------------------------------------------
这里是show.java,通过addvalue()来讲上面edittext的值加入到arraylist中,通过draw()绘制,遍历arraylist,
增加textview,delete()同理,设置布尔型ischange来判断arraylist是否改变,接下来就是回调机制了,主要有如下几
步:
1.
定义接口IsChangeListener(),里面有一个方法isChange()
2.
定义接口调用方法setIsChangeListener()
将ischangelistener传进来
3.
在需要的地方,当然这里就是在draw()方法里检测ischange,然后调用ischangelist
ener里面的ischange方法
4.
在mainactivity里面设置ischange方法 这样就完成了通过回调机制实现了自定义的
监听者,关于布局文件很简单,就是一个linearlayout里面增加上面讲的三个控件,没什么说的。注释比较少,不过大部分
内容我都写在这上面了,这段实例还是挺简单的。
import
java.util.ArrayList;
import
java.util.List;
import
android.content.Context;
import
android.util.AttributeSet;
import
android.view.View;
import
android.widget.LinearLayout;
import
android.widget.TextView;
public
class
Show
extends
LinearLayout {
private
Context context;
private
List<String> array;
private
IsChangeListener isChangeListener;
private
boolean
ischange =
false
;
public
Show(Context context, AttributeSet attrs) {
super
(context, attrs);
// TODO Auto-generated constructor stub
this
.context = context;
array =
new
ArrayList<String>();
}
public
void
addValue(String str){
array.add(str);
ischange =
true
;
draw();
}
public
void
deleteValue(String str){
array.remove(str);
ischange =
true
;
draw();
}
public
void
draw(){
removeAllViews();
for
(String text : array){
TextView tv =
new
TextView(context);
tv.setText(text);
tv.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
// TODO Auto-generated method stub
TextView t = (TextView) v;
deleteValue(t.getText().toString());
}
});
addView(tv);
//3. 在需要的地方,当然这里就是在draw()方法里检测ischange,然后调用ischangelistener里面的ischange方法
if
(ischange){
isChangeListener.isChange();
}
}
}
//1,定义接口IsChangeListener(),里面有一个方法isChange()
public
interface
IsChangeListener{
public
void
isChange();
}
//2.定义接口调用方法setIsChangeListener()将ischangelistener传进来
public
void
setIsChangeListener(IsChangeListener isChangeListener){
this
.isChangeListener = isChangeListener;
}
}