欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发之自定义控件用法详解

程序员文章站 2024-03-06 08:56:43
本文实例讲述了android开发之自定义控件用法。分享给大家供大家参考,具体如下: 今天和大家分享下组合控件的使用。很多时候android自定义控件并不能满足需求,如何做...

本文实例讲述了android开发之自定义控件用法。分享给大家供大家参考,具体如下:

今天和大家分享下组合控件的使用。很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最方便的一个方法。今天就来介绍下如何使用组合控件,将通过两个实例来介绍。

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

Android开发之自定义控件用法详解

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

custom_button.xml

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android=http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
 <imageview
 android:id="@+id/iv"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical"
   android:paddingleft="10.0dip"
   android:paddingtop="10.0dip"
   android:paddingbottom="10.0dip"
   />
 <textview
 android:id="@+id/tv"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:textcolor="#ffffff"
   android:layout_marginleft="8dip"
   android:layout_gravity="center_vertical"
   android:paddingleft="5.0dip"
   android:paddingtop="10.0dip"
   android:paddingbottom="10.0dip"
   android:paddingright="10.0dip"
   android:textsize="18.0sp"
   />
</linearlayout>

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

custombutton.java

package com.szy.customview;
import android.content.context;
import android.util.attributeset;
import android.view.layoutinflater;
import android.widget.imageview;
import android.widget.linearlayout;
import android.widget.textview;
public class custombutton extends linearlayout
{
 private imageview iv;
 private textview tv;
 public custombutton(context context)
 {
 this(context, null);
 }
 public custombutton(context context, attributeset attrs)
 {
 super(context, attrs);
 // 导入布局
 layoutinflater.from(context).inflate(r.layout.custom_button, this, true);
 iv = (imageview) findviewbyid(r.id.iv);
 tv = (textview) findviewbyid(r.id.tv);
 }
 /**
 * 设置图片资源
 */
 public void setimageresource(int resid)
 {
 iv.setimageresource(resid);
 }
 /**
 * 设置显示的文字
 */
 public void settextviewtext(string text)
 {
 tv.settext(text);
 }
}

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

main.xml

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical"
 >
 <com.szy.customview.custombutton
   android:id="@+id/bt_confirm"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="@drawable/button_bg"
   />
 <com.szy.customview.custombutton
   android:id="@+id/bt_cancel"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="@drawable/button_bg"
  />
</linearlayout>

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

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

package com.szy.customview;
import android.app.activity;
import android.os.bundle;
import android.view.view;
import android.view.view.onclicklistener;
public class mainactivity extends activity
{
 private custombutton btnconfirm;
 private custombutton btncancel;
 @override
 public void oncreate(bundle savedinstancestate)
 {
 super.oncreate(savedinstancestate);
 setcontentview(r.layout.main);
 btnconfirm = (custombutton) findviewbyid(r.id.bt_confirm);
 btncancel = (custombutton) findviewbyid(r.id.bt_cancel);
 btnconfirm.settextviewtext("确定");
 btnconfirm.setimageresource(r.drawable.confirm);
 btncancel.settextviewtext("取消");
 btncancel.setimageresource(r.drawable.cancel);
 btnconfirm.setonclicklistener(new onclicklistener()
 {
  @override
  public void onclick(view v)
  {
  // 在这里可以实现点击事件
  }
 });
 }
}

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

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

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

custom_editview.xml:

<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
 <edittext
   android:id="@+id/et"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:singleline="true"
   />
 <imagebutton
   android:id="@+id/ib"
   android:visibility="gone"
   android:src="@drawable/cancel"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="#00000000"
   android:layout_alignright="@+id/et" />
</relativelayout>

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

customeditview.java

package com.szy.customview;
import android.content.context;
import android.text.editable;
import android.text.textwatcher;
import android.util.attributeset;
import android.view.layoutinflater;
import android.view.view;
import android.widget.edittext;
import android.widget.imagebutton;
import android.widget.linearlayout;
public class customeditview extends linearlayout implements edtinterface
{
 imagebutton ib;
 edittext et;
 public customeditview(context context)
 {
 super(context);
 }
 public customeditview(context context, attributeset attrs)
 {
 super(context, attrs);
 layoutinflater.from(context).inflate(r.layout.custom_editview, this, true);
 init();
 }
 private void init()
 {
 ib = (imagebutton) findviewbyid(r.id.ib);
 et = (edittext) findviewbyid(r.id.et);
 et.addtextchangedlistener(tw);// 为输入框绑定一个监听文字变化的监听器
 // 添加按钮点击事件
 ib.setonclicklistener(new onclicklistener()
 {
  @override
  public void onclick(view v)
  {
  hidebtn();// 隐藏按钮
  et.settext("");// 设置输入框内容为空
  }
 });
 }
 // 当输入框状态改变时,会调用相应的方法
 textwatcher tw = new textwatcher()
 {
 @override
 public void ontextchanged(charsequence s, int start, int before, int count)
 {
  // todo auto-generated method stub
 }
 @override
 public void beforetextchanged(charsequence s, int start, int count, int after)
 {
  // todo auto-generated method stub
 }
 // 在文字改变后调用
 @override
 public void aftertextchanged(editable s)
 {
  if (s.length() == 0)
  {
  hidebtn();// 隐藏按钮
  } else
  {
  showbtn();// 显示按钮
  }
 }
 };
 @override
 public void hidebtn()
 {
 // 设置按钮不可见
 if (ib.isshown())
  ib.setvisibility(view.gone);
 }
 @override
 public void showbtn()
 {
 // 设置按钮可见
 if (!ib.isshown())
 {
  ib.setvisibility(view.visible);
 }
 }
}
interface edtinterface
{
 public void hidebtn();
 public void showbtn();
}

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

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

后面两步的实现就是加入到实际布局中:

main.xml

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical"
 >
 <com.szy.customview.customeditview
 android:layout_width="fill_parent"
   android:layout_height="wrap_content"
  />
</linearlayout>

最后显示效果如图:

Android开发之自定义控件用法详解

更多关于android相关内容感兴趣的读者可查看本站专题:《android控件用法总结》、《android视图view技巧总结》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android文件操作技巧汇总》、《android编程开发之sd卡操作方法汇总》、《android开发入门与进阶教程》及《android资源操作技巧汇总

希望本文所述对大家android程序设计有所帮助。