★ 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修饰符

【源码地址】

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 复现awvs——HTTP.SYS远程代码执行漏洞(MS15-034)

    复现awvs——HTTP.SYS远程代码执行漏洞(MS15-034)一、MS15-034漏洞介绍HTTP协议堆栈(HTTP.sys)中存在一个远程代码执行漏洞,当HTTP.sys错误地解析特制HTTP请求时,会导致该漏洞。成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任意代码。造成危害如下:(1)远程读取IIS服务器的数据。(2)造成服务器系统蓝屏崩溃(最可怕)。二、影响范围对于Windows7、WindowsServer2008R2、Windows8、WindowsServer2012、Windows8.1和

    2022年7月18日
    22
  • 如何编写单元测试用例

    如何编写单元测试用例 一、单元测试的概念  单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入(测试用例)测试函数是否功能正常,并且返回了正确的输出。  测试的覆盖种类  1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。  2.判定覆盖(也叫分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次。  3.条件…

    2022年6月16日
    46
  • wireshark抓包工具详细说明及操作使用_wireshark抓包结果分析

    wireshark抓包工具详细说明及操作使用_wireshark抓包结果分析多年之后,愿你有清风与烈酒,也有人是你的归途。打开Wireshark抓包工具开始抓包会看到如下展开内容:这里我是对wlan进行抓包,192.168.2.112是我当前wifi的ip地址。点击某个包,可以查看具体内容,差不多刚好对于五层协议:Frame:物理层的数据帧概况。EthernetII:数据链路层以太网帧头部信息。InternetProtocolVersion4:互联网层I

    2025年9月24日
    4
  • Java链表的基本使用

    Java链表的基本使用得到的

    2022年5月3日
    33
  • linux驱动编写(总结篇)[通俗易懂]

    linux驱动编写(总结篇)[通俗易懂]【声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:feixiaoxing@163.com】01、linux驱动编写(入门)02、linux驱动编写(虚拟字符设备编写)03、linux驱动编写(字符设备编写框架)04、linux驱动编写(Kconfig文件和Makefile文件)05、linux驱动编写(块设备驱动代码)06、linux驱动编写(platfo……

    2022年7月26日
    6
  • 基于Opencv快速实现人脸识别(完整版)

    基于Opencv快速实现人脸识别(完整版)上篇博客:https://blog.csdn.net/beyond9305/article/details/92844258严格来说标题是有误的,只是单纯地对人脸进行了检测,而并非识别,opencv内置了检测分类器和识别器,这二者还是有很大不同的。这次进一步地研究这一块的知识,来一波真正意义上的人脸识别,查询的资料可能有点过时,但基本思想是没有毛病的,对一些函数也进行了更新,保证了功能的正常实…

    2022年6月7日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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