Android 自定義view模板并實現(xiàn)點擊事件的回調(diào)
Android 自定義view模板并實現(xiàn)點擊事件的回調(diào)
主要的目的就是仿老版QQ的一個界面做一個模板。然后實現(xiàn)點擊事件的回調(diào)。先看效果圖:
步驟如下:
1.在res/values/目錄下新建一個atts.xml文件
內(nèi)容如下:
<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添加回調(diào)點擊事件,好處是不需要每次都修改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);來實現(xiàn) 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來實現(xiàn)的。
注意:由于我們的目的是自定義模板View,所以我們最好不要在TopBar.java中做如下操作:
leftBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //listener.leftBtnClick();//回調(diào)實現(xiàn) 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();//回調(diào)實現(xiàn) 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="網(wǎng)易新聞" 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); /** * 利用回調(diào)實現(xiàn)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("鳳凰網(wǎng)"); } }
這樣可以在MainActivity中通過回調(diào)來實現(xiàn)點擊事件。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
Android 中ViewPager中使用WebView的注意事項
這篇文章主要介紹了Android 中ViewPager中使用WebView的注意事項的相關資料,希望通過本文大家在使用過程中遇到這樣的問題解決,需要的朋友可以參考下2017-09-09Android Studio查看Android 5.x源碼的步驟詳解
Google為Android開發(fā)者帶來Android Studio,用來取代Eclipse。從Android Studio出現(xiàn)起,整機開發(fā)和Android源碼閱讀和編輯一定能用上它。這篇文章小編就帶大家學習下如何使用Android Studio查看Android 5.x源碼,有需要的可以參考借鑒。2016-09-09Android開發(fā)使用Handler實現(xiàn)圖片輪播功能示例
這篇文章主要介紹了Android開發(fā)使用Handler實現(xiàn)圖片輪播功能,涉及Android基于Handler操作圖片的相關實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下2017-09-09android實現(xiàn)簡單進度條ProgressBar效果
這篇文章主要為大家詳細介紹了android實現(xiàn)簡單進度條ProgressBar效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07