android重写UI控件

很多时候android自定义控件并不克不及满足需求,如何做呢?很多办法,可以本身绘制一个,可以经由过程持续根蒂根基控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最便利的一个办法。今天就来介绍下如何应用组合控件,将经由过程两个实例来介绍。

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

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

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="fill_parent"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/iv"android:src="@drawable/confirm"android:paddingTop="5dip"android:paddingBottom="5dip"android:paddingLeft="40dip"android:layout_gravity="center_vertical"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="断定"android:textColor="#000000"android:id="@+id/tv"android:layout_marginLeft="8dip"android:layout_gravity="center_vertical"/></LinearLayout>

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

packagecom.notice.ib;

importandroid.content.Context;

importandroid.util.AttributeSet;

importandroid.view.LayoutInflater;

importandroid.widget.ImageView;

importandroid.widget.LinearLayout;

importandroid.widget.TextView;

publicclassImageBtextendsLinearLayout{

privateImageViewiv;

privateTextViewtv;

publicImageBt(Contextcontext){

this(context,null);

}

publicImageBt(Contextcontext,AttributeSetattrs){

super(context,attrs);

//导入布局

LayoutInflater.(context).inflate(R.layout.custombt,this,true);

iv=(ImageView)findViewById(R.id.iv);

tv=(TextView)findViewById(R.id.tv);

}

/***设置图片资料*/

publicvoidsetImageResource(intresId){

iv.setImageResource(resId);

}

/***设置显示的文字*/

publicvoidsetTextViewText(Stringtext){

tv.setText(text);}}

第三步,在须要应用这个自定义控件的layout中参加这控件,只须要在xml中参加即可。办法如下:

<RelativeLayout

android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"><com.notice.ib.ImageBt

android:id="@+id/bt_confirm"android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_alignParentBottom="true"android:background="@drawable/btbg"android:clickable="true"android:focusable="true"

/>

<com.notice.ib.ImageBt

android:id="@+id/bt_cancel"

android:layout_toRightOf="@id/bt_confirm"android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_alignParentBottom="true"android:background="@drawable/btbg"android:clickable="true"android:focusable="true"/>

</RelativeLayout>

重视的是,控件标签应用完全的类名即可。为了给按钮一个点击结果,你须要给他一个or靠山,这里就不说了。

最后一步,即在activity中设置该控件的内容。当然,在xml中也可以设置,然则只能设置一个,当我们须要两次应用如许的控件,并且显示内容不应时就不可了。在activity中设置也很是简单,我们在ImageBt这个类中已经写好了响应的办法,简单调用即可。代码如下:

publicclassMainActivityextendsActivity{

privateImageBtib1;

privateImageBtib2;

/**Calledwhentheactivityisfirstcreated.*/

@Override

publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);

setContentView(R.layout.login);

ib1=(ImageBt)findViewById(R.id.bt_confirm);

ib2=(ImageBt)findViewById(R.id.bt_cancel);ib1.setTextViewText("断定");

ib1.setImageResource(R.drawable.confirm);

ib2.setTextViewText("作废");

ib2.setImageResource(R.drawable.cancel);ib1.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

//在这里可以实现点击事务

}

});

}}

如许,一个带文字和图片的组合按钮控件就完成了。如许梳理一下,应用还是很是简单的。组合控件能做的事还很是多,主如果在类似上例中的ImageBt类中写好要应用的办法即可。

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

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

<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent">

<EditTextandroid:id="@+id/et"android:layout_width="fill_parent"android:layout_height="wrap_content"android:singleLine="true"/>

<ImageButtonandroid:id="@+id/ib"

android:visibility="gone"

android:src="@drawable/menu_"android:layout_width="wrap_content"android:layout_height="wrap_content"

android:background="#00000000"

android:layout_alignRight="@+id/et"/>

</RelativeLayout>

实现输入框右侧带按钮结果,重视将按钮隐蔽。然后写一个EditCancel类,实现删除用户输入功能。这里用到了TextWatch这个接口,监听输入框中的文字变更。应用也很简单,实现他的三个办法即可。看代码:

packagecom.notice.ce;

importandroid.content.Context;

importandroid.text.Editable;

importandroid.text.TextWatcher;

importandroid.util.AttributeSet;

importandroid.view.LayoutInflater;

importandroid.view.View;

importandroid.widget.EditText;

importandroid.widget.ImageButton;

importandroid.widget.LinearLayout;

publicclassEditCancelextendsLinearLayoutimplementsEdtInterface{

ImageButtonib;

EditTextet;

publicEditCancel(Contextcontext){

super(context);

}

publicEditCancel(Contextcontext,AttributeSetattrs){super(context,attrs);

LayoutInflater.(context).inflate(R.layout.custom_editview,this,true);

init();

}

privatevoidinit(){

ib=(ImageButton)findViewById(R.id.ib);

et=(EditText)findViewById(R.id.et);et.addTextChangedListener(tw);

//为输入框绑定一个监听文字变更的****

//添加按钮点击事务

ib.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

hideBtn();

//隐蔽按钮

et.setText("");

//设置输入框内容为空

}

});

}

//当输入框状况改变时,会调用响应的办法

TextWatchertw=newTextWatcher(){

@Override

publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){

//TODOAuto-generatedmethodstub}

@Override

publicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){

//TODOAuto-generatedmethodstub

}

//在文字改变后调用

@Override

publicvoidafterTextChanged(Editables){if(s.length()==0){

hideBtn();//隐蔽按钮

}else{

showBtn();//显示按钮

}

}

};

@OverridepublicvoidhideBtn(){

//设置按钮不成见

if(ib.isShown())ib.setVisibility(View.GONE);

}

@Override

publicvoidshowBtn(){

//设置按钮可见

if(!ib.isShown())ib.setVisibility(View.VISIBLE);

}}interfaceEdtInterface{

publicvoidhideBtn();

publicvoidshowBtn();}

在TextWatch接口的afterTextChanged办法中对文字进行断定,若长度为0,就隐蔽按钮,不然,显示按钮。

别的,实现ImageButton(即那个叉)的点击事务,删除输入框中的内容,并隐蔽按钮。

相关推荐