Android學習之製作第一個自己的 GitHub 依賴庫

製作自己的 GitHub 依賴庫——俗稱“造輪子”

一、步驟

  1. Android Library 中製作簡易的自定義佈局
  2. 本地測試
  3. 上傳 GitHub
  4. 生成 release 版本
  5. 添加到 JitPack
  6. 依賴使用測試

二、效果圖

效果圖

三、開發

(一)在Android Library中製作簡易的自定義佈局
  1. 在 Android 工程中新建 Module
    新建Module
  2. 新建 Android Library
    新建Android Library
  3. 文件位置概覽
    settingitembarlibrary
  4. Library 開發之繪製自定義佈局(setting_item_bar.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/relative_layout"
    android:background="@color/nav_bar_background"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="8dp"
    android:paddingBottom="8dp">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:layout_alignParentLeft="true"
        android:layout_centerInParent="true"
        android:layout_margin="5dp"
        android:src="@drawable/setting" />

    <TextView
        android:id="@+id/title_text"
        android:layout_width="wrap_content"
        android:layout_height="25dp"
        android:gravity="center_vertical"
        android:layout_marginRight="5dp"
        android:layout_marginLeft="16dp"
        android:layout_toRightOf="@id/icon"
        android:layout_centerInParent="true"
        android:text="@string/nav_bar_title_default"
        android:textColor="#292929"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="25dp"
        android:gravity="center_vertical"
        android:layout_marginRight="8dp"
        android:layout_marginLeft="5dp"
        android:layout_toLeftOf="@id/forward"
        android:layout_centerInParent="true"
        android:text="@string/nav_bar_info_default"
        android:textSize="16sp"/>

    <ImageView
        android:id="@+id/forward"
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:layout_margin="5dp"
        android:layout_alignParentRight="true"
        android:layout_centerInParent="true"
        android:src="@drawable/forward" />

</RelativeLayout>
  1. Library 開發之自定義佈局屬性(attrs.xml)
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--
        一個屬性集合,外層的name是屬性集合名稱,
        內層的name則是屬性的名稱,format則是屬性的值的類型
    -->
    <declare-styleable name="SettingItemBar">
        <!-- TextView的內容以及可見性 -->
        <attr name="title_text" format="string|reference" />
        <attr name="title_text_visibility">
            <enum name="visible" value="0" />
            <enum name="invisible" value="4" />
            <enum name="gone" value="8" />
        </attr>
        <!-- TextView的內容以及可見性 -->
        <attr name="info_text" format="string|reference" />
        <attr name="info_text_visibility">
            <enum name="visible" value="0" />
            <enum name="invisible" value="4" />
            <enum name="gone" value="8" />
        </attr>
        <!-- ImageView的內容以及可見性 -->
        <attr name="icon_iv" format="reference" />
        <attr name="icon_iv_visibility">
            <enum name="visible" value="0" />
            <enum name="invisible" value="4" />
            <enum name="gone" value="8" />
        </attr>
        <!-- ImageView的內容以及可見性 -->
        <attr name="forward_iv" format="reference" />
        <attr name="forward_iv_visibility">
            <enum name="visible" value="0" />
            <enum name="invisible" value="4" />
            <enum name="gone" value="8" />
        </attr>
        <!-- 自定義佈局的背景顏色 -->
        <attr name="background_color" format="color" />
    </declare-styleable>

</resources>
  1. 編寫控制自定義佈局的 java 類實現對其控制。(SettingItemBar.java)
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class SettingItemBar extends RelativeLayout {

    RelativeLayout mRelativeLayout;//佈局
    private ImageView mIconIV;//最左側圖標
    private int icon;//圖標對應資源id
    private int iconVisibility;//圖標可見性
    private String titleText;//標題文字
    private TextView mTitleTextTV;//標題文字對應的TextView
    private int titleTextVisibility;//標題可見性
    private String infoText;//信息文字
    private TextView mInfoTextTV;//信息文字對應的TextView
    private int infoTextVisibility;//信息可見性
    private ImageView mForwardIV;//最左側圖標
    private int forward;//最左側圖標對應資源id
    private int forwardVisibility;//最左側圖標可見性
    private int backgroundColor;//背景顏色

    /*
    構造函數,參數一:上下文;參數二:屬性集
     */
    public SettingItemBar(Context context, AttributeSet attrs){
        super(context,attrs);
        //加載自定義佈局
        LayoutInflater.from(context).inflate(R.layout.setting_item_bar,this);
        //實例化組件
        mIconIV = (ImageView) findViewById(R.id.icon);
        mForwardIV = (ImageView) findViewById(R.id.forward);
        mTitleTextTV = (TextView)findViewById(R.id.title_text);
        mInfoTextTV = (TextView)findViewById(R.id.text);
        mRelativeLayout = (RelativeLayout)findViewById(R.id.relative_layout);

        /*
            每一個屬性集合編譯之後都會對應一個styleable對象,
            通過styleable對象獲取TypedArray typedArray,然後通過鍵值對獲取屬性值。
            R.styleable.SettingsItemLayout,SettingsItemLayout對應attrs裏面屬性集的名稱而不是本類的類名
         */
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SettingItemBar);
        if (typedArray != null) {
            titleText = typedArray.getString(R.styleable.SettingItemBar_title_text);
            titleTextVisibility = typedArray.getInt(R.styleable.SettingItemBar_title_text_visibility,0);
            infoText = typedArray.getString(R.styleable.SettingItemBar_info_text);
            infoTextVisibility = typedArray.getInt(R.styleable.SettingItemBar_info_text_visibility,0);
            icon = typedArray.getResourceId(R.styleable.SettingItemBar_icon_iv,R.drawable.setting);
            iconVisibility = typedArray.getInt(R.styleable.SettingItemBar_icon_iv_visibility,0);
            forward = typedArray.getResourceId(R.styleable.SettingItemBar_forward_iv,R.drawable.forward);
            forwardVisibility = typedArray.getInt(R.styleable.SettingItemBar_forward_iv_visibility,0);
            backgroundColor = typedArray.getColor(R.styleable.SettingItemBar_background_color,getResources().getColor(R.color.nav_bar_background));
            typedArray.recycle();
        }
        //將自定義的屬性值設置到組件上
        mTitleTextTV.setText(titleText);
        mTitleTextTV.setVisibility(titleTextVisibility);
        mInfoTextTV.setText(infoText);
        mInfoTextTV.setVisibility(infoTextVisibility);
        mIconIV.setImageResource(icon);
        mIconIV.setVisibility(iconVisibility);
        mForwardIV.setImageResource(forward);
        mForwardIV.setVisibility(forwardVisibility);
        mRelativeLayout.setBackgroundColor(backgroundColor);
        //點擊事件
        mIconIV.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                iconOICL.OnClick();
            }
        });
        mTitleTextTV.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                titleOICL.OnClick();
            }
        });
        mInfoTextTV.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                infoOICL.OnClick();
            }
        });
        mForwardIV.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                forwardOICL.OnClick();
            }
        });
    }
    
    //設置標題內容及顏色,參數爲字符串或者資源id或者顏色
    public void setTitleText(String titleText){
        mTitleTextTV.setText(titleText);
    }

    public void setTitleText(int titleText){
        mTitleTextTV.setText(titleText);
    }

    public void setTitleTextColor(int color){
        mTitleTextTV.setTextColor(color);
    }

    //設置標題文本樣式 0 normal 1 bold 2 italic
    public void setTitleStyle(int style){
        switch (style){
            case 0:
                mTitleTextTV.setTypeface(Typeface.DEFAULT,Typeface.NORMAL);
                break;
            case 1:
                mTitleTextTV.setTypeface(Typeface.DEFAULT,Typeface.BOLD);
                break;
            case 2:
                mTitleTextTV.setTypeface(Typeface.DEFAULT,Typeface.ITALIC);
                break;
            default:
                break;
        }
    }

    //設置信息內容及顏色,參數爲字符串或者資源id或者顏色
    public void setInfoText(String infoText){
        mInfoTextTV.setText(infoText);
    }

    public void setInfoText(int infoText){
        mInfoTextTV.setText(infoText);
    }

    public void setInfoTextColor(int color){
        mInfoTextTV.setTextColor(color);
    }

    //設置信息文本樣式 0 normal 1 bold 2 italic
    public void setInfoStyle(int style){
        switch (style){
            case 0:
                mInfoTextTV.setTypeface(Typeface.DEFAULT,Typeface.NORMAL);
                break;
            case 1:
                mInfoTextTV.setTypeface(Typeface.DEFAULT,Typeface.BOLD);
                break;
            case 2:
                mInfoTextTV.setTypeface(Typeface.DEFAULT,Typeface.ITALIC);
                break;
            default:
                break;
        }
    }

    //設置兩側圖標及佈局背景顏色
    public void setIconIV(int id){
        mIconIV.setImageResource(id);
    }

    public void setForwardIV(int id){
        mForwardIV.setImageResource(id);
    }

    public  void setBackground(int color){
        mRelativeLayout.setBackgroundColor(color);
    }

    //設置組件的可見性 8 GONE 4 INVISIBLE 0 VISIBLE
    public void setIconIVVisibility(int flag){
        switch (flag){
            case 8:
                mIconIV.setVisibility(GONE);
                break;
            case 4:
                mIconIV.setVisibility(INVISIBLE);
                break;
            case 0:
                mIconIV.setVisibility(VISIBLE);
                break;
            default:
                break;
        }
    }

    public void setForwardIVVisibility(int flag){
        switch (flag){
            case 8:
                mForwardIV.setVisibility(GONE);
                break;
            case 4:
                mForwardIV.setVisibility(INVISIBLE);
                break;
            case 0:
                mForwardIV.setVisibility(VISIBLE);
                break;
            default:
                break;
        }
    }

    public void setTitleTextTVVisibility(int flag){
        switch (flag){
            case 8:
                mTitleTextTV.setVisibility(GONE);
                break;
            case 4:
                mTitleTextTV.setVisibility(INVISIBLE);
                break;
            case 0:
                mTitleTextTV.setVisibility(VISIBLE);
                break;
            default:
                break;
        }
    }

    public void setInfoTextTVVisibility(int flag){
        switch (flag){
            case 8:
                mInfoTextTV.setVisibility(GONE);
                break;
            case 4:
                mInfoTextTV.setVisibility(INVISIBLE);
                break;
            case 0:
                mInfoTextTV.setVisibility(VISIBLE);
                break;
            default:
                break;
        }
    }
    
    //定義點擊事件接口
    public interface OnItemClickListener{
        void OnClick();
    }

    //實例化
    private OnItemClickListener iconOICL = new OnItemClickListener() {
        @Override
        public void OnClick() {

        }
    };
    private OnItemClickListener titleOICL = new OnItemClickListener() {
        @Override
        public void OnClick() {

        }
    };
    private OnItemClickListener infoOICL = new OnItemClickListener() {
        @Override
        public void OnClick() {

        }
    };
    private OnItemClickListener forwardOICL = new OnItemClickListener() {
        @Override
        public void OnClick() {

        }
    };
    
    //設置點擊事件的回調 0 左側圖標 1 標題 2 信息 3 右側圖標
    public void setOnItemClickListener(OnItemClickListener on,int type){
        switch (type){
            case 0:
                iconOICL = on;
                break;
            case 1:
                titleOICL = on;
                break;
            case 2:
                infoOICL = on;
                break;
            case 3:
                forwardOICL = on;
                break;
            default:
                break;
        }
    }

}
(二)本地測試
  1. app 下的 build.gradle 添加本地庫依賴
