经过分析,上述按钮效果实际上就是一个布局,一个最简单不过的垂直线性布局,上部分是一个ImageView,下部分是一个TextView,这个布局可点击、可设置监听。

我们首先要编写自己的ImageButton类,然后在主布局文件中为我们自定义的Button编写布局,最后在Activity中调用我们自定义ImageButton即可。

首先,我们编写一个MyImageButton类,继承自LinearLayout

package com.billhoo.study; 

import android.content.Context;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; //自定义ImageButton,模拟ImageButton,并在其下方显示文字
//提供Button的部分接口
public class MyImageButton extends LinearLayout { public MyImageButton(Context context, int imageResId, int textResId) {
super(context); mButtonImage = new ImageView(context);
mButtonText = new TextView(context); setImageResource(imageResId);
mButtonImage.setPadding(, , , ); setText(textResId);
setTextColor(0xFF000000);
mButtonText.setPadding(, , , ); //设置本布局的属性
setClickable(true); //可点击
setFocusable(true); //可聚焦
setBackgroundResource(android.R.drawable.btn_default); //布局才用普通按钮的背景
setOrientation(LinearLayout.VERTICAL); //垂直布局 //首先添加Image,然后才添加Text
//添加顺序将会影响布局效果
addView(mButtonImage);
addView(mButtonText);
} // ----------------public method-----------------------------
/*
* setImageResource方法
*/
public void setImageResource(int resId) {
mButtonImage.setImageResource(resId);
} /*
* setText方法
*/
public void setText(int resId) {
mButtonText.setText(resId);
} public void setText(CharSequence buttonText) {
mButtonText.setText(buttonText);
} /*
* setTextColor方法
*/
public void setTextColor(int color) {
mButtonText.setTextColor(color);
} // ----------------private attribute-----------------------------
private ImageView mButtonImage = null;
private TextView mButtonText = null;
}

然后在main布局中为我们自定义的Button写xml布局,注意,我们的“按钮”实际上是一个线性布局,因此xml中应该写LinearLayout而不是Button或者ImageButton

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent"> <!-- 这就是我们的“数据管理按钮” -->
<LinearLayout android:id="@+id/ll_bt_data_config"
android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

最后,在Activity中为我们自定义的按钮设置监听

package com.billhoo.study; 

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout; public class TestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); btDataConfig = new MyImageButton(this, R.drawable.option, R.string.text); //获取包裹本按钮的容器
llbtDataConfig = (LinearLayout) findViewById(R.id.ll_bt_data_config); //将我们自定义的Button添加进这个容器
llbtDataConfig.addView(btDataConfig); //设置按钮的监听
btDataConfig.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
btDataConfig.setText("按钮被点击过了");
}
});
} private LinearLayout llbtDataConfig = null; //main布局中包裹本按钮的容器
private MyImageButton btDataConfig = null;
}

效果:

最新文章

  1. JAVA的内存模型(变量的同步)
  2. ABP源码分析十六:DTO的设计
  3. mac 安装php7
  4. tomcat学习笔记一:安装和配置
  5. Intent实现页面跳转和传值
  6. CSS规范之BFC &amp; IFC
  7. 制作Ubuntu Live USB的方法
  8. Android:从程序员到架构师之路Ⅰ
  9. JavaScript高级程序设计(四): 关键字With的使用
  10. Canvas--2
  11. JAVA仿真之银行出纳员
  12. java学习之即时通信项目实战
  13. linux下使用select实现精确定时器
  14. jmeter--简单的接口测试(GET/POST)
  15. centos7.0下的 systemctl 用法
  16. Kubernetes 笔记 08 Deployment 副本管理 重新招一个员工来填坑
  17. Codeforces 101623E English Restaurant - 动态规划
  18. CGI,FastCGI,PHP-CGI与PHP-FPM区别详解【转】
  19. .NET DLL 加密工具
  20. 并发之ThreadLocal

热门文章

  1. 用Python作GIS之四:Tkinter基本界面的搭建
  2. 从word中提取图片的三种方法
  3. Ubuntu中设置环境变量详解
  4. 使用PHP计算上一个月的今天
  5. 关于php框架
  6. office365 development
  7. How to Implement Bluetooth Low Energy (BLE) in Ice Cream Sandwich
  8. SpringMVC+redis整合
  9. JDBC 学习笔记(二)—— 大数据+存储过程+批处理+事务管理
  10. js遍历集合