15. 【Android教程】按钮 Button/ImageButton

在前面两章我们讲了 TextView,它是一个纯输出的控件;而 EditText 在 TextView 基础之上加入了简单的输入功能;今天要讲的 Button 是一个和用户互动感很强的控件,从今往后不再是单纯的文本展示,我们可以通过 TextView、EditText 再加上 Button 做出非常多有很意思的功能。ImageButton 可以理解为是 Button 的升级版,它在后者的基础之上加上了图片背景,使用方式和 Button 类似。

1. Button 的基本用法

Button,顾名思义,就是一个提供给用户点击的控件。同 EditText 一样,它也是继承自 TextView,拥有 TextView 的全部属性,这里重点讲讲 Button 特有的及常用的属性的用法。

下面我们通过 XML 定义了一个 Button:

<Button xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/btn_click"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="点我"android:onClick="onClick"android:textColor="@android:color/holo_blue_dark" />

基本用法和 TextView 类似,这里多了一个android:onClick属性,从名字上看应该是设置一个点击事件。那么我们首先看看 Button 最重要的功能,如何给 Button 绑定点击事件接收器,从而完成 Button 点击事件的接收及处理。

2. 点击事件的绑定

2.1 静态绑定

第一种方式是通过onClick属性实现,xml 布局代码如上。我们需要给onClick属性设置一个函数“onClick”(函数名任意),用于接收点击事件,所以我们要在 Activity 里面添加一个名为onClick的方法,如下:

 public void onClick(View v) {Toast.makeText(MainActivity.this, "button click", Toast.LENGTH_SHORT).show();}

这里要特别注意函数签名,需要指定为public void类型,而入参是View类型,传入的 View 就是被点击的 Button 对象。这样我们可以给多个 Button 绑定同一个 click 函数,然后通过传入的 View 来区分点击是哪个 Button 被点击从而执行相应操作。

运行之后,点击 Button 效果如下:

点击之后在屏幕下方打印出的文本就是我们在 xml 中为 Button 设置的 id,从而可以确认两件事:

  • 通过onClick属性,我们可以为 Button 指定一个点击相应函数,按照指定的方法签名实现这个响应函数,即可接收点击事件;
  • 点击 Button 之后,会将被点击的 Button 通过参数的形式传给onClick函数。

2.2 动态绑定

通过xml的onClick属性静态绑定的方式不够灵活,而且要求绑定的函数名、参数等完全一致,出错率也比较高,所以在实际开发中用的很少,绝大多数场景都会通过 Java 代码动态绑定一个事件监听器。

动态绑定监听器的主要代码如下:

package com.emercy.myapplication;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = findViewById(R.id.btn_click);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "button click", Toast.LENGTH_SHORT).show();}});}
}

如果你对 Activity 还比较生疏也没关系,在后面的课程会详细讲解,这里重点看看和 Button 有关的代码。

  1. 首先我们设置布局文件为只含有一个 Button 的 xml 文件;
  2. 接着通过 ID 获取到 Button 实例;
  3. 通过setOnClickListener函数设置一个点击事件监听器;
  4. 在监听器的 onClick 回调中接收点击事件并处理。

通过以上代码可以达到同样的效果,在onClick(View view)回调中传入的 View 同样是被点击的Button对象,在回调中可以由不同的 ID 区分不同的处理逻辑。这是 Button 最常用的方式,必须掌握。

3. Button 的样式

不同的系统会有不同的默认 Button 样式,但是它们都有一个共同点——丑。相比于 TextView 而言,Button 是一个互动感很强的控件,除了设置字体字号,还需要有形状、背景、颜色、点击态等等样式变化。特别是在游戏及娱乐类 App 中 ,Button 的样式及变化效果将直接影响用户体验,所以这里将重点讲解几种设置样式的方法。

3.1 设置背景

可以有两种设置方式:1、设置背景色;2、设置背景图。两种方式都可以通过 xml 及 Java 设置,在 xml 中可以通过:

android:background="#E4BB18"

可以直接设置颜色或者背景图片,也可以在 Java 代码中通过如下两个接口实现:

setBackground();
setBackgroundResource();

3.2 设置形状样式

和 TextView 类似,我们首先创建 drawable 资源:

依次进入“src” -> “main” -> “res” -> “drawable”目录,在里面右键新建一个“Drawable Resource File”,输入文件名:button_background。

编写 button_background.xml 的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="#B9B911" /><cornersandroid:bottomLeftRadius="30dp"android:bottomRightRadius="30dp"android:topLeftRadius="30dp"android:topRightRadius="30dp" /><strokeandroid:width="3dp"android:color="#99CCFF" />
</shape>

在 shape 标签中,我们设置了

  1. 填充的背景色
  2. 拐角的弧度
  3. 描边的颜色和宽度

然后在xml中通过android:background设置 button 的 background 样式:

android:background="@drawable/button_background"

效果如下:

