一些android笔记

CardView

需要的依赖,不过貌似可以alt+enter自动导入。

compile 'com.android.support:cardview-v7:25.3.1'

记得是 xmlns:card_view="http://schemas.android.com/apk/res-auto",
而不是  xmlns:card_view="http://schemas.android.com/tools",不然没效果。

android:focusable=”true”代表可以获取焦点,
android:clickable=”true”代表可以被点击,
android:foreground=”?android:attr/selectableItemBackground”代表前景色,这里是添加点击水波纹效果,
card_view:cardPreventCornerOverlap=”true”代表将CardView里边的元素单独做圆角处理,
card_view:cardUseCompatPadding=”true”设置内边距,
card_view:contentPadding=”8dp”边界距离内部的距离,
card_view:cardElevation=”8dp”添加卡片阴影

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v7.widget.CardView
android:id="@+id/card_stories"
android:layout_width="match_parent"
android:layout_height="60dp"
android:clickable="true"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground"
card_view:cardElevation="3dp"
card_view:cardPreventCornerOverlap="true"
card_view:cardUseCompatPadding="true"
card_view:contentPadding="8dp">
<!--里面可以放各种东西
.......
.......
......
-->
</android.support.v7.widget.CardView>
</LinearLayout>

效果

Snackbar

需要的依赖

compile 'com.android.support:design:25.3.1'

简单使用,和Toast不一样Snackbar传的是view

1
2
3
4
5
6
7
8
9
10
11
Snackbar snackbar = Snackbar.make(view,"消息已发出",Snackbar.LENGTH_SHORT);
//添加点击事件
/* snackbar .setAction("添加了点击我", new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});*/
// View mView = snackbar.getView();
// snackbar.setActionTextColor(Color.BLUE); 点击字体颜色
// mView.setBackgroundColor(Color.GRAY);设置背景颜色
snackbar.show();

效果

RecyclerView

配置

注意:如果使用瀑布流布局,那么宽度应该是根据布局的列数来自动适配的,
而不是一个固定值。另外可以使用了layout_margin 属性来让子项之间互留一点间距,
这样就不至于所有子项都紧贴在一些。android:padding和android:margin的区别
一个是容器内间距,一个是容器外间距。

在需要的布局xml加上即可

1
2
3
4
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

里面加上自定义view 可以新建一个text.xml,这里用CardView套TextView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v7.widget.CardView
android:id="@+id/card_stories"
android:layout_width="match_parent"
android:layout_height="60dp"
android:clickable="true"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground"
card_view:cardElevation="3dp"
card_view:cardPreventCornerOverlap="true"
card_view:cardUseCompatPadding="true"
card_view:contentPadding="8dp">
<TextView
android:layout_gravity="center"
android:id="@+id/myText"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"/>
</android.support.v7.widget.CardView>
</LinearLayout>

使用时需要自定义一个Adapter和ViewHolder这里新建一个MyAdapter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.app.cczhr.recyclerviewdemo;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
//第二步主类继承RecyclerView.Adapter 泛型填自定义的MyViewHolder,
//添加构造方法用来传输要显示的数据,这里传输一个 List<String>
//重写onCreateViewHolder 和onBindViewHolder 以及getItemCount
//onCreateViewHolder负责把自定义view传给MyViewHolder
//onBindViewHolder则是负责从拿出控件填入数据以及设置监听器 int position从getItemCount来决定
//getItemCount负责显示多少条
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
List<String> mStringList;
public MyAdapter( List<String> mStringList){
this.mStringList=mStringList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.text,parent,false);//把xml布局文件转为View对象
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
final int k=position;
holder.mTextView.setText(mStringList.get(position));
holder.mCardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar snackbar = Snackbar.make(view,"消息已发出",Snackbar.LENGTH_SHORT);
snackbar.show();
}
});
}
@Override
public int getItemCount() {
return mStringList.size();
}
//第一步是新建一个MyViewHolde内部类继承 RecyclerView.ViewHolder 重写父类构造方法
static class MyViewHolder extends RecyclerView.ViewHolder {
TextView mTextView;
CardView mCardView;
public MyViewHolder(View itemView) {
super(itemView);
mTextView=(TextView)itemView.findViewById(R.id.myText);
mCardView=(CardView)itemView.findViewById(R.id.card_stories);
}
}
}

