初涉android中的回调机制

来源:互联网 发布:单片机管脚图 编辑:程序博客网 时间:2024/06/10 23:51

今天用到了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,然后调用ischangelistener里面的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;
    }
 
}

0 0
原创粉丝点击