3.3 多状态变化

Button 的多状态变化是很常用也是效果非常棒的一个效果,它的可以最大化的增强互动感。通过 StateListDrawable 设置 Button 在不同状态下的样式效果,比如在按下、抬起、选中、无效等等不同状态下可以呈现不同的形状和颜色,这样可以给用户更多的点击反馈。

StateListDrawable 用来记录各个状态列表,并通过 Drawable 的形式描述各个状态下要呈现的样式。它支持以下设置项:

  • drawable: Button 的背景样式,搭配后面的状态使用表示当前状态下的样式。如果没有设置状态,则为默认样式
  • state_pressed: 按下态
  • state_enabled: 可用状态
  • state_focused: 获得焦点状态
  • state_window_focused: 获得窗口焦点状态
  • state_checkable: 可选状态(针对 checkbox)
  • state_checked: 勾选态
  • state_selected: 选择态(针对滚轮的场景)
  • state_active: 活动状态(针对 slidingTab)
  • state_single: 包含多个子控件时,只显示一个子控件的状态
  • state_first: 包含多个子控件时,第一个子控件处于显示状态
  • state_middle: 包含多个子控件时,中间一个子控件处于显示状态
  • state_last: 包含多个子控件时,最后一个子控件处于显示状态

其中最常用就是前 3 个状态。

我们新增一个 button_pressd_background.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="#DF866B" /><cornersandroid:bottomLeftRadius="50dp"android:bottomRightRadius="50dp"android:topLeftRadius="50dp"android:topRightRadius="50dp" /><strokeandroid:width="3dp"android:color="#99CCFF" />
</shape>

我们在之前的样式上修改了定点的弧度及背景颜色,希望他在点击的时候能够变成新的样式,接下来还需要一个 StateListDrawable 文件。我们仍然在 drawable 目录下创建文件:button_selector.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/button_pressd_background" android:state_pressed="true" /><item android:drawable="@drawable/button_background" />
</selector>

这里采用<selector/>标签,直译过来就是“选择器”,即在不同状态下选择哪种样式。最后我们将 Button 的android:background属性指向 button_selector.xml 文件:

    android:background="@drawable/button_selector"

大功告成,这时候只需要轻轻点击 Button,就会发现神奇的现象:

这样是不是更有互动感?采用 StateListDrawable 还可以指定很多的状态变化,这里就留给大家去发明创造。

4 小结

本节讲解了 Button 的基本用法,其中最核心的就是设置点击事件监听器来接收用户点击事件,其实在我们日常的实战开发中,不仅仅是 Button 可以绑定监听器,TextView、EditText 都可以,感兴趣的小伙伴也可以尝试修改前几节的例子,加上监听器试试,希望大家在学习每一个 View 的时候都能够融会贯通,举一反三。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/810591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蒙德冒险者的游戏

描述 蒙德城的一群冒险者计划进行一场特殊的表演以庆祝风神节。这场表演涉及到一项特别的挑战&#xff0c;即“冒险者塔”——一项测试冒险者们团队协作和个人承受能力的活动。 在“冒险者塔”表演中&#xff0c;参与者需要站在彼此的肩膀上&#xff0c;形成一个人类塔&#…

智能汽车领域检测实验室数智化转型

随着汽车制造行业自主研发能力的提高&#xff0c;当前的汽车企业实验室不仅需要进行种类繁多的试验项目&#xff0c;同时还需要将试验过程中的试验结果、试验过程、报告文档等一系列重要数据进行统一管理。为了提升实验数据的安全性及应用性&#xff0c;青软青之通过软硬件结合…

快速下载huggingface资源 (cli使用)

因为墙的原因&#xff0c;huggingface上的资源难以下载&#xff0c;通过本博客的方法不需翻墙也能快速下载。 本博客主要介绍&#xff1a; 1. 如何离线下载huggingface 资源 2. huggingface cli 的简单使用 安装 pip install -U "huggingface_hub[cli]" 配置 #…

for in 和 for of 的区别

1.for in 和 for of 都可以循环数组&#xff0c;for in 输出的是数组的 index 下标&#xff0c;而 for of 输出的是数组的每一项的值。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport…

Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_CraftWindow.cs using UnityEngine.UI; using TMPro; using UnityEngin…

动态规划在电商订单计算的例子

你在网上买了一堆商品,比如说,你买了2件T恤,每件10块,5件袜子,每双5块,还有1个帽子,8块钱。但是呢,商家有个促销活动,买得越多,单价就越便宜。比如,T恤买3件以上,每件就变成9块了。这时候,怎么算出你这一单的最少花费呢? 商品价格可能会因为购买数量的不同而有所…

重看Spring聚焦ApplicationContext分析

一、理解下ApplicationContext的设计 &#xff08;一&#xff09;功能性的理解 ApplicationContext 提供了一个轻量级、灵活、可扩展的容器&#xff0c;能帮助我们更加轻松地构建和管理复杂的应用程序&#xff0c;其通过依赖注入和控制反转等技术&#xff0c;降低了组件之间的…