在需要显示的地方设置好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class MainActivity extends AppCompatActivity {
List<String> mStringList;
MyAdapter myAdapter;
@BindView(R.id.recycler_view)
RecyclerView mRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initDate();
//数字代表行/列的个数
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);//瀑布流布局
/*LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
GridLayoutManager layoutManager = new GridLayoutManager(this,6);//网格布局
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
*/
mRecyclerView.setLayoutManager(layoutManager);//设置布局
myAdapter = new MyAdapter(mStringList);//新建适配器填充数据
mRecyclerView.setAdapter(myAdapter);//设置适配器
}
private void initDate() {
for (int i = 1; i < 40; i++) {
mStringList.add("第" + new Random().nextInt(100));
}
}
}

SwipeRefreshLayout

详细教程 http://www.jianshu.com/p/d23b42b6360b
配置 通常和列表配合使用

1
2
3
4
5
6
7
8
9
10
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>

在需要使用的地方(实际使用并非如此)
setColorSchemeResources(int… colorResIds) 可以设置圈圈颜色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class MainActivity extends AppCompatActivity {
@BindView(R.id.swipe_refresh)
SwipeRefreshLayout mSwipeRefresh;
private void setSwipeRefresh() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
mSwipeRefresh.setRefreshing(false);//关闭圈圈
}
});
}
}).start();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//设置下滑监听
mSwipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
setSwipeRefresh();
}
});
}
}

效果

Butter Knife

配置

compile 'com.jakewharton:butterknife-compiler:8.7.0'
compile 'com.jakewharton:butterknife:8.7.0'

安装插件(非必须)

使用

效果

1
2
3
4
5
6
7
8
@BindView(R.id.toolbar)
Toolbar mToolbar;
@BindView(R.id.banner)
Banner mBanner;
@BindView(R.id.recycler_view)
RecyclerView mRecyclerView;
@BindView(R.id.swipe_refresh)
SwipeRefreshLayout mSwipeRefresh;

Glide

配置

compile 'com.github.bumptech.glide:glide:3.7.0'

权限(非必须)

1
2
3
<!-- if you want to load images from a file OR from the internet -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

简单使用

with(Context context). 使用Application上下文,Glide请求将不受Activity/Fragment生命周期控制。
with(Activity activity).使用Activity作为上下文,Glide的请求会受到Activity生命周期控制。
with(FragmentActivity activity).Glide的请求会受到FragmentActivity生命周期控制。
with(android.app.Fragment fragment).Glide的请求会受到Fragment 生命周期控制。
with(android.support.v4.app.Fragment fragment).Glide的请求会受到Fragment生命周期控制。

load SD卡资源:load("file://"+Environment.getExternalStorageDirectory().getPath()+"/test.jpg") 
load assets资源:load("file:///android_asset/f003.gif") 
load raw资源:load("Android.resource://com.frank.glide/raw/raw_1")或        load("android.resource://com.frank.glide/raw/"+R.raw.raw_1) 
load drawable资源:load("android.resource://com.frank.glide/drawable/news")或load("android.resource://com.frank.glide/drawable/"+R.drawable.news) 
load ContentProvider资源:load("content://media/external/images/media/139469") 
load http资源:load("http://img.my.csdn.net/uploads/201508/05/1438760757_3588.jpg") 
load https资源:load("https://img.alicdn.com/tps/TB1uyhoMpXXXXcLXVXXXXXXXXXX-476-538.jpg_240x5000q50.jpg_.webp") 
1
2
3
4
5
6
7
Glide.with(this)
.load("http:/xxx.xxx")
.asBitmap() //强制静态或者动态图
.placeholder(R.drawable.gray_radius) //设定等待图
.override(100,100)//强制指定图片大小
.error(R.drawable.ic_backup)//请求失败图
.into(mImage);//指定显示的ImageView

更多详细使用 参考以下网站
http://blog.csdn.net/shangmingchao/article/details/51125554/

轮播图控件Banner

配置

compile 'com.youth.banner:banner:1.4.9'

github https://github.com/youth5201314/banner
权限(非必须)

1
2
3
<!-- if you want to load images from a file OR from the internet -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

简单使用
在需要的布局文件加上,属性自己定义

