第一个实现一个带图片和文字的按钮,如图所示:


整个过程可以分四步走。第一步,定义一个layout,实现按钮内部的布局。代码如下:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <ImageView
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:id="@+id/iv"
  11. android:src="@drawable/confirm"
  12. android:paddingTop="5dip"
  13. android:paddingBottom="5dip"
  14. android:paddingLeft="40dip"
  15. android:layout_gravity="center_vertical"
  16. />
  17. <TextView
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:text="确定"
  21. android:textColor="#000000"
  22. android:id="@+id/tv"
  23. android:layout_marginLeft="8dip"
  24. android:layout_gravity="center_vertical"
  25. />
  26. </LinearLayout>


  这个xml实现一个左图右字的布局,接下来写一个类继承LinearLayout,导入刚刚的布局,并且设置需要的方法,从而使的能在代码中控制这个自定义控件内容的显示。代码如下:

[java] view plain copy
  1. packagecom.notice.ib;
  2. importandroid.content.Context;
  3. importandroid.util.AttributeSet;
  4. importandroid.view.LayoutInflater;
  5. importandroid.widget.ImageView;
  6. importandroid.widget.LinearLayout;
  7. importandroid.widget.TextView;
  8. publicclassImageBtextendsLinearLayout{
  9. privateImageViewiv;
  10. privateTextViewtv;
  11. publicImageBt(Contextcontext){
  12. this(context,null);
  13. }
  14. publicImageBt(Contextcontext,AttributeSetattrs){
  15. super(context,attrs);
  16. //导入布局
  17. LayoutInflater.from(context).inflate(R.layout.custombt,this,true);
  18. iv=(ImageView)findViewById(R.id.iv);
  19. tv=(TextView)findViewById(R.id.tv);
  20. }
  21. /**
  22. *设置图片资源
  23. */
  24. publicvoidsetImageResource(intresId){
  25. iv.setImageResource(resId);
  26. }
  27. /**
  28. *设置显示的文字
  29. */
  30. publicvoidsetTextViewText(Stringtext){
  31. tv.setText(text);
  32. }
  33. }


 第三步,在需要使用这个自定义控件的layout中加入这控件,只需要在xml中加入即可。方法如下:

[html] view plain copy
  1. <RelativeLayout
  2. android:orientation="horizontal"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:layout_gravity="bottom"
  6. >
  7. <com.notice.ib.ImageBt
  8. android:id="@+id/bt_confirm"
  9. android:layout_height="wrap_content"
  10. android:layout_width="wrap_content"
  11. android:layout_alignParentBottom="true"
  12. android:background="@drawable/btbg"
  13. android:clickable="true"
  14. android:focusable="true"
  15. />
  16. <com.notice.ib.ImageBt
  17. android:id="@+id/bt_cancel"
  18. android:layout_toRightOf="@id/bt_confirm"
  19. android:layout_height="wrap_content"
  20. android:layout_width="wrap_content"
  21. android:layout_alignParentBottom="true"
  22. android:background="@drawable/btbg"
  23. android:clickable="true"
  24. android:focusable="true"
  25. />
  26. </RelativeLayout>

注意的是,控件标签使用完整的类名即可。为了给按钮一个点击效果,你需要给他一个selector背景,这里就不说了。

  最后一步,即在activity中设置该控件的内容。当然,在xml中也可以设置,但是只能设置一个,当我们需要两次使用这样的控件,并且显示内容不 同时就不行了。在activity中设置也非常简单,我们在ImageBt这个类中已经写好了相应的方法,简单调用即可。代码如下:

[java] view plain copy
  1. publicclassMainActivityextendsActivity{
  2. privateImageBtib1;
  3. privateImageBtib2;
  4. /**Calledwhentheactivityisfirstcreated.*/
  5. @Override
  6. publicvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.login);
  9. ib1=(ImageBt)findViewById(R.id.bt_confirm);
  10. ib2=(ImageBt)findViewById(R.id.bt_cancel);
  11. ib1.setTextViewText("确定");
  12. ib1.setImageResource(R.drawable.confirm);
  13. ib2.setTextViewText("取消");
  14. ib2.setImageResource(R.drawable.cancel);
  15. ib1.setOnClickListener(newOnClickListener(){
  16. @Override
  17. publicvoidonClick(Viewv){
  18. //在这里可以实现点击事件
  19. }
  20. });
  21. }
  22. }

 这样,一个带文字和图片的组合按钮控件就完成了。这样梳理一下,使用还是非常简单的。组合控件能做的事还非常多,主要是在类似上例中的ImageBt类中写好要使用的方法即可。

