隨筆記:記一次安卓開發中常用到的外掛以及踩過的坑

農夫YH發表於2018-07-25

整合一些安卓開發中一些小白問題,以及常用的外掛

隱藏標題欄

繼承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);

相關文章