1
2
3
4
5
<com.youth.banner.Banner
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="200dp" />

首先新建一个适配器继承ImageLoader类

1
2
3
4
5
6
public class MyGlideImageLoader extends ImageLoader {
@Override
public void displayImage(Context context, Object path, ImageView imageView) {
//使用Glide显示图片
Glide.with(context).load((String) path).into(imageView);
}

然后在需要显示的地方显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MainActivity extends AppCompatActivity {
@BindView(R.id.banner)
Banner mBanner;
private List<String >mImageId = new ArrayList<String>();
private List<String >mTitle = new ArrayList<String>();
public void addImage(){
mImageId.add("http://wx4.sinaimg.cn/wap720/90eb2137ly1fi1px332omj21f80y5qkb.jpg");
mImageId.add("http://wx3.sinaimg.cn/wap720/90eb2137ly1fhzffgnaimj20go09e75p.jpg");
mImageId.add("http://wx4.sinaimg.cn/wap720/90eb2137ly1fi0ltqso3yj20hq0c4mxw.jpg");
mTitle.add("czh标题1");
mTitle.add("czh标题2");
mTitle.add("czh标题3");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
addImage();
mBanner.setImageLoader(new MyGlideImageLoader());//设置适配器
mBanner.setBannerStyle(BannerConfig.NUM_INDICATOR_TITLE);//样式
mBanner.setBannerTitles( mTitle);//标题list
mBanner.setImages( mImageId );//图片list
mBanner.start();//执行
}
}

效果

RxJava2和Retrofit2

配置

compile 'io.reactivex.rxjava2:rxjava:2.1.2'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'  //主要用来切换ui线程
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0' //解析json
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' //与rxjava2配合

RxJava2单独使用

详细教程 http://www.jianshu.com/p/0cd258eecf60

io.reactivex.Observable.create//创建被观察者
new ObservableOnSubscribe<T>()//T指定被观察者发送的数据类型
subscribe();//绑定观察者
new Observer<T>()//创建观察者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
io.reactivex.Observable.create(new ObservableOnSubscribe<String>(){
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
//subscribeOn的线程
e.onNext("1");
e.onNext("2");
e.onComplete();
}
}).observeOn(AndroidSchedulers.mainThread()) //observerOn 指定的就是订阅者接收事件的线程(观察者),可以多次指定
.subscribeOn(Schedulers.io()) //subscribeOn() 指定的就是发射事件的线程(被观察者),不能多次指定。
.subscribe(new Observer<String>() {
private Disposable d;
@Override
public void onSubscribe(@NonNull Disposable d) {
this.d=d;
Log.e("rxjava_onSubscribe:","onSubscribe");
}
@Override
public void onNext(@NonNull String s) {
if (s.equals("3")){
d.dispose();//切断事件
}else {
Log.e("rxjava_onNext:",s);
}
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("rxjava_onSubscribe:","onSubscribe");
}
@Override
public void onComplete() {
Log.e("rxjava_onComplete:","onComplete");
}
});

Retrofit2单独使用

RxJava2配合Retrofit2加上gson简单使用

倒计时按钮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class TimerTest extends Activity {
Button send;
private TimeCount time;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.timer);
time = new TimeCount(30000, 1000);
send= ( Button)findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
time.start();
}
});
}
class TimeCount extends CountDownTimer {
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {
send.setEnabled(false);
send.setText(millisUntilFinished / 1000 +"秒");
}
@Override
public void onFinish() {
send.setText("发送验证码");
send.setEnabled(true);
}
}
}
}

滑动返回

配置

下载 SwipeBackLayout-V1.1.0.aar 包
https://pan.baidu.com/s/1gfH0Sjp
导入

gradle添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
android {
.......
.....
repositories {
flatDir {
dirs 'libs'
}
}
}
dependencies {
.......
.....
compile(name: 'SwipeBackLayout-V1.1.0', ext: 'aar')
}

使用

在需要的界面直接继承 SwipeBackActivity 即可

1
public class MyActivity extends SwipeBackActivity

注意要把Activity背景弄成透明即可

1
2
<activity android:name=".MyActivity"
android:theme="@style/otherPageStyle">

1
2
3
<style name="otherPageStyle" parent="AppTheme">
<item name="android:statusBarColor">@android:color/transparent</item>
</style>