1. Button
Button是TextView的子类
区别:
直接写两个内容相同、属性相同的TextView和Button对比如下:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello, Alice"
android:textSize="30dp"></TextView>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello, Alice"
android:textSize="30dp"></Button>
效果:
在Button中英文字母是否全部大写可以由属性textAllCaps控制。
新增属性onClick可以指定点击Button后跳转的方法,不过该属性已经过时,可以使用但不推荐
代码:
xml文件代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity7"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Time"
android:textSize="30dp"
android:textAllCaps="false"
android:onClick="doClick"></Button>
<TextView
android:id="@+id/tv_r"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"></TextView>
</LinearLayout>
对应的activity.java文件代码:
package com.example.study;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity7 extends AppCompatActivity {
private TextView tvr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main7);
tvr = findViewById(R.id.tv_r);
}
public void doClick(View view){
SimpleDateFormat sd = new SimpleDateFormat("HH:MM:SS");
String t = sd.format(new Date());
System.out.println(t);
String s = String.format("You click %s button, the result is %s", ((Button)view).getText(), t);
System.out.println(s);
tvr.setText(s);
}
}
效果图:
2.点击事件监听
前面说了如何使用onClick来调用点击按钮之后的函数。
但这会存在一个问题,xml文件是用于设置APP界面布局的,如果加入java代码中的函数名,会导致界面设计与程序逻辑混在一起,不利于复用。
所以最佳方法是点击事件监听的代码只写在java文件中。
主要调用的方法是监听器setOnClickListener,有多种写法,但本质都是实现View.OnClickListener接口。
步骤为:
- View调用setOnClickListener
- 实现View.OnClickListener接口的OnClick方法,这个方法也就是点击Button后执行什么操作
- 如果存在多个Button调用同一个OnClick方法,需要通过View的id来分别执行不同的操作
写法一:
package com.example.study;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity8 extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main8);
Button bt = findViewById(R.id.bt1);
tv = findViewById(R.id.tv2);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tv.setText("Surprise!");
}
});
}
}
写法二:
package com.example.study;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity8 extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main8);
Button bt = findViewById(R.id.bt1);
tv = findViewById(R.id.tv2);
bt.setOnClickListener(new MyClick(bt) );
}
public class MyClick implements View.OnClickListener{
private View view;
MyClick(View view){
this.view = view;
}
public void onClick(View view){
tv.setText("Surprise!");
}
}
}
写法三:
package com.example.study;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity8 extends AppCompatActivity implements View.OnClickListener{
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main8);
Button bt = findViewById(R.id.bt1);
tv = findViewById(R.id.tv2);
bt.setOnClickListener(this );
}
public void onClick(View view){
tv.setText("Surprise!");
}
}
多个Button调用同一个OnClick方法时:
public void onClick(View view){
switch(view.getId()){
case R.id.bt1: tv.setText("Surprise!");
break;
case R.id.tv2: tv.setText("Bad News!");
break;
case ....
}
}
这里涉及到回调的概念,View.OnClickListener接口内实现的OnClick函数,是在View类的某个地方被调用的。
用到回调的目的是保证一次点击只调用一次OnClick函数。
最后,因为是在View类的某个地方调用OnClick函数,所以所有的View类及其派生类,都可以使用点击监听,比如TextView。
3.长按按钮
点击按钮500ms内认为是一次点击,若大于500ms,则被识别为一次长按。
使用长按监听器setOnLongClickListener监听,用法与setOnClickListener类似。
区别在于重写的函数onLongClick返回类型为boolean,若为true,则表示该控件自己处理长按事件,否则交给父控件处理。
package com.example.study;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity8 extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main8);
Button bt = findViewById(R.id.bt1);
tv = findViewById(R.id.tv2);
bt.setOnLongClickListener(new View.OnLongClickListener(){
@Override
public boolean onLongClick(View view){
tv.setText("Long Suprise");
return true;
}
} );
}
}
因为View.OnLongClickListener()接口只有一个方法,所以也可以直接用lamda表达式来实现
package com.example.study;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity8 extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main8);
Button bt = findViewById(R.id.bt1);
tv = findViewById(R.id.tv2);
bt.setOnLongClickListener(view -> {
tv.setText("Long Suprise");
return true;
});
}
}
View类还有许多监听器,实现方法都是类似的。
文章来源地址https://www.toymoban.com/news/detail-763348.html
4.禁用与恢复按钮
应用场景:
属性enabled控制
下面是一个简单的动态控制按钮是否可用的例子:
xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity9"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="disable"
android:textSize="30dp"
android:id="@+id/bt2"
android:background="@color/pink"
></Button>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="enable"
android:textSize="30dp"
android:id="@+id/bt3"
android:background="@color/red_66"
></Button>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Click me"
android:textSize="30dp"
android:enabled="false"
android:id="@+id/bt4"
android:background="@color/purple_200"
></Button>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"
android:textColor="@color/purple_200"
android:id="@+id/tv3"></TextView>
</LinearLayout>
</LinearLayout>
java:
package com.example.study;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity9 extends AppCompatActivity implements View.OnClickListener {
private TextView tv3;
private Button bt4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main9);
Button bt2 = findViewById(R.id.bt2);
Button bt3 = findViewById(R.id.bt3);
bt4 = findViewById(R.id.bt4);
tv3 = findViewById(R.id.tv3);
bt2.setOnClickListener(this);
bt3.setOnClickListener(this);
bt4.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.bt2: bt4.setEnabled(false);
bt4.setBackgroundColor(Color.GRAY);
break;
case R.id.bt3: bt4.setEnabled(true);
bt4.setBackgroundColor(Color.BLUE);
break;
case R.id.bt4: tv3.setText("Click successfully!");
}
}
}
效果图:
文章来源:https://www.toymoban.com/news/detail-763348.html
到了这里,关于Android开发 Button setOnClickListener的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!