开局一张图
本文旨在介绍Button和他的 子类 。
Button
Button 用户可以点击或长按等操作的用户界面元素,具有正常状态和点击状态,Button 继承自 TextView ,所以可以使用 TextView 的那些属性。
实际开发中,无非是对按钮的几个状态做相应的操作,比如:按钮按下的时候 用一种颜色,弹起又一种颜色,或者按钮不可用的时候一种颜色这样。
实例
咱们来写有1个基础版Button,2个进阶版Button。
基础版Button
在布局文件中添加一个Button
<Button android:id="@+id/btn_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="基本Button" />
不仅样式丑陋而且文字显示为大写BUTTON。
进阶版Button
在基础版Button上新增一些xml属性。
1.在res/drawable目录下新建文件 bg_btn_frame_gradient.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <!--radius四个圆角统一设置,也可以单独对某一个圆角设置。例:topLeftRadius--> <corners android:radius="8dp"/> <!--边框宽度width、颜色color--> <stroke android:width="1dp" android:color="@color/color_ff0000" /> <gradient android:startColor="@color/color_188FFF" android:centerColor="@color/color_FF773D" android:endColor="@color/color_ff0000" android:type="linear" /> </shape>
2.在res/drawable目录下新建文件 bg_btn_selector_bg.xml
1.<?xml version ="1.0" encoding ="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!--简单版仅颜色,直接设置android:radius="8dp"无效--> <!--未点击显示颜色--> <item android:drawable="@color/color_FF773D" android:state_pressed="false" /> <!--点击显示颜色--> <item android:drawable="@color/color_188FFF" android:state_pressed="true" /> <!--复杂版带圆角--> <!--未点击显示颜色--> <item android:state_pressed="false"> <shape> <solid android:color="@color/color_FF773D" /> <corners android:radius="8dp" /> </shape> </item> <!--点击显示颜色--> <item android:state_pressed="true"> <shape> <solid android:color="@color/color_188FFF" /> <corners android:radius="8dp" /> </shape> </item> </selector>
3.修改布局文件添加两个Button
<Button android:id="@+id/btn_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dimen_20" android:background="@drawable/bg_btn_frame_gradient" android:padding="@dimen/dimen_10" android:text="背景色渐变的Button" android:textAllCaps="false" android:textColor="@color/white" android:textSize="@dimen/text_size_18" /> <Button android:id="@+id/btn_3" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dimen_20" android:background="@drawable/bg_btn_selector_bg" android:onClick="btn3OnClick" android:padding="@dimen/dimen_10" android:textAllCaps="false" android:text="带按下效果的Button" android:textColor="@color/white" android:textSize="@dimen/text_size_18" />
咱们看运行效果
xml小结
此时已经完成了上面的效果图。 我们将 Button 的 android:background 属性设置为该 drawable 资源即可轻松实现按下 按钮时不同的按钮颜色或背景
- btn_2因为直接使用drawable,并且未使用selector。所以无点击效果。不管点击还是未点击「始终显示渐变色」。
StateListDrawable 是 Drawable 资源的一种,可以根据不同的状态,设置不同的图片效果,关键节点 < selector >
- btn_3使用了selector,对item标签下android:state_pressed进行不同状态的设置背景色和圆角。根据控件是否被按下展示(color_FF773D/color_188FFF)
交互事件
Button的核心还是在于和用户的交互,否则使用TextView即可。
1.Activity 实现 View.OnClickListener方法
public class ButtonActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.view_button);//加载布局文件 initViewButton(); } private void initViewButton(){ btn_1 = findViewById(R.id.btn_1); btn_1.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_1: Toast.makeText(this,"btn_1点击事件",Toast.LENGTH_SHORT).show(); break; default: break; } } }
2.在布局文件中声明
- 给button添加 android:onClick="btn3OnClick"属性
- 在activity中添加对应名称的方法,满足以下条件
- 方法的修饰符是 public;
- 返回值是 void 类型;
1. //不需要关联控件 public void btn3OnClick(View view){ Toast.makeText(this,"btn_3点击事件",Toast.LENGTH_SHORT).show(); }
3.匿名内部类实现
附送一个长按匿名内部类,需要注意的是「onLongClick」返回「false」会继续「执行onClick事件」,如果返回true,则不执行onClick事件。
btn_2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(ButtonActivity.this,"btn_2点击事件",Toast.LENGTH_SHORT).show(); } }); btn_2.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Toast.makeText(ButtonActivity.this,"btn_2长按点击事件",Toast.LENGTH_SHORT).show(); return false; } });
4.内部类实现
//使用 btn_1.setOnClickListener(new MyOnClickListener()); //内部类实现OnClickListener接口 class MyOnClickListener implements View.OnClickListener{ @Override public void onClick(View v) { Toast.makeText(ButtonActivity.this,"btn_1点击事件MyOnClickListener",Toast.LENGTH_SHORT).show(); } }
交互事件小结
- Button的setOnClickListener优先级比xml中android:onClick高,如果同时设置点击事件,只有setOnClickListener有效。
- TextView也可以实现onClick事件,如果部分Button使用麻烦可以考虑使用TextView来代替。
Button显示字母大写
解决方案:设置属性android:textAllCaps="false"即可解决
Button设置backgroud无效
解决方案:默认的颜色设置来自于res/values/themes.xml。
将里面的主题parent="Theme.MaterialComponents.DayNight.DarkActionBar"改为(其他主题也可以)parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge"。
Button点击文字变色
方法一
定义一个drawable文件,代码如下:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="@color/white"></item> <item android:color="@color/black"></item> </selector>
方法二
1.首先你要在你的color文件下加入几个你需要的色值,注意不同的是不是一般的color标签,而是drawable标签,代码如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="color_ff0000">#ff0000</color> <drawable name="drawable_color_black">#000000</drawable> <drawable name="drawable_color_white">#FFFFFF</drawable> </resources>
2.定义一个drawable文件,就和正常的selector文件差不多,唯一的区别就是把drawable字段变成color在里面引入你刚刚定义的颜色,代码如下:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="false" android:state_enabled="true" android:state_pressed="false" android:color="@drawable/drawable_color_black" /> <item android:state_enabled="false" android:color="@drawable/drawable_color_black" /> <item android:state_pressed="true" android:color="@drawable/drawable_color_white" /> <item android:state_focused="true" android:color="@drawable/drawable_color_white" /> </selector>
把drawable文件设置为textColor选项就可以了。
以上就是本文Button的全部内容,咱们下面看看他的子类。