製作自己的 GitHub 依賴庫——俗稱“造輪子”
一、步驟
- 在 Android Library 中製作簡易的自定義佈局
- 本地測試
- 上傳 GitHub
- 生成 release 版本
- 添加到 JitPack
- 依賴使用測試
二、效果圖
三、開發
(一)在Android Library中製作簡易的自定義佈局
- 在 Android 工程中新建 Module
- 新建 Android Library
- 文件位置概覽
- 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>
- 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>
- 編寫控制自定義佈局的 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;
}
}
}
(二)本地測試
- 在 app 下的 build.gradle 添加本地庫依賴
dependencies {
...
implementation project(':settingitembarlibrary')
}
- 在 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>
- 在 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版本
- 點擊release
- 點擊Create a new release
- 填寫Tag Version,點擊發布
- 發佈成功,保存這個頁面的網址,即帶有 /releases/tag/1.0.0 的路徑
(五)添加到 JitPack
- 打開網頁JitPack
- 在輸入框黏貼(四)中保存的路徑,點擊 Look up,然後點擊下面的 Get it 便得到自己的依賴庫的使用方法。
(六)依賴使用測試
- 新建 Android 工程
- 依據(五)中得到的方法添加依賴路徑
- 在 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>
- 在 MainActivity.java 中控制