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


相关推荐

  • Linux dpkg 命令

    Linux dpkg 命令Linuxdpkg命令note:软件测试实习笔记1dpkgdpkg-idpkg-rdpkg-Pdpkg-ldpkgdpkg是linux系统下用来安装、创建和管理软件包的工具。其安装的软件包一般是下载到本地的软件包,拓展名是deb。格式:dpkg参数package.deb(初学者容易忘记打空格,在命令和参数以及参数和软件包中间要打空格,否则linux会无法

    2022年5月21日
    51
  • CAN协议学习(一)

    CAN协议学习(一)一、CAN协议的特点1)在总线空闲时,所有单元都可以发送消息,两个以上单元同时发送消息时,对各消息的Identifier进行逐位仲裁比较,仲裁获胜的单元(具有较高优先级)可继续发送消息,仲裁失败的单元停止发送。2)消息中没有地址,消息广播到总线上,任何总线上的单元都可以接收消息。在总线上增加单元,不会影响到其它的单元。3)最高数据传输速率1Mbps(距离小于40m),最远传输距离10k…

    2022年6月28日
    31
  • VS Code折腾记 – (2) 快捷键大全,没有更全

    VS Code折腾记 – (2) 快捷键大全,没有更全前言VSCode的快捷键继承了一些IDE风格,有VS的身影,也有Emacs的身影。。简言之,内置快捷键玩熟了,效率提高不是一点两点。VsCode快捷键有五种组合方式(科普)Ctrl+Shift+?:这种常规组合按钮Ctrl+VCtrl+V:同时依赖一个按键的组合Shift+Vc:先组合后单键的输入Ctrl+Click:键盘+鼠标点击Ctrl+

    2022年6月16日
    37
  • 等价类划分法设计用例(超详细)「建议收藏」

    等价类划分法设计用例(超详细)「建议收藏」等价类划分法等价类:1、解决了不能穷举测试的问题、控制成本、控制测试用例数量2、数据值要明确,对文字敏感3、依据需求将输入划分为若干个等价类,划分等价类(需求、数据特征)等价类设计用例的难点:如何根据时间成本划分等价类等价类分为:           1、有效等价类           2、无效等价类如上图可以划分为:                 有效等价类1:[-99,99]                 无效等价类2:<-99                 无效等

    2022年10月18日
    2
  • centos7.6安装docker_docker自动部署多环境

    centos7.6安装docker_docker自动部署多环境前言前面一篇学了mac安装docker,这篇来学习在linux上安装docker环境准备Docker支持以下的CentOS版本,目前,CentOS仅发行版本中的内核支持Docker。Doc

    2022年7月30日
    6
  • win10没有telnet客户端怎么办

    win10没有telnet客户端怎么办telnet 客户端对网络工程师来说是个很有用的服务 可以通过它直接远程登录网络设备 进行管理和配置操作等 不过有用户升级 win10 系统后却遇到没有 telnet 客户端的情况 这要怎么办呢 如果你也遇到一样的问题 随小编的步伐一起来看看 windows10 中没有 telnet 客户端的详细处理步骤 具体步骤如下 1 进入 win10 后 win r 键打开运行窗口 输入 control 打开控制面板 2 查看方式选择大图标 3 在控制面板中找到程序和功能并点击打开 4 点击启用或关闭 Wi

    2025年8月3日
    2

发表回复

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

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