当前位置: 移动技术网 > IT编程>移动开发>Android > Android开发之自定义控件用法详解

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

有哲理的人,无胆匪类,绝壁临巨川下一句

本文实例讲述了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视图view技巧总结》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android文件操作技巧汇总》、《android编程开发之sd卡操作方法汇总》、《android开发入门与进阶教程》及《android资源操作技巧汇总

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网