隨筆記:記一次安卓開發中常用到的外掛以及踩過的坑
整合一些安卓開發中一些小白問題,以及常用的外掛
隱藏標題欄
繼承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);
相關文章
- 記錄從0開發一個vue的富文字外掛過程以及遇到的坑Vue
- MUI的踩坑筆記UI筆記
- mpvue開發微信小程式踩坑筆記Vue微信小程式筆記
- DelayedWorkQueue踩坑筆記筆記
- 前端專案框架搭建隨筆---Webpack踩坑記前端框架Web
- 筆記:Mysql踩坑之路筆記MySql
- Realm ios踩坑筆記iOS筆記
- Go踩坑筆記(十九)Go筆記
- 記一次ionic使用file外掛cordova plugin file的坑Plugin
- uniapp開發踩坑記錄APP
- 記一次docker上部署nuxt踩的坑DockerUX
- 外掛化開發筆記(一)代理模式筆記模式
- Hilo開發H5小遊戲踩坑筆記H5遊戲筆記
- vue + typescript 踩坑筆記(一)VueTypeScript筆記
- vue + typescript 踩坑筆記(二)VueTypeScript筆記
- Vue踩坑筆記(更新ing)Vue筆記
- 記一次營銷活動踩坑
- 記一次spring cloud踩坑SpringCloud
- 記一次 jQuery 踩坑經歷jQuery
- Nginx的踩坑日記Nginx
- next.js 踩坑筆記JS筆記
- 筆記:Node.js Postgresql踩坑筆記Node.jsSQL
- Node系列-爬蟲踩坑筆記爬蟲筆記
- 記錄自己在tensorflow中踩過的坑
- 安卓開發筆記——數獨遊戲安卓筆記遊戲
- JavaScript 新手的踩坑日記JavaScript
- removeChild踩坑記REM
- mpVue 踩坑記Vue
- vue 踩坑記Vue
- vuepress踩坑記Vue
- IE 踩坑記
- 敏捷開發讀書筆記——隨筆敏捷筆記
- 隨手記Android沉浸式狀態列的踩坑之路Android
- Flutter 開發踩坑記錄(乾貨總結)Flutter
- 卡片開發使用偽類之踩坑記錄
- 記一次 MySQL 主從複製延遲的踩坑MySql
- Flutter Web 外掛開發小記FlutterWeb
- 記一次centos掛載ceph儲存的坑CentOS