★ Android基础篇-你应该知道的Android Interface

★ Android基础篇-你应该知道的Android Interface

Interface 详解

简单的说 java都是通过继承父类,重写父类的方法来实现一些功能,继承只能单继承,而接口Interface是可以实现多个的,恰好补充了这个缺点。

接口可以实现多个,可以通过接口来实现不同的方法,这个接口可以看作是一些功能(类的本身不具有这个功能,则它可以通过实现一些接口来实现这个功能)

注意 使用接口一定要有回调!

语言表达能力有限,上个代码可以帮助理解

(1) 创建接口

public interface ToastListener {
   
    void showToast();
}

(2) 创建接口的回调,以及设置一个方法调用接口

public class ToastListenerClass {
   

    private ToastListener toastListener;

    public void setToastListener(ToastListener toastListener) {
   
        this.toastListener = toastListener;
    }

    public void getToastListener() {
   
        toastListener.showToast();
    }
}

(3) 点击按钮弹窗吐司

public class MainActivity extends AppCompatActivity implements View.OnClickListener,ToastListener {
   

    private Button btn;
 
    private ToastListenerClass listenerClass;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intView();
    }

    private void intView() {
   
        btn = (Button) findViewById(R.id.btn);
        listenerClass = new ToastListenerClass();
        //设置弹出吐司的监听
        listenerClass.setToastListener(this);
        btn.setOnClickListener(this);
       
    }



    @Override
    public void showToast() {
   
        Toast.makeText(this,"弹出的吐司?",Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onClick(View view) {
   
        switch (view.getId()){
   
            case R.id.btn:
                //调用接口类,使之弹出吐司
                listenerClass.getToastListener();
                break;
            default:
                break;
        }
    }

   
}

先设置吐司的监听listenerClass.setToastListener(this),设置之后就会实现ToastListener 这个接口,然后就会回调showToast()方法。 而这一切的开关都在 listenerClass.getToastListener()方法的调用。

效果入下

在这里插入图片描述

之前只是简单的说了一下接口,只是知道它定义以后,设置并回调…OK我再举个栗子,加深一下印象

使用Interface进行传值
(设置一个DialogFragment页面)

public class LoginDialogFragment extends DialogFragment {
   

    private EditText mUsername;
    private EditText mPassword;

    //定义一个接口 用来传值
    public interface LoginInputListener
    {
   
        void onLoginInputComplete(String username, String password);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
   
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        View view = getActivity().getLayoutInflater().inflate(R.layout.fragment, null);
        mUsername = (EditText) view.findViewById(R.id.id_txt_username);
        mPassword = (EditText) view.findViewById(R.id.id_txt_password);

        builder.setView(view)
                .setPositiveButton("sign in", new DialogInterface.OnClickListener() {
   
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
   
                        LoginInputListener listener = (LoginInputListener) getActivity();
     //可以看到 调用这个接口对象,并把值存入进去 listener.onLoginInputComplete(mUsername
                                .getText().toString(), mPassword
                                .getText().toString());
                    }
                }).setNegativeButton("Cancel", null);

        return builder.create();
    }
}

主页面调用这个接口 可以获取值

public class MainActivity extends AppCompatActivity implements View.OnClickListener,LoginDialogFragment.LoginInputListener {
   

    private Button btn1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intView();
    }

    private void intView() {
   
        btn1 = (Button) findViewById(R.id.btn1);   
        btn1.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
   
        switch (view.getId()){
   
            case R.id.btn1:
                LoginDialogFragment dialog = new LoginDialogFragment();
                dialog.show(getFragmentManager(), "loginDialog");
                break;

            default:
                break;
        }
    }

    @Override
    public void onLoginInputComplete(String username, String password) {
   
        Toast.makeText(this, "帐号:" + username + ", 密码 :" + password,
                Toast.LENGTH_SHORT).show();
    }
}

效果图如下

在这里插入图片描述

接下来总结一下接口的使用

