最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年01月24日 15:00:38   作者:小豬快跑22  
這篇文章主要介紹了Android 自定義view模板并實(shí)現(xiàn)點(diǎn)擊事件的回調(diào)的相關(guān)資料,需要的朋友可以參考下

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文件來(lái)進(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)來(lái)的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)行布局
     */
    //左邊的按鈕位于父布局的左邊,通過(guò)addRule(RelativeLayout.ALIGN_PARENT_LEFT);來(lái)實(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是通過(guò)繼承自RelativeLayout來(lái)實(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();
      }
    });

如果這樣做對(duì)于不同的點(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中通過(guò)回調(diào)來(lái)實(shí)現(xiàn)點(diǎn)擊事件。

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

相關(guān)文章

  • 關(guān)于Android內(nèi)存緩存LruCache的使用及其源碼解析

    關(guān)于Android內(nèi)存緩存LruCache的使用及其源碼解析

    LruCache作為內(nèi)存緩存,使用強(qiáng)引用方式緩存有限個(gè)數(shù)據(jù),當(dāng)緩存的某個(gè)數(shù)據(jù)被訪問(wèn)時(shí),它就會(huì)被移動(dòng)到隊(duì)列的頭部,本文詳細(xì)介紹了關(guān)于Android內(nèi)存緩存LruCache的使用及其源碼解析,需要的朋友可以參考下
    2023-05-05
  • Android?Flutter繪制扇形圖詳解

    Android?Flutter繪制扇形圖詳解

    在開(kāi)發(fā)過(guò)程中通常會(huì)遇到一些不規(guī)則的UI,比如不規(guī)則的線條,多邊形,統(tǒng)計(jì)圖表等等,用那些通用組件通過(guò)組合的方式無(wú)法進(jìn)行實(shí)現(xiàn),這就需要我們自己進(jìn)行繪制。本文將利用Flutter繪制扇形圖,感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Android多功能視頻播放器GSYVideoPlayer開(kāi)發(fā)流程

    Android多功能視頻播放器GSYVideoPlayer開(kāi)發(fā)流程

    怎么在Android中實(shí)現(xiàn)GSYVideoPlayer視頻播放器?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲
    2022-11-11
  • Android 關(guān)閉多個(gè)Activity的實(shí)現(xiàn)方法

    Android 關(guān)閉多個(gè)Activity的實(shí)現(xiàn)方法

    這篇文章主要介紹了Android 關(guān)閉多個(gè)Activity的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • ProtoBuf動(dòng)態(tài)拆分Gradle?Module解析

    ProtoBuf動(dòng)態(tài)拆分Gradle?Module解析

    這篇文章主要為大家介紹了ProtoBuf動(dòng)態(tài)拆分Gradle?Module解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Android文件下載進(jìn)度條的實(shí)現(xiàn)代碼

    Android文件下載進(jìn)度條的實(shí)現(xiàn)代碼

    我們今天開(kāi)始學(xué)習(xí)的是下載進(jìn)度的實(shí)現(xiàn)。今天的這段代碼是網(wǎng)上找的,自己做了些小改,通過(guò)模擬器測(cè)試。文件下載進(jìn)度條控制(就是為了高清壁紙加個(gè)進(jìn)度條),自己研究了好久,但是進(jìn)度條只能顯示緩存寫入文件的進(jìn)度,不能顯示下載進(jìn)度。找了好久,終于找到一段用的代碼,所以記錄下來(lái),大家分享
    2013-01-01
  • Android多線程斷點(diǎn)續(xù)傳下載示例詳解

    Android多線程斷點(diǎn)續(xù)傳下載示例詳解

    這篇文章主要為大家詳細(xì)介紹了Android多線程斷點(diǎn)續(xù)傳下載示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • android特賣列表倒計(jì)時(shí)卡頓問(wèn)題的解決方法

    android特賣列表倒計(jì)時(shí)卡頓問(wèn)題的解決方法

    這篇文章主要為大家詳細(xì)介紹了android特賣列表倒計(jì)時(shí)卡頓問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Android條紋進(jìn)度條的實(shí)現(xiàn)(調(diào)整view寬度仿進(jìn)度條)

    Android條紋進(jìn)度條的實(shí)現(xiàn)(調(diào)整view寬度仿進(jìn)度條)

    這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)條紋進(jìn)度條的方法,主要是通過(guò)調(diào)整view寬度仿進(jìn)度條,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
    2018-09-09
  • 自己實(shí)現(xiàn)的android樹(shù)控件treeview

    自己實(shí)現(xiàn)的android樹(shù)控件treeview

    在項(xiàng)目中經(jīng)常需要一個(gè)需要一個(gè)樹(shù)狀框架,因?yàn)橐恍┰驔](méi)有使用系統(tǒng)自帶的控件,所以就自己寫了一個(gè),現(xiàn)在分享給大家
    2014-01-01

最新評(píng)論

呼玛县| 涟源市| 遂平县| 纳雍县| 新竹市| 宜宾县| 蕉岭县| 栾城县| 浮山县| 崇文区| 西乌珠穆沁旗| 长寿区| 弥勒县| 隆子县| 灵山县| 招远市| 金溪县| 德化县| 女性| 和政县| 凭祥市| 沙田区| 辽宁省| 综艺| 郎溪县| 惠来县| 曲阜市| 天长市| 原平市| 伊金霍洛旗| 永嘉县| 满洲里市| 竹溪县| 荆门市| 体育| 开远市| 平原县| 阜宁县| 平乡县| 泰宁县| 伊通|