国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 自定義view模板并實(shí)現(xiàn)點(diǎn)擊事件的回調(diào)

2019-12-12 03:52:39
字體:
供稿:網(wǎng)友

Android 自定義view模板并實(shí)現(xiàn)點(diǎn)擊事件的回調(diào)

主要的目的就是仿老版QQ的一個(gè)界面做一個(gè)模板。然后實(shí)現(xiàn)點(diǎn)擊事件的回調(diào)。先看效果圖:

BACK 和MORE是兩個(gè)按鈕,

步驟如下:

1.在res/values/目錄下新建一個(gè)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文件完成后,就是寫一個(gè)TopBar.java文件來進(jìn)行布局:

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)點(diǎn)擊事件,好處是不需要每次都修改TopBar中的點(diǎn)擊事件,只需修改從外面?zhèn)鬟M(jìn)來的Listener的點(diǎn)擊事件   * @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);//設(shè)置整個(gè)背景色    /**     * 將3個(gè)控件進(jìn)行布局     */    //左邊的按鈕位于父布局的左邊,通過addRule(RelativeLayout.ALIGN_PARENT_LEFT);來實(shí)現(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來實(shí)現(xiàn)的。

注意:由于我們的目的是自定義模板View,所以我們最好不要在TopBar.java中做如下操作:

leftBtn.setOnClickListener(new OnClickListener() {      @Override      public void onClick(View v) {        // TODO Auto-generated method stub        //listener.leftBtnClick();//回調(diào)實(shí)現(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)實(shí)現(xiàn)        Toast.makeText(context, "RIGHT BUTTOM CLICK", Toast.LENGTH_SHORT).show();      }    });

如果這樣做對于不同的點(diǎn)擊事件都需要修改TopBar.java文件中的點(diǎn)擊事件,失去了模板的意義。

主布局文件代碼如下:

<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/ 后面是包名。作用相當(dāng)于導(dǎo)入包名

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)實(shí)現(xiàn)TopBar的點(diǎn)擊事件     */    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中顯示的標(biāo)題    mTopBar.setTvTitle("鳳凰網(wǎng)");  }}

這樣可以在MainActivity中通過回調(diào)來實(shí)現(xiàn)點(diǎn)擊事件。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 芒康县| 龙川县| 清水河县| 临高县| 丰台区| 香格里拉县| 梁平县| 琼结县| 象州县| 曲松县| 上林县| 绵阳市| 临桂县| 灵璧县| 阳江市| 兰溪市| 黎川县| 鄂托克前旗| 大城县| 东乌珠穆沁旗| 邢台县| 利津县| 肇州县| 黑水县| 大方县| 绵竹市| 景泰县| 东乌珠穆沁旗| 丘北县| 贡嘎县| 环江| 赤城县| 亚东县| 崇义县| 共和县| 万州区| 郴州市| 固原市| 仲巴县| 罗定市| 资源县|