dependencies {
	...
    implementation project(':settingitembarlibrary')
}
  1. activity_main.xml 中使用該自定義的佈局
<com.hzf.nicholas.settingitembarlibrary.SettingItemBar
        android:id="@+id/setting"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        hzf:forward_iv="@drawable/about"
        hzf:info_text="@string/nav_bar_info_default"
        hzf:title_text="@string/nav_bar_title_default">
</com.hzf.nicholas.settingitembarlibrary.SettingItemBar>
  1. MainActivity.java 中控制
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.hzf.nicholas.settingitembarlibrary.SettingItemBar;

public class MainActivity extends AppCompatActivity {

        //聲明自定義佈局
    SettingItemBar mSettingItemBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //綁定實例
        mSettingItemBar = findViewById(R.id.setting);
        //動態設置信息
        mSettingItemBar.setTitleText("NICHOLAS.HZF");
        mSettingItemBar.setInfoTextColor(Color.parseColor("#ff0000"));
        mSettingItemBar.setTitleStyle(2);
        mSettingItemBar.setInfoTextTVVisibility(8);
        //編寫點擊事件
        mSettingItemBar.setOnItemClickListener(new SettingItemBar.OnItemClickListener() {
            @Override
            public void OnClick() {
                Toast.makeText(MainActivity.this,"888888",Toast.LENGTH_LONG).show();
            }
        },0);
        mSettingItemBar.setOnItemClickListener(new SettingItemBar.OnItemClickListener() {
            @Override
            public void OnClick() {
                Toast.makeText(MainActivity.this,"77777",Toast.LENGTH_LONG).show();
            }
        },2);
    }
}
(三)上傳GitHub

