`
flyering
  • 浏览: 37550 次
  • 性别: Icon_minigender_1
  • 来自: 河北保定
社区版块
存档分类
最新评论

android重写UI控件

阅读更多
很多时候android自定义控件并不克不及满足需求,如何做呢?很多办法,可以本身绘制一个,可以经由过程持续根蒂根基控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最便利的一个办法。今天就来介绍下如何应用组合控件,将经由过程两个实例来介绍。
第一个实现一个带图片和文字的按钮,如图所示:
全部过程可以分四步走。第一步,定义一个layout,实现按钮内部的布局。代码如下:
<?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: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"    /><TextView    android: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,导入方才的布局,并且设置须要的办法,从而使的能在代码中把握这个自定义控件内容的显示。代码如下:
package com.notice.ib;
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 ImageBt extends LinearLayout {   
private ImageView iv;  
private TextView  tv;   
public ImageBt(Context context) {       
this(context, null);   
}   
public ImageBt(Context context, AttributeSet attrs) {
       
super(context, attrs);       
// 导入布局       
LayoutInflater.(context).inflate(R.layout.custombt, 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中参加即可。办法如下:





<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这个类中已经写好了响应的办法,简单调用即可。代码如下:
public class MainActivity extends Activity {   
private ImageBt ib1;   
private ImageBt ib2;   
/** Called when the activity is first created. */   
@Override   
public void onCreate(Bundle savedInstanceState) {        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(new OnClickListener() {           
@Override           
public void onClick(View v) {                   
//在这里可以实现点击事务           
}       
});  
}}



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



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



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





<?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/menu_"    android:layout_width="wrap_content"    android:layout_height="wrap_content"   
android:background="#00000000"   
android:layout_alignRight="@+id/et" />
</RelativeLayout>



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





package com.notice.ce;
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 EditCancel extends LinearLayout implements EdtInterface {   
ImageButton ib;   
EditText    et;   
public EditCancel(Context context) {       
super(context);   
}   
public EditCancel(Context context, AttributeSet attrs) {        super(context, attrs);       
LayoutInflater.(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(即那个叉)的点击事务,删除输入框中的内容,并隐蔽按钮。



分享到:
评论

相关推荐

    Android自定义view组合控件、重写控件的例子源码.rar

    Android自定义view组合控件、重写控件的例子源码,创建出对应的组合布局视图,将创建出的视图添加到根节点。Android使用view控件的例子,面向Android开发新手,高手绕行。

    Android UI开发专题(四) View自绘控件

    很多时候想要设计漂亮的Android UI,使用Android自带的控件无法满足我们的需要就要考虑自绘控件,在Android界面显示类View,可以通过继承扩展重写相关方法来实现我们的图形绘制。 首先我们需要了解下View类的底层...

    android 自定义控件入门的例子源码

    这是我写的 Android 自定义控件入门 这个小教程的例子源码,十分基础,用了同一个例子的不同写法和扩展,简单明了的讲解了View的重写,教程请去我的博客,地址为:...希望大家能通过简单的例子学到东西,举一反三。...

    Android UI开发 View自绘控件 分享

    很多时候想要设计漂亮的Android UI,使用Android自带的控件无法满足我们的需要就要考虑自绘控件,在Android界面显示类View,可以通过继承扩展重写相关方法来实现我们的图形绘制。  首先我们需要了解下View类的底层...

    android 随着手指滑动的view所需要的控件

    网上搜集的两个工程 其中一个工程用到了jar包,...另一个工程用到了重写的viewgroup,这个刚拿来也没什么用,改了一下,在viewgroup类中向调用它的类发送广播才实现滑动以后的动作,或者把自己的UI写到viewgroup中。

    SwissArmyKnife-android免root兼容所有版本ui调试工具.zip

    SwissArmyKnife是什么SwissArmyKnife 是一款方便调试android UI的工具,可以兼容所有android版本,不需要root权限。可以直接在android手机屏幕上显示当前Activity中所有控件(不管是否隐藏)的边界,内外边距大小,...

    Android实现View滑动的几种方式

     Android中的View类是所有UI控件的基类(Base class),也就是说我们平时所有到的各种UI控件,比如Button、ImagView等等都继承自View类。LinearLayout、FrameLayout等布局管理器的直接父类是ViewGroup,而ViewGroup...

    【Android】Android UI 开发_问答_1

    清单文件中,activity 的 name 属性指定的 .java 文件中重写的 onCreate 回调方法中 setContentView(R.layout.布局文件名) 我们自定义的控件的id在哪个文件中?引用系统资源同引用自定义资源的id有什么

    Android DragSortListView左右滑动删除和拖拽排序和功能演示.rar

     关于DragSortListView侧滑控件:  DragSortListView简称DSLV,是Android ListView的一个扩展,支持拖拽排序和左右滑动删除功能。重写了TouchInterceptor(TI)类来提供更加优美的拖拽动画效果,适用于带有任何...

    Android vibrator方法关闭和打开振动功能.rar

    Android vibrator方法关闭和打开振动功能,通过Android vibrator方法设置不同的参数,来关闭和打开手机振动功能:  ToggleButton tb2 = (ToggleButton)findViewById(R.id.tb2); //获得ToggleButton对象  tb2....

    android群雄传

    3.6.3 重写View来实现全新的控件 51 3.7 自定义View Group 54 3.8 事件拦截机制分析 59 第4章 List View使用技巧 65 4.1 List View常用优化技巧 66 4.1.1 使用View Holder模式提高效率 66 4.1.2 设置项目间...

    《Google Android SDK开发范例大全(第3版)》.pdf

     全书共分11章,主要以范例集的方式来讲述android的知识点,详细介绍了开发android的人机交互界面、android常用的开发控件、android手机收发短信等通信服务、开发android手机的自动服务功能和娱乐多媒体功能以及...

    《Android应用开发》个人总结报告.doc

    线线布 局模式可以在比较简单的include进行完成,最重要的一点就是:我们可以自己通过重写 方法或者通过实现View或者Layout等类进行扩充项目需 要的布局(或者控件) ,在学习界面中,我发现Android为我们提供了很好的...

    Google Android SDK开发范例大全(第3版) 1/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

    Google Android SDK开发范例大全(第3版)part2

     全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及...

    Google Android SDK开发范例大全(第3版) 4/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

    Google Android SDK开发范例大全(第3版) 3/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

    疯狂Android讲义源码

     14.4 管理桌面小控件 535  14.5 实时文件夹(LiveFolder) 539  14.5.1 使用实时文件夹显示  ContentProvider的数据 540  14.6 本章小结 545  第15章 传感器应用开发 546  15.1 利用Android的传感器 547  ...

    Google Android SDK开发范例大全(第3版) 5/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

Global site tag (gtag.js) - Google Analytics