android 自定义回调,Android 自定义view模板并实现点击事件的回调

Android 自定义view模板并实现点击事件的回调

主要的目的就是仿老版QQ的一个界面做一个模板。然后实现点击事件的回调。先看效果图:

步骤如下:

1.在res/values/目录下新建一个atts.xml文件

内容如下:

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, 0);

addView(leftBtn, leftBtnParams);

righBtnParams = new LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,

RelativeLayout.LayoutParams.WRAP_CONTENT);

righBtnParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

righBtnParams.setMargins(0, 18, 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文件中的点击事件,失去了模板的意义。

主布局文件代码如下:

xmlns:custom="http://schemas.android.com/apk/res/com.example.viewpagerdemo"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

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"

>

上面的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, "RIGHT BUTTOM CLICK", Toast.LENGTH_SHORT).show();

}

@Override

public void leftBtnClick() {

// TODO Auto-generated method stub

Toast.makeText(TopBarActivity.this, "LEFT BUTTOM CLICK", Toast.LENGTH_SHORT).show();

}

});

//更改TopBar中显示的标题

mTopBar.setTvTitle("凤凰网");

}

}

这样可以在MainActivity中通过回调来实现点击事件。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值