參考郭霖大佬的 《第一行代碼》 第二版 14.2 Git 時間——將代碼託管 GitHub 上

(四)生成release版本
  1. 點擊release
    github_release1
  2. 點擊Create a new release
    github_release2
  3. 填寫Tag Version,點擊發布
    github_release3
  4. 發佈成功,保存這個頁面的網址,即帶有 /releases/tag/1.0.0 的路徑
    github_release4
(五)添加到 JitPack
  1. 打開網頁JitPack
    JitPack1
  2. 在輸入框黏貼(四)中保存的路徑,點擊 Look up,然後點擊下面的 Get it 便得到自己的依賴庫的使用方法。
    JitPack2
(六)依賴使用測試
  1. 新建 Android 工程
  2. 依據(五)中得到的方法添加依賴路徑
  3. 在 activity_main.xml 中使用自定義的佈局
<com.hzf.nicholas.settingitembarlibrary.SettingItemBar
	android:layout_width="match_parent"
    android:layout_height="wrap_content"
    hzf:title_text="輪子"
    hzf:info_text="Good">
</com.hzf.nicholas.settingitembarlibrary.SettingItemBar>
<com.hzf.nicholas.settingitembarlibrary.SettingItemBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    hzf:icon_iv="@drawable/staff"
    hzf:title_text="員工號"
    hzf:info_text="123456789">
</com.hzf.nicholas.settingitembarlibrary.SettingItemBar>
  1. 在 MainActivity.java 中控制

四、參考博客

1. Android 製作依賴庫 供其他項目依賴使用教程(一) 製作一個自定義PopupWindow彈窗,仿微信右上角添加菜單彈窗
2. Android開發:如何將工程改造成庫,並上傳到Github作爲依賴,提供引用
3. Android 將自己寫的android library開源庫上傳github供大家依賴使用
發佈了57 篇原創文章 · 獲贊 25 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章