再来看一个组合控件,带删除按钮的EidtText。即在用户输入后,会出现删除按钮,点击即可取消用户输入。

定义方法和上例一样。首先写一个自定义控件的布局:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. >
  6. <EditText
  7. android:id="@+id/et"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:singleLine="true"
  11. />
  12. <ImageButton
  13. android:id="@+id/ib"
  14. android:visibility="gone"
  15. android:src="@drawable/menu_delete"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:background="#00000000"
  19. android:layout_alignRight="@+id/et"/>
  20. </RelativeLayout>


实现输入框右侧带按钮效果,注意将按钮隐藏。然后写一个EditCancel类,实现删除用户输入功能。这里用到了TextWatch这个接口,监听输入框中的文字变化。使用也很简单,实现他的三个方法即可。看代码:

[java] view plain copy
  1. packagecom.notice.ce;
  2. importandroid.content.Context;
  3. importandroid.text.Editable;
  4. importandroid.text.TextWatcher;
  5. importandroid.util.AttributeSet;
  6. importandroid.view.LayoutInflater;
  7. importandroid.view.View;
  8. importandroid.widget.EditText;
  9. importandroid.widget.ImageButton;
  10. importandroid.widget.LinearLayout;
  11. publicclassEditCancelextendsLinearLayoutimplementsEdtInterface{
  12. ImageButtonib;
  13. EditTextet;
  14. publicEditCancel(Contextcontext){
  15. super(context);
  16. }
  17. publicEditCancel(Contextcontext,AttributeSetattrs){
  18. super(context,attrs);
  19. LayoutInflater.from(context).inflate(R.layout.custom_editview,this,true);
  20. init();
  21. }
  22. privatevoidinit(){
  23. ib=(ImageButton)findViewById(R.id.ib);
  24. et=(EditText)findViewById(R.id.et);
  25. et.addTextChangedListener(tw);//为输入框绑定一个监听文字变化的监听器
  26. //添加按钮点击事件
  27. ib.setOnClickListener(newOnClickListener(){
  28. @Override
  29. publicvoidonClick(Viewv){
  30. hideBtn();//隐藏按钮
  31. et.setText("");//设置输入框内容为空
  32. }
  33. });
  34. }
  35. //当输入框状态改变时,会调用相应的方法
  36. TextWatchertw=newTextWatcher(){
  37. @Override
  38. publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){
  39. //TODOAuto-generatedmethodstub
  40. }
  41. @Override
  42. publicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){
  43. //TODOAuto-generatedmethodstub
  44. }
  45. //在文字改变后调用
  46. @Override
  47. publicvoidafterTextChanged(Editables){
  48. if(s.length()==0){
  49. hideBtn();//隐藏按钮
  50. }else{
  51. showBtn();//显示按钮
  52. }
  53. }
  54. };
  55. @Override
  56. publicvoidhideBtn(){
  57. //设置按钮不可见
  58. if(ib.isShown())ib.setVisibility(View.GONE);
  59. }
  60. @Override
  61. publicvoidshowBtn(){
  62. //设置按钮可见
  63. if(!ib.isShown())ib.setVisibility(View.VISIBLE);
  64. }
  65. }
  66. interfaceEdtInterface{
  67. publicvoidhideBtn();
  68. publicvoidshowBtn();
  69. }

另外,实现ImageButton(即那个叉)的点击事件,删除输入框中的内容,并隐藏按钮。

在TextWatch接口的afterTextChanged方法中对文字进行判断,若长度为0,就隐藏按钮,否则,显示按钮。

后面两步的实现就是加入到实际布局中,就不再写出来了,和上例的步骤一样的。最后显示效果如图:

更多相关文章

  1. Android(安卓)Material Design 控件常用的属性
  2. (笔记)RecyclerView item按下变色效果 没有生效
  3. android文件选择器filePicker
  4. Android33_Animations使用(一)
  5. 某android平板项目开发笔记----aChartEngine图表显示(2)
  6. android基础学习之有没有标签基础设置
  7. Android(安卓)permission 权限类及中文说明
  8. 修改WebView背景颜色为透明
  9. android opengles 实现翻牌效果

随机推荐

  1. Android(安卓)WebService(基于SOAP协议)
  2. Android开发第3-3课:支持不同的平台版本
  3. 简单定时器 Timer
  4. android文件管理器--界面效果二(layout)
  5. LinearGradient
  6. Building Android(安卓)FW for my Dream
  7. android图片异步加载到本地
  8. Android(安卓)String.xml Html格式化方法
  9. CirleDrawImage圆角图片
  10. android反射获取资源