★ 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【目标检测】Labelme的改进——海量图片的自动标注「建议收藏」

    【目标检测】Labelme的改进——海量图片的自动标注「建议收藏」  深度学习一般需要对大量的图片进行标注,但是手动标注耗时耗力,所以模仿labelme软件的功能,使用程序对大批量的图片进行自动标注,大大减少手动操作。下面介绍如何实现对大批量的图片进行标注。自动标注的程序实现:https://github.com/shuyucool/Labelme.git程序内容均为原创,如果使用麻烦您点赞呀如遇疑问,欢迎随时交流,定尽量解答。联系方式:7819…

    2022年9月11日
    3
  • 默认颜色及其对照表[通俗易懂]

    默认颜色及其对照表[通俗易懂]一、cesium默认颜色及其对照表Cesium.Color.ALICEBLUE<fontcolor=#f0f8ffsize=5></font>Cesium.Color.ANTIQUEWHITE<fontcolor=#faebd7size=5></font>Cesium.Color.AQUA<fontcolor=#00ffffsize=5></font>Cesium.Color.AQUAMAR.

    2022年5月16日
    53
  • mysql8和mariadb_mariadb迁移到mysql

    mysql8和mariadb_mariadb迁移到mysqlMariaDB为可替代MySQL的增强版本,但在已安装了MySQL的情况下同时也能安装MariaDB.(这是有意义的,例如你想从一个数据库/应用迁MariaDB为可替代MySQL的增强版本,但在已安装了MySQL的情况下同时也能安装MariaDB.(这是有意义的,例如你想从一个数据库/应用迁移到另一个数据库/应用中.)以下是在已安装MySQL的情况下,安装MariaDB的主要步骤.下载…

    2025年8月5日
    2
  • 西门子PLC-1200 SCL语言开发学习笔记 (一)

    西门子PLC-1200 SCL语言开发学习笔记 (一)一、简介和背景PLC一般使用梯形图开发,但是梯形图适合电工使用而不是程序员使用,对我们来说开发困难,门槛高,幸好PLC的开发标准还带了类pascal的高级语言,在西门子这里叫SCL语言,这对于我们程序员来说门槛就很低了。要开发好复杂PLC逻辑,梯形图困难重重,市场上要价颇高,而使用SCL语言则非常合适处理复杂逻辑以及运算。二、新建SCL程序块在博图软件的项目视图中,便有添加新快,双击推荐使用FB模块,便于存放变量,语言选择SCL三、变量的创建和访问在打开…

    2022年8月31日
    7
  • bp神经网络及matlab实现_bp神经网络应用实例Matlab

    bp神经网络及matlab实现_bp神经网络应用实例MatlabBP神经网络通俗教程(matlab实现方法)黑色字体可看可不看,是帮助理解所用红色字体是比较重要的部分,必看BP神经网络是什么BP(Back-propagation,反向传播)神经网络是最传统的神经网络。当下的各种神经网络的模型都可以看做是BP神经网络的变种(虽然变动很大…)。这东西是干什么用的呢?我们在现实中要处理的一切问题映射到数学上只分为两类,可归纳的问题与不可归纳的问题。首先什么是不可归纳的问题,举个例子,你不能用一套完美的数学公式去表达所有的质数,因为目前的研究表明,还没有什么方法

    2022年9月12日
    2
  • 最简单的 MyBatis Plus 的多表联接、分页查询实现方法

    最简单的 MyBatis Plus 的多表联接、分页查询实现方法一、前言最近在加强ITAEM团队的一个app项目,人员配备:安卓+前端+后台后台DAO层借鉴了华工其他软件开发团队,使用了新颖强大的MyBatisPlus框架,里边有一个类似百度贴吧的发帖子的功能:而如果设计表,应为帖子表t_postidtitle标题content内容xxuser_id用户外键用户表t_userid…

    2022年5月31日
    35

发表回复

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

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