整合一些安卓开发中一些小白问题,以及常用的插件
隐藏标题栏
继承AppCompatActivity类
有两种方式
1.在 setContentView();之前设置 getSupportActionBar().hide();
2.在文件AndroidManifest.xml 设置android:theme="@style/Theme.AppCompat.Light.NoActionBar"
个人更偏向于第二种方式。因为第一种方式可能在启动其他Activity 收到返回值的时候 恢复标题栏
设置状态栏颜色
有时候有需求,就是状态栏要改变颜色,实现沉浸式的体验效果。
在setContentView();之后设置如下代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
//设置修改状态栏
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//设置状态栏的颜色,和你的app主题或者标题栏颜色设置一致就ok了
window.setStatusBarColor(getResources().getColor(R.color.bgblue));
}
发送验证码 倒计时
这个简单,实际上就是写个线程。去循环 去睡眠。然后 隔1S通知主线程一次,主线程收到通知后更改倒计时
new Thread() {
@Override
public void run() {
for (int i = 90; i >= 0; i--) {
Message msg = new Message();
msg.what = 0x0001;
msg.arg1 = i;
handler.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==0x0001){
if (msg.arg1 > 0) {
sendsms.setText("已发送:" + msg.arg1);
} else {
sendsms.setText("获取验证码");
}
}
}
};
一个帮助类 原生json 转对象 帮助类
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* Created by JZD on 2018/6/24.
*/
public class JsonUtil {
public static Map<String, Object> JsonObjectToMap(JSONObject jsonResult) throws JSONException {
Map<String, Object> result = new HashMap<String, Object>();
if(jsonResult!=null) {
Iterator<String> keyIt = jsonResult.keys();
while (keyIt.hasNext()) {
String key = keyIt.next();
Object val = jsonResult.get(key);
if(val!=null){
if (val instanceof JSONObject) {
Map<String, Object> valMap = JsonObjectToMap((JSONObject) val);
result.put(key, valMap);
}else if (val instanceof JSONArray) {
JSONArray ja = (JSONArray) val;
result.put(key, JsonArrayToList(ja));
}else {
result.put(key, val);
}
}else {
result.put(key, null);
}
}
}
return result;
}
public static List<Object> JsonArrayToList(JSONArray jsonArray) throws JSONException {
List<Object> list = new ArrayList<Object>();
if(jsonArray!=null){
for (int i = 0; i < jsonArray.length(); i++) {
Object val = jsonArray.get(i);
if(val!=null){
if (val instanceof JSONObject) {
Map<String, Object> map = JsonObjectToMap((JSONObject) val);
list.add(map);
}else if(val instanceof JSONArray){
list.add(JsonArrayToList((JSONArray) val));
}else {
list.add(val);
}
}
}
}
return list;
}
public static int getType(Class<?> type)
{
if(type!=null&&(String.class.isAssignableFrom(type)||Character.class.isAssignableFrom(type)||Character.TYPE.isAssignableFrom(type)||char.class.isAssignableFrom(type)))
return 0;
if(type!=null&&(Byte.TYPE.isAssignableFrom(type)||Short.TYPE.isAssignableFrom(type)||Integer.TYPE.isAssignableFrom(type)||Integer.class.isAssignableFrom(type)||Number.class.isAssignableFrom(type)||int.class.isAssignableFrom(type)||byte.class.isAssignableFrom(type)||short.class.isAssignableFrom(type)))
return 1;
if(type!=null&&(Long.TYPE.isAssignableFrom(type)||long.class.isAssignableFrom(type)))
return 2;
if(type!=null&&(Float.TYPE.isAssignableFrom(type)||float.class.isAssignableFrom(type)))
return 3;
if(type!=null&&(Double.TYPE.isAssignableFrom(type)||double.class.isAssignableFrom(type)))
return 4;
if(type!=null&&(Boolean.TYPE.isAssignableFrom(type)||Boolean.class.isAssignableFrom(type)||boolean.class.isAssignableFrom(type)))
return 5;
if(type!=null&&type.isArray())
return 6;
if(type!=null&&Connection.class.isAssignableFrom(type))
return 7;
if(type!=null&&JSONArray.class.isAssignableFrom(type))
return 8;
if(type!=null&&List.class.isAssignableFrom(type))
return 9;
if(type!=null&&Map.class.isAssignableFrom(type))
return 10;
return 11;
}
public static Object JsonObjectToObject(JSONObject obj,Field field) throws JSONException{
switch (getType(field.getType()))//field.getType:获取属性声明时类型对象(返回class对象)
{
case 0:
return obj.opt(field.getName());
case 1:
return obj.optInt(field.getName());
case 2:
return obj.optLong(field.getName());
case 3:
case 4:
return obj.optDouble(field.getName());
case 5:
return obj.optBoolean(field.getName());
case 6:
case 7:
case 8://JsonArray型
return obj.optJSONArray(field.getName());
case 9:
return JsonArrayToList(obj.optJSONArray(field.getName()));
case 10:
return JsonObjectToMap(obj.optJSONObject(field.getName()));
default:
return null;
}
}
public static Object MapToObject(Object obj, Map<?, ?> map) throws IllegalAccessException{
Field[] fields= obj.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
field.set(obj,map.get(field.getName()));
}
return obj;
}
public static String toJson(Object obj)throws IllegalAccessException,JSONException
{
JSONObject json=new JSONObject();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
switch(getType(field.getType()))
{
case 0:
json.put(field.getName(),(field.get(obj)==null?"":field.get(obj)));
break;
case 1:
json.put(field.getName(),(int)(field.get(obj)==null?0:field.get(obj)));
break;
case 2:
json.put(field.getName(),(long)(field.get(obj)==null?0:field.get(obj)));
break;
case 3:
json.put(field.getName(),(float)(field.get(obj)==null?0:field.get(obj)));
break;
case 4:
json.put(field.getName(),(double)(field.get(obj)==null?0:field.get(obj)));
break;
case 5:
json.put(field.getName(),(boolean)(field.get(obj)==null?false:field.get(obj)));
break;
case 6:
case 7:
case 8://JsonArray型
json.put(field.getName(),(field.get(obj)==null?null:field.get(obj)));
break;
case 9:
json.put(field.getName(), new JSONArray((List<?>)field.get(obj)));
break;
case 10:
json.put(field.getName(),new JSONObject((HashMap<?, ?>)field.get(obj)));
break;
}
}
return json.toString();
}
public static <T> T fromJson(String JsonStr,Class<T> type)throws JSONException,NullPointerException,IllegalAccessException, InstantiationException{
if(JsonStr ==null||JsonStr.equals("")) {
throw new NullPointerException("JsonString can't be null");
}
T data = type.newInstance();;
Field[] fields= type.getDeclaredFields();
JSONObject jsonObject=(JSONObject)new JSONTokener(JsonStr).nextValue();
for (Field field : fields) {
field.setAccessible(true);
field.set(data,JsonObjectToObject(jsonObject, field));
}
return data;
}
}
**弧形图片 如图 **
这样的 一个图片内凹了一部分 实现方式来自一位大神博客
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import com.example.jzd.surname.R;
/**
* Created by YaoShiHang on 2018/7/11.
*/
public class ArcView extends View {
private int mWidth;
private int mHeight;
/**
* 弧形高度
*/
private int mArcHeight;
/**
* 背景颜色
*/
private int mBgColor;
private Paint mPaint;
private Context mContext;
public ArcView(Context context) {
this(context, null);
}
public ArcView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public ArcView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ArcView);
mArcHeight = typedArray.getDimensionPixelSize(R.styleable.ArcView_arcHeight, 0);
mBgColor=typedArray.getColor(R.styleable.ArcView_bgColor, Color.parseColor("#303F9F"));
mContext = context;
mPaint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mBgColor);
Rect rect = new Rect(0, 0, mWidth, mHeight - mArcHeight);
canvas.drawRect(rect, mPaint);
Path path = new Path();
path.moveTo(0, mHeight - mArcHeight);
path.quadTo(mWidth / 2, mHeight, mWidth, mHeight - mArcHeight);
canvas.drawPath(path, mPaint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (widthMode == MeasureSpec.EXACTLY) {
mWidth = widthSize;
}
if (heightMode == MeasureSpec.EXACTLY) {
mHeight = heightSize;
}
setMeasuredDimension(mWidth, mHeight);
}
}
给按钮设置圆角
实际上是给了一个资源文件作为背景。资源文件里定义了弧形 弧度
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#d24b3c" /><!-- 填充的颜色 -->
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners android:topLeftRadius="10dp"
android:topRightRadius="10dp"
android:bottomRightRadius="10dp"
android:bottomLeftRadius="10dp"/>
<!-- 边框粗细及颜色 -->
<stroke android:width="2dp" android:color="#d24b3c" />
</shape>
直接拨打电话
Uri uri = Uri.parse("tel:"+phone);
Intent it = new Intent(Intent.ACTION_DIAL, uri);
startActivity(it);
两个加载 网络图片的插件
操作 ImageView 加载网络图片
导入依赖
compile 'com.squareup.picasso:picasso:2.5.2'
使用方法
ImageView banner = findViewById(R.id.banner);
Picasso.with(getActivity())
.load(AppConst.IMGURL)
.into(banner);
使用Facebook的 fresco 插件加载网络图片
导入依赖 这个东西好玩 能设置圆角图片 我们实际开发中好多用户头像要圆角的
compile 'com.facebook.fresco:fresco:0.14.1'
布局文件使用
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/header"
android:layout_width="64dp"
android:layout_height="64dp"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@mipmap/default_head"
fresco:placeholderImageScaleType="fitCenter"
fresco:roundAsCircle="true"
fresco:roundedCornerRadius="20dp"
android:layout_marginTop="44dp"
android:layout_marginLeft="25dp"
/>
代码中 加载图片
//要进行初始化 在activity的 onCreate方法中设置
Fresco.initialize(getActivity());
//*****************************************
header = (SimpleDraweeView)view.findViewById(R.id.header);
Uri uri = Uri.parse(AppConst.IMGURL+data.optString("head"));
header.setImageURI(uri);
好多时候要用到轮播图
效果图
首先导入依赖
compile 'com.bigkoo:convenientbanner:2.0.5'
compile 'com.github.bumptech.glide:glide:3.7.0'
首先看下布局文件
<com.bigkoo.convenientbanner.ConvenientBanner
android:id="@+id/my_banner"
android:layout_width="match_parent"
android:layout_height="85dp"/>
代码中加载轮播图 这里用到了2个资源文件 为选中和未选中的样式。 可以随便找合适的图片替代
private ConvenientBanner mCb;
mCb = (ConvenientBanner) view.findViewById(R.id.my_banner);
// 加载轮播图
mCb.setPages(new CBViewHolderCreator<NetworkImageHolderView>() {
@Override
public NetworkImageHolderView createHolder() {
return new NetworkImageHolderView();
}
}, mImageList)
.setPageIndicator(new int[]{R.drawable.ponit_normal, R.drawable.point_select}) //设置两个点作为指示器
.setPageIndicatorAlign(ConvenientBanner.PageIndicatorAlign.CENTER_HORIZONTAL); //设置指示器的方向水平居中
带提示的输入框,一般用于搜索候选提示
先看布局文件
<AutoCompleteTextView
android:id="@+id/searchedit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:background="@color/log_edit"
android:hint="Search products / OEM"
android:padding="2dp"
android:singleLine="true"
android:textColor="#999999"
android:textSize="14sp" />
完事看代码
一般候选提示是从服务端获取的 getData()方法 就是从服务端获取数据用的 数据存储到list 里
private AutoCompleteTextView aTextView;
private ArrayList<String> list;
private ArrayAdapter<String> adapter;
aTextView = (AutoCompleteTextView) findViewById(R.id.searchedit);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, getData());
aTextView.setAdapter(adapter);