SpringBoot 多数据源与事务管理:一站式解决方案

大纲 引言 在当今的软件开发中&#xff0c;随着业务的不断扩展和复杂化&#xff0c;许多应用程序都不再局限于单一的数据库&#xff0c;而是需要同时操作多个数据源以满足各种需求。SpringBoot作为一种快速开发框架&#xff0c;在处理单数据源的情况下表现出色&#xff0c;但…

【算法】统计英文字母出现的频率

题目 字母出现频率是指26英文个字母在文章中出现的频率。根据统计&#xff0c;在英语中最常出现的字母是e&#xff0c;大约占12~13%&#xff0c;出现最少的字母是z&#xff0c;不到0.1% &#xff0c;如下图所示&#xff08;统计结果来自wiki百科&#xff09; 字母出现频率的统…

三方库移植之NAPI开发(三)通过IDE开发NAPI工程

在三方库移植之NAPI开发[1]—Hello OpenHarmony NAPI一文中&#xff0c;笔者开发的是一个rom包的napi工程。该工程需要编译烧录固件&#xff0c;C 的动态库会集成到开发板的ROM中。在本篇文章中&#xff0c;笔者使用三方库移植之NAPI开发[1]—Hello OpenHarmony NAPI中一样的he…

VXWorks6.9 + Workbench3.3 开发环境部署

VxWorks系列传送门 一、安装包 有需要的朋友可以私信~ 二、安装 安装挺简单 1、先安装DVD-R147826.1-1-01-vx69.udf.iso 镜像中的Setup.exe程序&#xff0c;记住要使用管理员权限 2、再安装DVD-R147826.1-23-00.iso 镜像中的Setup.exe程序&#xff0c;同样要使用管理员权限 3…

基于大数据的汽车信息可视化分析预测与推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本项目通过集成网络爬虫技术&#xff0c;实时获取海量汽车数据&#xff1b;运用先进的ARIMA时序建模算法对数据进行深度挖掘和分析&#xff1b;结合flask web系统和echarts可视化工具&#xff0c;…

CF698B Fix a Tree 题解 贪心

Fix a Tree 传送门 A tree is an undirected connected graph without cycles. Let’s consider a rooted undirected tree with n n n vertices, numbered 1 1 1 through n n n . There are many ways to represent such a tree. One way is to create an array with n…

基于GitHub的开源讨论系统,赋予网站交互可能

Giscus&#xff1a;让每一条见解直达GitHub&#xff0c;用Giscus开启网站与社区的无缝对话新纪元&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 纯静态网站或博客&#xff0c;由于没有数据存储功能&#xff0c;经常借助第三方的评论系统以插件的方式集成进来&#x…

uniapp 编译后分包下静态图片404问题解决方案

如上图官方说明&#xff1a; 在分包下建立一个static文件夹即可&#xff1a; 分包内代码引用图片 <image src"/分包名称/img/图片名称"></image> <image src"/dataView/img/图片名称"></image>

图书整理 I 1、返回列表 2、头插法,返回链表 3、尾插法,返回链表

返回列表 class Solution:def reverseBookList(self, head: Optional[ListNode]) -> List[int]:li []while head:li.append(head.val)head head.nextreturn li[::-1]头插法&#xff0c;返回链表 class ListNode:def __init__(self, item):self.val itemself.next None…

Rust教程 – 学习天文图像的多尺度处理

最近&#xff0c;人们投入了大量精力开发新颖的图像处理技术。其中许多技术都源自于傅里叶和小波变换等数字信号处理方法。 这些技术不仅使得各种图像处理技术如降噪、锐化和动态范围扩展成为可能&#xff0c;而且还使得计算机视觉中使用的许多技术如边缘检测、目标检测等成为…

RobotFramework测试框架(7)-SeleniumLibrary常用关键字

浏览器操作 打开浏览器 Open Browser urlhttps://www.baidu.com browseredge关闭浏览器 Close Browser最大化浏览器 Maximize Browser Window设置浏览器宽高 Set Window Size 800 600刷新页面 Reload Page iframe操作 选中指定iframe Select Frame loc…

SQL执行流程图文分析:从连接到执行的全貌

SQL执行总流程 下面就是 MySQL 执行一条 SQL 查询语句的流程&#xff0c;也从图中可以看到 MySQL 内部架构里的各个功能模块。 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层&#xff0c; Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在…

Navicat连接SQL server出现:[IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序(0)

问题 解决方法 一 找到Navicat的安装路径&#xff0c;然后找到sqlncli_x64.msi文件并安装&#xff0c;安装成功后重启Navicat重新进行连接&#xff0c;看是否成功。 解决方法 二 如果方法一没有找到找到sqlncli_x64.msi 还是Navicat的安装路径&#xff0c;然后找到msodbcsql_64…