<1> 接口一般定义的是常量和一些抽象方法。抽象类中可以包含抽象方法,也可以有非抽象方法,但是有抽象方法的类一定是抽象类。抽象方法不能有方法体。

<2> 在引用接口时,接口的引用指向实现的对象,尽量定义为接口或父类的引用。这其中有可能用到多态的知识。引用接口用implements。

<3> 接口(interface)只能定义抽象方法而且默认为是Public。常量是public static final 修饰的

<4> 通过implements来引用接口。例:Class runnrtmp inplements runner.

<5> 多个无关类可以实现一个接口,!!!接口的引用指向实现的对象。

<6> 一个类可以实现多个无关的接口(这点和继承要有所区别)

<7> 和继承一样,接口与实现类之间存在多态性。

<8> 接口可以继承其他的接口,并添加新的属性和抽象方法。

<9> 在类中实现接口的方法时必须加上public修饰符

【源码地址】

[希望这篇文章可以帮到你]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2832.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 海量数据处理分析

    海量数据处理分析 笔者在实际工作中,有幸接触到海量的数据处理问题,对其进行处理是一项艰巨而复杂的任务。原因有以下几个方面:一、数据量过大,数据中什么情况都可能存在。如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至过亿,那不是手工能解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都可能存在,例如,数据中某处格式出了问题

  • JavaScript数组求和_js获取对象数组的第一个元素

    JavaScript数组求和_js获取对象数组的第一个元素您如何找到其元素的总和?好吧,解决方案是一个array.reduce()方法。Array.prototype.reduce()函数可用于遍历数组,将当前元素值添加到先前项目值的总和中。Javascript和数组要查找两个数字的Java和数组,请使用array.reduce()方法。reduce()方法将数组简化为单个值。reduce()函数为数组的每个值(从左到右)执行提供的函数。方法的返回值存储在累加器中(结果/总计)。句法array.reduce(function(total,cur

  • 华为服务器装系统怎么选pxe,服务器设置pxe启动

    华为服务器装系统怎么选pxe,服务器设置pxe启动服务器设置pxe启动内容精选换一换全量复制会把源端服务器所有数据都复制到目的端,复制速度取决源端服务器出网带宽和目的端服务器入网带宽(两者取较小者)。开始服务器复制后,禁止重启源端及Agent,否则会导致迁移失败。已设置目的端,参考设置迁移目的端。当“迁移阶段”为时才可启动全量复制。或勾选待迁移的服务器,单击服务器名称/ID上方的“开始”,弹出“开始”窗口,单击“确定”,本节介绍在设置目的端时,…

  • WinINet 与 WinHTTP简介

    WinINet 与 WinHTTP简介之前一直有听到WinHTTP和WinINet这两种网络服务,是Microsoft提供的两套API,但一直没有系统的用过,趁次机会一起来将这个整理一下。    首先了解一下WinINet:    WinInet,全称TheMicrosoftWindowsInternet,应用程序可以通过它提供的API访问标准的网络协议,比如FTP和HTTP等。WinINet不支持服务端的

  • 连不上docker mysql_docker跨主机通信

    连不上docker mysql_docker跨主机通信宿主机连接docker中的mysqldokcer安装mysqldockerrun\–namemysql\-v$PWD/mysql:/var/lib/mysql\-p3306:3306\-eMYSQL_ROOT_PASSWORD=123456\-dmysql:5.7宿主机连接docker中的mysql错误的连接方式$mysql-uroot-pEnterpasswor…

  • node.js linux安装_node安装及环境配置

    node.js linux安装_node安装及环境配置版本:node-v10.16.0-linux-x64.tar.xzwgethttps://nodejs.org/dist/v10.16.0/node-v10.16.0-linux-x64.tar.xz1、上传到服务器目录:/usr/local/soft2、解压安装包cd/usr/local/softtarzxvfnode-v8.9.1-linux-x64.tar.gz…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号