常用来注释的三方库 (未完待续)
compile 'com.jakewharton:butterknife:7.0.1'
在setContentView(R.layout.activity_home)这句的后面加上
ButterKnife.bind(this);
就可以使用注释了
@Bind(R.id.home_tv_title_center)
TextView mTvCenter;
@Bind(R.id.home_iv_menu)
ImageView mIvMenu;
@Bind(R.id.contacts_tab_rl)
LinearLayout mContactsTabRl;
可参考:
http://www.jianshu.com/p/154891851fe2
用来监听事件发生的开源库
compile 'org.greenrobot:eventbus:3.0.0'
首先在首页注册eventbus
EventBus.getDefault().register(this);
用来切换的tabLayout
compile 'com.flyco.tablayout:FlycoTabLayout_Lib:2.0.8@aar'
常见布局带代码
<com.flyco.tablayout.CommonTabLayout
android:id="@+id/home_tab_layout"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="#f6f6f1"
app:tl_iconGravity="TOP"
app:tl_iconHeight="25dp"
app:tl_iconWidth="30dp"
app:tl_indicator_color="@color/white"
app:tl_textSelectColor="@color/colorPrimary"
app:tl_textUnselectColor="@color/gray_black"
app:tl_textsize="13sp"
/>
当然首先在布局界面加上
xmlns:app="http://schemas.android.com/apk/res-auto"
Glide 图片请求库
https://github.com/bumptech/glide
教程地址:http://ocnyang.com/tags/Glide/
常用来使用悬浮按钮的库
compile 'cc.trity.floatingactionbutton:library:1.0.0'
常见布局
<android.support.design.widget.FloatingActionButton
android:id="@+id/main_fab_enter_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginBottom="36dp"
android:layout_marginLeft="30dp"
android:layout_marginStart="30dp"
android:src="@drawable/add"
app:backgroundTint="#0288D1"
app:borderWidth="0dp"
app:elevation="6dp"
app:fabSize="normal"
app:layout_anchorGravity="bottom|right"
app:pressedTranslationZ="12dp"
app:rippleColor="#a6a6a6"/>
当然布局中顶部要加上这句
xmlns:app="http://schemas.android.com/apk/res-auto"
常用开加载圆形图片的开源库、如头像
https://github.com/hdodenhof/CircleImageView
compile 'de.hdodenhof:circleimageview:2.1.0'
常见布局
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/duanzi_civ_avatar"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/avatar"
android:layout_gravity="center"
/>
常用的多功能TextView
参考:https://github.com/chenBingX/SuperTextView/blob/master/README_zh.md
添加依赖:
compile 'com.github.chenBingX:SuperTextView:v1.4'
xml中使用:
<SuperTextView
android:layout_width="50dp"
android:layout_height="50dp"
//设置圆角。会同时作用于填充和边框(如果边框存在的话)。
//如果要设置为圆形,只需要把该值设置为宽或长的1/2即可。
app:corner="25dp"
//设置左上角圆角
app:left_top_corner="true"
//设置右上角圆角
app:right_top_corner="true"
//设置左下角圆角
app:left_bottom_corner="true"
//设置右下角圆角
app:right_bottom_corner="true"
//设置填充颜色
app:solid="@color/red"
//设置边框颜色
app:stroke_color="@color/black"
//设置边框的宽度。
app:stroke_width="2dp"
//放置一个drawable在背景层上。默认居中显示。
//并且默认大小为SuperTextView的一半。
app:state_drawable="@drawable/emoji"
//设置drawable的显示模式。可选值如下:
// left、top、right、bottom、center(默认值)、
//leftTop、rightTop、leftBottom、rightBottom、
//fill(充满整个SuperTextView,此时会使设置drawable的大小失效)
app:state_drawable_mode="center"
//设置drawable的height
app:state_drawable_height="30dp"
//设置drawable的width
app:state_drawable_width="30dp"
//设置drawble相对于基础位置左边的距离
app:state_drawable_padding_left="10dp"
//设置drawble相对于基础位置上边的距离
app:state_drawable_padding_top="10dp"
// boolean类型。是否显示drawable。
//如果你想要设置的drawable显示出来,必须设置为true。
//当不想让它显示时,再设置为false即可。
app:isShowState="true"
//是否开启文字描边功能。
//注意,启用这个模式之后通过setTextColor()设置的颜色将会被覆盖。
//你需要通过text_fill_color来设置文字的颜色。
app:text_stroke="true"
// 文字的描边颜色。默认为Color.BLACK。
app:text_stroke_color="@color/black"
// 文字描边的宽度。
app:text_stroke_width="1dp"
// 文字填充的颜色。默认为Color.BLACK。
app:text_fill_color="@color/blue"
// boolean类型。是否启用Adjuster功能。
//具体干什么,需要在Java中为SuperTextView实现一个Adjuster。
//当你启用这个功能而没有实现自己的Adjuster时,
//SuperTextView会启用默认的Adjuster。它会按照一定的规则调整文字大小。
app:autoAdjust="true"
/>
以上这些属性,均可以在Java中进行动态的设置。同时也能够获得它们的值。例如:
mSuperTextView.setCorner(10);
mSuperTextView.getCorner();
常用来解析Json数据的开源库
compile 'com.google.code.gson:gson:2.4'
例如传进一条json数据
public class GsonHelper {
public static List<DuanziBean> getDuanziBeanList(String response){
List<DuanziBean> mDuanziBeanList = new ArrayList<>();
try {
JSONObject jsonObject = new JSONObject(response);
String dataArrayStr = jsonObject.getJSONObject("data").getString("data");
Type type = new TypeToken<List<DuanziBean>>(){}.getType();
Gson gson = new Gson();
mDuanziBeanList = gson.fromJson(dataArrayStr, type);
return mDuanziBeanList;
} catch (JSONException e) {
e.printStackTrace();
}
return mDuanziBeanList;
}
public static List<MeiziBean> getMeiziBean(String response){
List<MeiziBean> meiziBeanList = new ArrayList<>();
try {
JSONObject jsonObject = new JSONObject(response);
String meiziArrayStr = jsonObject.getString("results");
Type meiziListType = new TypeToken<List<MeiziBean>>(){}.getType();
Gson gson = new Gson();
meiziBeanList = gson.fromJson(meiziArrayStr, meiziListType);
} catch (JSONException e) {
e.printStackTrace();
}
return meiziBeanList;
}
}
用来加载各种对话框的开源库
compile 'cc.duduhuo.dialog:smartisan-dialog:1.0.0'
创建普通对话框、选项对话框、警告对话框、自定义对话框,外加上单选、多选、进度条对话框
/* 普通的Dialog
* @param view
*/
public void normalDialog(View view) {
final NormalDialog dialog = SmartisanDialog.createNormalDialog(this);
dialog.setTitle("这是标题")
.setMsg("对话框信息")
.setMsgGravity(Gravity.CENTER)
//.setLeftBtnBackground()
.setLeftBtnText("取消") // 设置文本的按钮会显示,不设置文本则不显示
.setRightBtnText("确定")
.show();
// 设置点击监听(下同,不再解释)
dialog.setOnSelectListener(new NormalDialog.OnSelectListener() {
@Override
public void onLeftSelect() {
Toast.makeText(DialogActivity.this, "onLeftSelect", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
@Override
public void onRightSelect() {
Toast.makeText(DialogActivity.this, "onRightSelect", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
*
* 带两个选项的Dialog
*
* @param view
*/
public void twoOptionsDialog(View view) {
final TwoOptionsDialog dialog = SmartisanDialog.createTwoOptionsDialog(this);
dialog.setTitle("选择一个选项")
.setOp1Text("第一个选项") // 设置第一个选项的文本
.setOp2Text("第二个选项") // 设置第二个选项的文本
.show();
dialog.setOnSelectListener(new TwoOptionsDialog.OnSelectListener() {
@Override
public void onOp1() {
Toast.makeText(DialogActivity.this, "onOp1", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
@Override
public void onOp2() {
Toast.makeText(DialogActivity.this, "onOp2", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
/**
* 带三个选项的Dialog
*
* @param view
*/
public void threeOptionsDialog(View view) {
final ThreeOptionsDialog dialog = SmartisanDialog.createThreeOptionsDialog(this);
dialog.setOp1Text("选项1")
.setOp2Text("选项2")
.setOp3Text("选项3")
.show();
dialog.setOnSelectListener(new ThreeOptionsDialog.OnSelectListener() {
@Override
public void onOp1() {
Toast.makeText(DialogActivity.this, "onOp1", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
@Override
public void onOp2() {
Toast.makeText(DialogActivity.this, "onOp2", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
@Override
public void onOp3() {
Toast.makeText(DialogActivity.this, "onOp3", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
/**
* 警告Dialog
*
* @param view
*/
public void warningDialog(View view) {
final WarningDialog dialog = SmartisanDialog.createWarningDialog(this);
dialog.setTitle("确定退出登录吗")
.setConfirmText("退出登录")
.show();
dialog.setOnConfirmListener(new WarningDialog.OnConfirmListener() {
@Override
public void onConfirm() {
Toast.makeText(DialogActivity.this, "onConfirm", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
/**
* 选项列表Dialog
*
* @param view
*/
public void optionListDialog(View view) {
List<String> options = new ArrayList<>(6);
options.add("选项1");
options.add("选项2");
options.add("选项3");
options.add("选项4");
options.add("选项5");
options.add("选项6");
final OptionListDialog dialog = SmartisanDialog.createOptionListDialog(this);
dialog.setTitle("请选择一个选项")
.setOptionList(options)
.setLastOption("选项5") // 上次选择的选项
.setItemGravity(Gravity.CENTER) // Item是居左、居中还是居右
.setLastColor(0xFF40B64A) // 上次选择的选项显示的颜色,用于区分
.show();
// setOnOptionItemSelectListener()方法必须在show()方法之后调用,否则无效
dialog.setOnOptionItemSelectListener(new OnOptionItemSelectListener() {
@Override
public void onSelect(int position, CharSequence option) {
Toast.makeText(DialogActivity.this, "position = " + position + ", option = " + option, Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
/**
* 自定义内容视图的Dialog
*
* @param view
*/
public void customizedDialog1(View view) {
final CustomizedDialog dialog = SmartisanDialog.createCustomizedDialog(this);
View rootView = getLayoutInflater().inflate(R.layout.test_view, null);
dialog.addView(rootView)
.setTitle("自定义内容视图")
.show();
}
/**
* 自定义内容视图的Dialog
*
* @param view
*/
public void customizedDialog2(View view) {
final CustomizedDialog dialog = SmartisanDialog.createCustomizedDialog(this);
View rootView = getLayoutInflater().inflate(R.layout.test_view, null);
dialog.addView(rootView)
.setTitle("自定义内容视图")
.setLeftBtnText("按钮1") // 设置文本的按钮会显示,不设置文本则不显示
.setRightBtnText("按钮2")
.show();
dialog.setOnSelectListener(new CustomizedDialog.OnSelectListener() {
@Override
public void onLeftSelect() {
Toast.makeText(DialogActivity.this, "onLeftSelect", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
@Override
public void onRightSelect() {
Toast.makeText(DialogActivity.this, "onRightSelect", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
private static final String TAG = "DialogActivity";
/**
* 单选对话框
* @param view
*/
public void customizedSingleDialog(View view){
//通过builder构造器gouzao
AlertDialog.Builder builder =new AlertDialog.Builder(this);
builder.setTitle("选择你喜欢的水果");
final String items[]={"香蕉","西瓜","黄瓜","哈密瓜","苹果"};
//-1代表默认没有条目被选中
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//把选择到的条目取出来
Log.i(TAG, "---onClick--: "+select);
String item = items[select];
Log.i(TAG, "---item--: "+item);
Toast.makeText(getApplicationContext(), "---" + item, Toast.LENGTH_LONG).show();
//关闭对话框
dialog.dismiss();
}
});
builder.setSingleChoiceItems(items, 1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//把选择到的条目取出来
select = which;
String item=items[which];
Toast.makeText(getApplicationContext(), item+"---", Toast.LENGTH_SHORT).show();
//关闭对话框
//dialog.dismiss();
}
});
//显示对话框
builder.show();
}
/**
* 多选按钮对话框
* @param view
*/
public void customizedMutilDialog(View view){
//通过构造器构造
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("请选择你喜欢的课程");
final String items[]={"android","C","C++","C#","IOs","java","html"};
//用来判断条目是否被选中
final boolean []checkedItems={true,false,true,false,false,false,false};
builder.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
//条目的点击事件
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
StringBuffer sb=new StringBuffer();
for(int i=0;i<checkedItems.length;i++){
//判断一下选中的
if(checkedItems[i]){
String fruit=items[i];
sb.append(fruit+" ");
}
}
Toast.makeText(getApplicationContext(), sb, Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
builder.show();
}
/**
* 进度条对话框
* @param view
*/
public void customizedProgressDialog(View view){
//通过构造器来构造
final ProgressDialog dialog=new ProgressDialog(this);
dialog.setTitle("正在玩命加载中。。。");
//设置一下进度条的样式
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//最后一步一定要show()出来
dialog.show();
//创建一个子线程
new Thread(){
public void run(){
//设置进度条的最大值
dialog.setMax(100);
//设置当前进度
for(int i=0;i<=20;i++){
dialog.setProgress(i*5);
//睡眠一下
SystemClock.sleep(200);
}
dialog.show();
dialog.dismiss();
}}.start();
}
}
用来实现页面滑动返回
compile 'cn.bingoogolapple:bga-swipebacklayout:1.0.8'
先封装一个BaseActivity
/**
* Activity基类,所有Activity应该继承此类
*
* Author: nanchen
* Email: liushilin520@foxmail.com
* Date: 2017-04-07 14:33
*/
public abstract class BaseActivity extends AppCompatActivity implements BGASwipeBackHelper.Delegate{
private CompositeSubscription mCompositeSubscription;
protected BGASwipeBackHelper mSwipeBackHelper;
/**
* 获取布局ID
*
* @return 布局id
*/
protected abstract int getContentViewLayoutID();
/**
* 界面初始化前期准备
*/
protected void beforeInit() {
}
/**
* 初始化布局以及View控件
*/
protected abstract void initView(Bundle savedInstanceState);
@Override
public void setContentView(@LayoutRes int layoutResID) {
super.setContentView(layoutResID);
ButterKnife.bind(this);
}
public CompositeSubscription getCompositeSubscription(){
checkSubscription();
return this.mCompositeSubscription;
}
/**
* 检查是否为空,以免导致空指针
*/
private void checkSubscription(){
if (this.mCompositeSubscription == null){
this.mCompositeSubscription = new CompositeSubscription();
}
}
/**
* 增加一个调度器
*/
protected void addSubscription(Subscription s){
checkSubscription();
this.mCompositeSubscription.add(s);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
// 「必须在 Application 的 onCreate 方法中执行 BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回」
// 在 super.onCreate(savedInstanceState) 之前调用该方法
initSwipeBackFinish();
// setStatusBarTransparent();
super.onCreate(savedInstanceState);
beforeInit();
if (getContentViewLayoutID() != 0) {
setContentView(getContentViewLayoutID());
initView(savedInstanceState);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (this.mCompositeSubscription != null && !this.mCompositeSubscription.isUnsubscribed()){
this.mCompositeSubscription.unsubscribe();
}
}
/**
* 初始化滑动返回。在 super.onCreate(savedInstanceState) 之前调用该方法
*/
private void initSwipeBackFinish() {
mSwipeBackHelper = new BGASwipeBackHelper(this, this);
// 「必须在 Application 的 onCreate 方法中执行 BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回」
// 下面几项可以不配置,这里只是为了讲述接口用法。
// 设置滑动返回是否可用。默认值为 true
mSwipeBackHelper.setSwipeBackEnable(true);
// 设置是否仅仅跟踪左侧边缘的滑动返回。默认值为 true
mSwipeBackHelper.setIsOnlyTrackingLeftEdge(true);
// 设置是否是微信滑动返回样式。默认值为 true
mSwipeBackHelper.setIsWeChatStyle(true);
// 设置阴影资源 id。默认值为 R.drawable.bga_sbl_shadow
mSwipeBackHelper.setShadowResId(R.drawable.bga_sbl_shadow);
// 设置是否显示滑动返回的阴影效果。默认值为 true
mSwipeBackHelper.setIsNeedShowShadow(true);
// 设置阴影区域的透明度是否根据滑动的距离渐变。默认值为 true
mSwipeBackHelper.setIsShadowAlphaGradient(true);
// 设置触发释放后自动滑动返回的阈值,默认值为 0.3f
mSwipeBackHelper.setSwipeBackThreshold(0.3f);
}
/**
* 是否支持滑动返回。这里在父类中默认返回 true 来支持滑动返回,如果某个界面不想支持滑动返回则重写该方法返回 false 即可
*
* @return
*/
@Override
public boolean isSupportSwipeBack() {
return true;
}
/**
* 正在滑动返回
*
* @param slideOffset 从 0 到 1
*/
@Override
public void onSwipeBackLayoutSlide(float slideOffset) {
}
/**
* 没达到滑动返回的阈值,取消滑动返回动作,回到默认状态
*/
@Override
public void onSwipeBackLayoutCancel() {
}
/**
* 滑动返回执行完毕,销毁当前 Activity
*/
@Override
public void onSwipeBackLayoutExecuted() {
mSwipeBackHelper.swipeBackward();
}
@Override
public void onBackPressed() {
// 正在滑动返回的时候取消返回按钮事件
if (mSwipeBackHelper.isSliding()) {
return;
}
mSwipeBackHelper.backward();
}
public void setStatusBarTransparent() {
StatusBarUtil.setTransparent(this);
}
/**
* 设置状态栏颜色
*
* @param color
*/
protected void setStatusBarColor(@ColorInt int color) {
setStatusBarColor(color, StatusBarUtil.DEFAULT_STATUS_BAR_ALPHA);
}
/**
* 设置状态栏颜色
*
* @param color
* @param statusBarAlpha 透明度
*/
public void setStatusBarColor(@ColorInt int color, @IntRange(from = 0, to = 255) int statusBarAlpha) {
StatusBarUtil.setColorForSwipeBack(this, color, statusBarAlpha);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
}
用来打印logger的开源库
compile 'com.orhanobut:logger:2.1.1'
初始化:
Logger.addLogAdapter(new AndroidLogAdapter());
参考:https://github.com/orhanobut/logger
leakcanary 内存泄漏检测工具
https://github.com/square/leakcanary
BaseRecyclerViewAdapterHelper 的强大应用
compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.27'
网友评论