zoukankan      html  css  js  c++  java
  • 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传入接口实现类充当变量,在实现接口方法。

    今天多一点积累,明天少一分烦恼
  • 相关阅读:
    Request
    HTTP
    mysql递归查询函数
    redis 6.0.9配置文件详解
    java对数据进行加密、解密
    java Base64编码、解码
    nginx基础使用
    linux指令笔记
    Spring 常用注解粗陋看法
    docker 已有容器修改容器配置
  • 原文地址:https://www.cnblogs.com/galibujianbusana/p/6505307.html
Copyright © 2011-2022 走看看