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传入接口实现类充当变量,在实现接口方法。