Android控件之Button
1 Button介绍
Button是Android提供的按钮控件。它继承于TextView,详细继承关系如下:
它继承了View和TextView的所有属性。所以,使用时,可以参考View的属性和TextView的属性对Button进行设计。
2 Button常用的三种实现方式
方式一: 匿名实现View.OnClickListener接口
匿名实现,即通过匿名类的方式去实现类View.OnClickListener接口。
优点:直观。可以清晰的看到每个Button的点击处理事件。
缺点:当按钮众多的时候,若为每个按钮单独的去采用匿名类的方式实现View.OnClickListener接口,会显得代码很冗余。
public class ButtonTest extends Activity { ... private Button mButton; ... @Override protected void onCreate(Bundle savedInstanceState) { ... // 按钮实现方式 mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 按键处理... } }); ... } }
方式二: Activity实现View.OnClickListener接口
Activity通过覆盖onClick()函数来实现View.OnClickListener接口,之后Button的点击事件全部可以在该Activity的onClick()函数中处理。
优点:统一处理所有Button的点击事件。当Button比较多的时候尤其管用。
public class ButtonTest extends Activity implements View.OnClickListener{ ... private Button mButton; ... @Override protected void onCreate(Bundle savedInstanceState) { ... // 按钮实现方式 mButton.setOnClickListener(this); ... } @Override public void onClick(View v) { // 按键处理... } }
方式三: 在manifest中定义,然后直接在Activity中实现
在manifest中指定Button的控制函数,然后直接在Button所在的Activity中实现该函数接口。
实现方式如下,首先在Layout中定义Button的android:onClick属性
<Button ... android:onClick="clickReset" ... />
上面的定义,指定了该Button的控制函数为clickReset。
接着,在Activity中实现clickReset。如下:
public class ButtonTest extends Activity implements View.OnClickListener{ ... public void clickReset(View v) { // 按键处理... } ... }
2 button示例
创建一个activity,包含3个button。
一个button用于减少屏幕亮度:采用方式一实现。
一个button用于增加屏幕亮度:采用方式二实现。
一个button用于重置屏幕亮度:采用方式三实现。
应用层代码
package com.skywang.control; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.util.Log; import android.content.ContentResolver; import android.net.Uri; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.view.WindowManager; public class ButtonTest extends Activity implements View.OnClickListener{ private static final String TAG = "SKYWANG"; private Button mButtonPlus = null; private Button mButtonMinus = null; private int mBrightness = 100; private static final int MIN_BRIGHTNESS = 10; private static final int MAX_BRIGHTNESS = 255; private static final int STEP_LEN = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.button_test); // 保存原始的亮度值 mBrightness = getBrightness(); mButtonPlus = (Button)findViewById(R.id.button_plus); mButtonPlus.setOnClickListener(this); mButtonMinus = (Button)findViewById(R.id.button_minus); mButtonMinus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "click button minus"); // 减少亮度 minusBrightness(); } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_plus: { Log.d(TAG, "click button plus"); // 增加亮度 plusBrightness(); break; } default: break; } } // button_reset的实现函数 public void clickReset(View v) { Log.d(TAG, "click reset"); setBrightness(mBrightness); } /* * 获取当前亮度值 */ private int getBrightness() { int brightness = 0; try { brightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS); } catch (SettingNotFoundException snfe) { } return brightness; } /* * 设置当前activity的亮度。 */ private void setBrightness(int brightness) { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.screenBrightness = Float.valueOf(brightness) * (1f / 255f); getWindow().setAttributes(lp); // 若不保存亮度,退出该activity之后,亮度值会还原。 saveBrightness(getContentResolver(), brightness); } /* * 保存亮度值 */ private void saveBrightness(ContentResolver resolver, int brightness) { Uri uri = android.provider.Settings.System .getUriFor("screen_brightness"); android.provider.Settings.System.putInt(resolver, "screen_brightness", brightness); resolver.notifyChange(uri, null); } /* * 增加亮度 */ private void plusBrightness() { int brightness = getBrightness(); if (brightness < MAX_BRIGHTNESS) { int pre=brightness; brightness += STEP_LEN; brightness = brightness<MAX_BRIGHTNESS ? brightness: MAX_BRIGHTNESS; setBrightness(brightness); Log.d(TAG, "plus brightness : "+pre+"->"+brightness); } else { Log.d(TAG, "max Brightness!"); } } /* * 减少亮度 */ private void minusBrightness() { int brightness = getBrightness(); if (brightness > MIN_BRIGHTNESS) { int pre=brightness; brightness -= STEP_LEN; brightness = brightness>MIN_BRIGHTNESS ? brightness: MIN_BRIGHTNESS; setBrightness(brightness); Log.d(TAG, "minus brightness : "+pre+"->"+brightness); } else { Log.d(TAG, "min Brightness!"); } } }
layout文件
<LinearLayout 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" android:orientation="vertical" tools:context=".ButtonTest" > <Button android:id="@+id/button_plus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/text_plus" /> <Button android:id="@+id/button_minus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/text_minus" /> <Button android:id="@+id/button_reset" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickReset" android:text="@string/text_reset" /> </LinearLayout>
manifest文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.skywang.control" android:versionCode="1" android:versionName="1.0" > <!-- 添加修改设置的权限 --> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.skywang.control.ButtonTest" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
运行效果:如图
点击下载:源代码