目录
本文介绍按键控件的常见用法,包括:如何设置大小写属性,如何响应按钮的点击事件和长按事件,如何禁用按钮又该如何启用按钮,等等。
对textView来说,text属性设置什么文本就显示什么文本。但对Button来说,text属性字母不管设置大写还是小写,都默认转成大写

想要不转换成大小需补充textAllCaps属性,该属性默认值为true,表示全都转换为大写,如果设置为false,则表示不转为大写。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ActivityButton">
<TextView
android:id="@+id/tv_btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_btn1"
android:textColor="#000000"
android:layout_marginTop="10dp"
android:layout_centerHorizontal="true"/>
<Button
android:id="@+id/btn_btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_below="@id/tv_btn1"/>
<TextView
android:id="@+id/tv_btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btn_btn1"
android:text="@string/tv_btn2"
android:textColor="#000000"
android:layout_marginTop="10dp"
android:layout_centerHorizontal="true"/>
<Button
android:id="@+id/btn_btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_btn2"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:text="@string/app_name"
android:textAllCaps="false"/>
</RelativeLayout>
每当点击按钮时,就表示用户确认了某个事项,接下来轮到App来处理了。onClick属性便用来接管用户的点击动作,该属性的值是个方法名,也就是当前页面的Java代码存在这么一个方法:当用户点击时,就自动调用该方法。

Button标签指定了onClick属性值为doClick,表示点击该按钮会触发Java代码中的doClick方法。
<Button
android:id="@+id/btn_btn3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/btn_btn2"
android:onClick="doClick"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:text="@string/btn_btn3"
android:textAllCaps="false" />
<TextView
android:id="@+id/tv_btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_btn3"
android:layout_below="@id/btn_btn3"
android:layout_centerHorizontal="true"
android:textColor="#000000"/>
与之相对应,页面所在Java代码需要增加doClick方法。
package com.example.helloandroid;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class ActivityButton extends AppCompatActivity {
private TextView tv_btn3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_button);
tv_btn3=findViewById(R.id.tv_btn3);
}
public void doClick(View view){
String desc=String.format("%s 您点击了按钮:%s",DateUtil.getNowTime(),((Button) view).getText());
tv_btn3.setText(desc);
}
}
ps.时间工具DateUtil
package com.example.helloandroid;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
public static String getNowTime() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
return sdf.format(new Date());
}
}
在实际开发中,不推荐使用onClick属性,而是在代码中给按键对象注册监听器。
所谓监听器,意思是专门监听控件的动作行为,它平时无事可做,只有控件发生了指定动作,监听器才会出发开关去执行对应的代码逻辑。点击监听器需要实现接口View.setOnClickLinstener,并重写onClick方法补充点击事件的处理代码,再由按钮调用setOnClickLinstener方法设置监听对象。
public class ActivityButton extends AppCompatActivity implements View.OnClickListener{
private TextView tv_btn3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_button);
findViewById(R.id.btn_btn4).setOnClickListener(this);
findViewById(R.id.btn_btn5).setOnClickListener(this);
}
@Override
public void onClick(View v){
if (v.getId()==R.id.btn_btn4){
String desc=String.format("%s 您点击了按钮:%s",DateUtil.getNowTime(),((Button) v).getText());
tv_btn3.setText(desc);
}
if (v.getId()==R.id.btn_btn5){
String desc=String.format("%s 您点击了按钮:%s",DateUtil.getNowTime(),((Button) v).getText());
tv_btn3.setText(desc);
}
}
}
除了点击事件外,Android还设计了另外一种长按事件,每当控件被按住超过500毫秒之后,就会触发该控件的长按事件。若要捕捉按钮的长按事件,可调用按钮对象的setOnLongClickListener方法设置长按监听器。

把长按监听器设置到当前页面,该页面需要实现对应的长按接口View.OnLongClickListener,并重写长按方法onLongClick。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_button);
tv_btn3=findViewById(R.id.tv_btn3);
findViewById(R.id.btn_btn6).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (v.getId()==R.id.btn_btn6){
String desc=String.format("%s 您长按了按钮:%s",DateUtil.getNowTime(),((Button) v).getText());
tv_btn3.setText(desc);
}
return true;
}
});
}
在某些情况,我们会希望暂时禁止点击操作,这样的业务场景中,按钮先后有两种状态,即不可以状态与可用状态,他们在外观功能上的区分如下:
(1)不可用按钮:按钮不允许点击,即使点击也没反应,同时按钮文字为灰色。
(2)可以按钮:按钮允许点击,点击按钮会触发点击事件,同时按钮文字为正常黑色。

是否允许点击,需引入新属性android:enabled ,该属性值为true时表示启用,false时表示禁用。
<Button
android:id="@+id/btn_btn6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/btn_ll"
android:enabled="false"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:text="测试按钮"/>
在Java中可通过setEnabled方法设置按钮的可用状态(true表示启用,false表示禁用)。
@Override
public void onClick(View v){
if (v.getId()==R.id.btn_btn4){
btn_test.setTextColor(Color.BLACK);
btn_test.setEnabled(true);
String desc=String.format("%s 您点击了按钮:%s",DateUtil.getNowTime(),((Button) v).getText());
tv_btn3.setText(desc);
}
if (v.getId()==R.id.btn_btn5){
btn_test.setTextColor(Color.GRAY);
btn_test.setEnabled(false);
String desc=String.format("%s 您点击了按钮:%s",DateUtil.getNowTime(),((Button) v).getText());
tv_btn3.setText(desc);
}
}
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame
我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模