Welcome

首页 / 移动开发 / Android / Android 自定义view模板并实现点击事件的回调

Android 自定义view模板并实现点击事件的回调
主要的目的就是仿老版QQ的一个界面做一个模板。然后实现点击事件的回调。先看效果图:
BACK 和MORE是两个按钮,
步骤如下:

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 stubTypedArray 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stublistener.leftBtnClick();}});rightBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stublistener.rightBtnClick();}});}public void setTvTitle(String value){tvTitle.setText(value);}}
TopBar是通过继承自RelativeLayout来实现的。

注意:由于我们的目的是自定义模板View,所以我们最好不要在TopBar.java中做如下操作:
leftBtn.setOnClickListener(new OnClickListener() {@Overridepublic 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() {@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.topbar_layout);mTopBar = (TopBar) findViewById(R.id.topbar);/** * 利用回调实现TopBar的点击事件 */mTopBar.setTopbarClickListener(new topbarClickListener() {@Overridepublic void rightBtnClick() {// TODO Auto-generated method stubToast.makeText(TopBarActivity.this, "RIGHT BUTTOM CLICK", Toast.LENGTH_SHORT).show();}@Overridepublic void leftBtnClick() {// TODO Auto-generated method stubToast.makeText(TopBarActivity.this, "LEFT BUTTOM CLICK", Toast.LENGTH_SHORT).show();}});//更改TopBar中显示的标题mTopBar.setTvTitle("凤凰网");}}
这样可以在MainActivity中通过回调来实现点击事件。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!