Android 自定義view模板并實現點擊事件的回調
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中的點擊事件,只需修改從外面?zhèn)鬟M來的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文件中的點擊事件,失去了模板的意義。
主布局文件代碼如下:
<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, "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中通過回調來實現點擊事件。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
關于Android內存緩存LruCache的使用及其源碼解析
LruCache作為內存緩存,使用強引用方式緩存有限個數據,當緩存的某個數據被訪問時,它就會被移動到隊列的頭部,本文詳細介紹了關于Android內存緩存LruCache的使用及其源碼解析,需要的朋友可以參考下2023-05-05
Android多功能視頻播放器GSYVideoPlayer開發(fā)流程
怎么在Android中實現GSYVideoPlayer視頻播放器?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲2022-11-11
ProtoBuf動態(tài)拆分Gradle?Module解析
這篇文章主要為大家介紹了ProtoBuf動態(tài)拆分Gradle?Module解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02

