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


相关推荐

  • 记:EVE模拟器拓扑配置的保存及导入

    记:EVE模拟器拓扑配置的保存及导入参考博客:https://bbs.51cto.com/thread-1599315-1.html###EVE模拟器版本信息:先关机:点击这里稍等一会,让他保存。再打开开启并点击R1就能看到配置信息已经保存了。正常情况保存就是为了下次登录来使用,关闭所有设备,重新登录界面。先看下配置信息,还在。导入清节点再开启设备,showrun导入成功。…

    2022年5月1日
  • Owasp top10 小结[通俗易懂]

    Owasp top10 小结[通俗易懂]Owasptop101.SQL注入原理:web应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过恶意的sql语句来实现对数据库的任意操作。2.失效的身份认证和会话管理原理:在开发web应用程序时,开发人员往往只关注Web应用程序所需的功能,所以常常会建立自定义的认证和会话方案。但是要正确的实现这些方案却是很难的。结果就在退出,密码管理,超时,密码找回,账户更新等方面存在漏洞。危害:由于存在以上的漏洞,恶意用户可能会窃取

    2022年5月28日
  • 雷达测距和超声波测距_超声波测距的原理是什么

    雷达测距和超声波测距_超声波测距的原理是什么本实验是基于MSP430利用HC-SR04超声波传感器进行测距,测距范围是3-65cm,讲得到的数据显示在LCD1602液晶屏上。模块工作原理如下(1)采用IO触发测距,给至少10us的高电平信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间(4计算测试距离测试距离=(高电平时间*声速(340M/S))/2;根据工作原理,我们可以选择两种模式驱动1.采用中断+定时器

    2022年9月4日
  • java反射给类添加属性_java获取反射的三种方法

    java反射给类添加属性_java获取反射的三种方法摘要:记录一下使用java反射时PropertyDescriptor的异常java.beans.IntrospectionException:Methodnotfound:isMBuyPrice1.PropertyDescriptor要求bean对象的属性名称的前两个字母大小写需要一致,要么全大写,要么全小写2.PropertyDescriptor要求bean对象的属…

    2022年9月1日
  • resnet源码pytorch_pytorch conv1d

    resnet源码pytorch_pytorch conv1d#Pytorch 0.4.0 ResNet34实现cifar10分类.#@Time:2018/6/17#@Author:xfLiimporttorchvisionastvimporttorchastimporttorchvision.transformsastransformsfromtorchimportnnfromtorch.utils.da…

    2022年10月6日
  • I2C_i2c官网

    I2C_i2c官网I2C读写模块

    2022年8月4日

发表回复

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

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