AndroID 自定义view模板并实现点击事件的回调
主要的目的就是仿老版QQ的一个界面做一个模板。然后实现点击事件的回调。先看效果图:
步骤如下:
1.在res/values/目录下新建一个atts.xml文件
内容如下:
<resources> <declare-styleable name="topbar"> <attr name="Title" format="string"/> <attr name="TitleBacgroud" format="reference|color"/> <attr name="TitleSize" format="dimension"></attr> <attr name="leftBtnTitle" format="string"></attr> <attr name="leftBtncolor" format="color"></attr> <attr name="leftBtnSize" format="dimension"></attr> <attr name="rightBtnTitle" format="string"></attr> <attr name="rightBtncolor" format="color"></attr> <attr name="rightBtnSize" format="dimension"></attr> </declare-styleable>
attr.xml文件完成后,就是写一个topbar.java文件来进行布局:
public class topbar extends relativeLayout{ private button leftBtn,rightBtn; private TextVIEw tvTitle; private String Title; private float TitleSize ; private Drawable TitleBackground; private String leftBtnTitle; private int leftBtncolor; private float leftBtnSize; private String rightBtnTitle; private int rightBtncolor; private float rightBtnSize; private LayoutParams leftBtnParams,righBtnParams,TitleParams; /** * 为topbar添加回调点击事件,好处是不需要每次都修改topbar中的点击事件,只需修改从外面传进来的Listener的点击事件 * @param context * @param attrs */ public interface topbarClickListener{ voID leftBtnClick(); voID rightBtnClick(); } private topbarClickListener Listener; public voID settopbarClickListener(topbarClickListener ls){ this.Listener = ls; } public topbar(Context context,AttributeSet attrs) { super(context,attrs); // Todo auto-generated constructor stub TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.topbar); Title = ta.getString(R.styleable.topbar_Title); TitleSize = ta.getDimension(R.styleable.topbar_TitleSize,0); TitleBackground = ta.getDrawable(R.styleable.topbar_TitleBacgroud); leftBtnTitle = ta.getString(R.styleable.topbar_leftBtnTitle); leftBtncolor = ta.getcolor(R.styleable.topbar_leftBtncolor,0); leftBtnSize = ta.getDimension(R.styleable.topbar_leftBtnSize,0); rightBtnTitle = ta.getString(R.styleable.topbar_rightBtnTitle); rightBtncolor = ta.getcolor(R.styleable.topbar_rightBtncolor,0); rightBtnSize = ta.getDimension(R.styleable.topbar_rightBtnSize,0); ta.recycle();//资源回收 tvTitle = new TextVIEw(context); leftBtn = new button(context); rightBtn = new button(context); tvTitle.setText(Title); tvTitle.setTextSize(TitleSize); tvTitle.setBackground(TitleBackground); leftBtn.setText(leftBtnTitle); leftBtn.setTextcolor(leftBtncolor); leftBtn.setTextSize(leftBtnSize); rightBtn.setText(rightBtnTitle); rightBtn.setTextcolor(rightBtncolor); rightBtn.setTextSize(rightBtnSize); setBackgroundcolor(color.DKGRAY);//设置整个背景色 /** * 将3个控件进行布局 */ //左边的按钮位于父布局的左边,通过addRule(relativeLayout.AliGN_PARENT_left);来实现 leftBtnParams = new LayoutParams(relativeLayout.LayoutParams.WRAP_CONTENT,relativeLayout.LayoutParams.WRAP_CONTENT); leftBtnParams.addRule(relativeLayout.AliGN_PARENT_left); leftBtnParams.setmargins(0,18,0); addVIEw(leftBtn,leftBtnParams); righBtnParams = new LayoutParams(relativeLayout.LayoutParams.WRAP_CONTENT,relativeLayout.LayoutParams.WRAP_CONTENT); righBtnParams.addRule(relativeLayout.AliGN_PARENT_RIGHT); righBtnParams.setmargins(0,0); addVIEw(rightBtn,righBtnParams); //中间的TextVIEw位于父布局的中间,addRule(relativeLayout.CENTER_IN_PARENT); TitleParams = new LayoutParams(relativeLayout.LayoutParams.WRAP_CONTENT,relativeLayout.LayoutParams.MATCH_PARENT); TitleParams.addRule(relativeLayout.CENTER_IN_PARENT); tvTitle.setGravity(Gravity.CENTER); addVIEw(tvTitle,TitleParams); leftBtn.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { // Todo auto-generated method stub Listener.leftBtnClick(); } }); rightBtn.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { // Todo auto-generated method stub Listener.rightBtnClick(); } }); } public voID setTvTitle(String value){ tvTitle.setText(value); }}
topbar是通过继承自relativeLayout来实现的。
注意:由于我们的目的是自定义模板VIEw,所以我们最好不要在topbar.java中做如下 *** 作:
leftBtn.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { // Todo auto-generated method stub //Listener.leftBtnClick();//回调实现 Toast.makeText(context,"left BUTTOM CliCK",Toast.LENGTH_SHORT).show(); } }); rightBtn.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { // Todo auto-generated method stub //Listener.rightBtnClick();//回调实现 Toast.makeText(context,"RIGHT BUTTOM CliCK",Toast.LENGTH_SHORT).show(); } });
如果这样做对于不同的点击事件都需要修改topbar.java文件中的点击事件,失去了模板的意义。
主布局文件代码如下:
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:custom="http://schemas.androID.com/apk/res/com.example.vIEwpagerdemo" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" > <com.example.vIEwpagerdemo.vIEw.topbar androID:ID="@+ID/topbar" androID:layout_wIDth="match_parent" androID:layout_height="100dp" custom:title="网易新闻" custom:TitleBacgroud="#ff2255" custom:TitleSize="30sp" custom:leftBtntitle="BACK" custom:leftBtncolor="#ff4400" custom:leftBtnSize="24sp" custom:rightBtntitle="MORE" custom:rightBtncolor="#ff4400" custom:rightBtnSize="24sp" ></com.example.vIEwpagerdemo.vIEw.topbar></linearLayout>
上面的xmlns:custom=”http://schemas.androID.com/apk/res/com.example.vIEwpagerdemo”是必须要添加的,res/ 后面是包名。作用相当于导入包名
MainActivity.java 文件如下:
public class topBaractivity extends Activity{ private topbar mtopbar; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { // Todo auto-generated method stub super.onCreate(savedInstanceState); requestwindowFeature(Window.FEATURE_NO_Title); setContentVIEw(R.layout.topbar_layout); mtopbar = (topbar) findVIEwByID(R.ID.topbar); /** * 利用回调实现topbar的点击事件 */ mtopbar.settopbarClickListener(new topbarClickListener() { @OverrIDe public voID rightBtnClick() { // Todo auto-generated method stub Toast.makeText(topBaractivity.this,Toast.LENGTH_SHORT).show(); } @OverrIDe public voID leftBtnClick() { // Todo auto-generated method stub Toast.makeText(topBaractivity.this,Toast.LENGTH_SHORT).show(); } }); //更改topbar中显示的标题 mtopbar.setTvTitle("凤凰网"); }}
这样可以在MainActivity中通过回调来实现点击事件。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
总结以上是内存溢出为你收集整理的Android 自定义view模板并实现点击事件的回调全部内容,希望文章能够帮你解决Android 自定义view模板并实现点击事件的回调所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)