Android接口回调的理解

1.各种理解

 <1>说白了,就是拿到对象引用,调其方法 

 <2>实际上就是利用多态的方式调用而已

 <3>其实很容易理解的,定义接口,然后提供一个外部的接口设置进去,然后就注册事件,外部的就是真正做事情的地方,注册事件的一定是外部设置进去的接口类,上面代码中setListener必须在注册之前设置进去,不然就无法触发真正的实现

2.某给的代码示例

3.看下简单的接口回调在Android中应用。

左右各一个fragment,点击左侧的item,通过右侧的fragment请求操作,并返回数据到左侧fragment,显示在上角。

接口:

public interface CallBack {
     void solve(String result);
}

MainActivity布局

<fragment
        android:id="@+id/list_fragment"
        android:layout_height="match_parent"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:name="myapplication.com.mycallback.BlankFragment"
        />
    <fragment
        android:id="@+id/show_fragment"
        android:layout_height="match_parent"
        android:layout_width="0dp"
        android:layout_weight="2"
        android:name="myapplication.com.mycallback.Blank2Fragment"
        />

fragment2

public class Blank2Fragment extends Fragment {


    public Blank2Fragment() {
        // Required empty public constructor
    }


    public void execute(CallBack callBack,String s){

        String result="";

        /**
         * 模拟耗时
         */
        for(int i=0; i<10000;i++){

        }

        if(s.equals("数据1")){
            result=s+s;
        }
        if(s.equals("数据2")){
            result=s+s;
        }
        if(s.equals("数据3")){
            result=s+s;
        }
        if(s.equals("数据4")){
            result=s+s;
        }
        if(s.equals("数据5")){
            result=s+s;
        }

        callBack.solve(result);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank2, container, false);
    }

}

fragment1

public class BlankFragment extends Fragment  implements CallBack{

    ListView listview;
    View view;
    TextView textView;
    Blank2Fragment blank2Fragment;
    public BlankFragment() {
        // Required empty public constructor
        blank2Fragment=new Blank2Fragment();
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view=inflater.inflate(R.layout.fragment_blank, container, false);
        listview= (ListView) view.findViewById(R.id.listview);
        textView= (TextView) view.findViewById(R.id.textView);
        String str[]={"数据1","数据2","数据3","数据4","数据5"};
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1,str);
        listview.setAdapter(adapter);
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                String s= (String) adapterView.getItemAtPosition(i);
                blank2Fragment.execute(BlankFragment.this,s);
            }
        });
        return view;
    }
    @Override
    public void solve(String result) {
        textView.setText(result);
    }
}

 4.看看代码中的view的Onclick

 textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            
            }
        });

在看看setOnClickListener

   public void setOnClickListener(View.OnClickListener l) {
        throw new RuntimeException("Stub!");
    }
    public interface OnClickListener {
        void onClick(View var1);
    }

其代码大致如下:

public class MyView {


    public void setOnListener(OnClickListener onClickListener){
        onClickListener.onClick();
    }

    public interface OnClickListener {
        void onClick();
    }


}
           MyView myView=new MyView();
                myView.setOnListener(new MyView.OnClickListener() {
                    @Override
                    public void onClick() {

                    }
                });

5.自己的理解

把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被调用类实现的接口的方法。

这里既是把OnClickListener接口的实现类 new MyView.OnClickListener()赋值给该接口声明的接口变量。

就View的点击事件来看,声明接口OnClickListener ,通过setOnListener传入接口实现类充当变量,在实现接口方法。

今天多一点积累,明天少一分烦恼
原文地址:https://www.cnblogs.com/galibujianbusana/p/6505307.html