編輯:關於Android編程
Xutils由於內部使用httpclient然而在安卓5.0谷歌發現httpclient出現不穩定的情況.於6.0完全棄用,所以作者升級到Xutils3替換原本網絡模塊
配置環境(Studio):
在build.gradle添加依賴
dependencies {
compile 'org.xutils:xutils:3.3.36'
}
以下就Xutils3的四個模塊分別給出案例:
View模塊:
在activity使用案例簡化開發者 寫findViewId和設置布局等冗余代碼等
package qianfeng.com.day36_xutils;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
/*
xUtils3 的View 框架
目的: 減少代碼量
使用方式:
1.在onCreate方法中 初始化 View模塊
x.view().inject();
2.不需要添加findViewById方法
在引用上面添加 @ViewInject(ViewId) 即可使用
3.可以省略 setContentView方法
需要在 Activity 上 添加
@ContentView(LayoutId)
4.點擊事件注解
創建方法 必須是 私有
private void onClick(View view){}
在該方法上面添加
@Event(ViewId)
@Event({ViewId數組})
@Even( value = ViewId)
@Even(value = {ViewID數組})
不需要在 xml文件中添加 onClick 屬性
5.注意!
在使用過程中 必須先執行 x.view().inject 方法
在使用過程中 不允許出現重復Id 養成習慣
*/
@ContentView(R.layout.activity_view)
public class ViewActivity extends AppCompatActivity {
@ViewInject(R.id.view_tv)
private TextView tv;
@ViewInject(R.id.view_bt)
private Button view_bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// View View = LayoutInflater.from(this).inflate(R.layout.activity_view, null);
// setContentView(View);
x.view().inject(this);
tv.setText("今天天氣 好晴朗~");
}
// 點擊事件
@Event(value = {R.id.view_bt, R.id.view_tv})
private void onClick(View view) {
switch (view.getId()) {
case R.id.view_bt:
Toast.makeText(ViewActivity.this, "大家注意防霧霾", Toast.LENGTH_SHORT).show();
break;
case R.id.view_tv:
Toast.makeText(ViewActivity.this, "騙誰呢,霧霾天", Toast.LENGTH_SHORT).show();
break;
}
}
}
對應布局文件
Fragment 使用案例 先寫個基礎BaseFragment讓子類繼承
package qianfeng.com.day36_xutils.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.xutils.x;
/**
*Fragment 中 使用注解
* 1.在onCreateView 方法中
* return x.view().inject(this,inflater,container)
* 2.定義標記
* isInject 記錄是否有 被初始化過
* 3.在 onCreateView 方法 中將 變量標記為 true
* 4.在 onViewCreated 方法中 判斷 是否被 初始化過
* 如果沒有
* 則
* x.view().inject(this,getView())即可
* 5.封裝BaseFragment 繼承後 可 省略 onCreateView 方法的重寫
* 6.需要在 類的上方添加 @ContentView(FragmentLayoutId)
*/
public class BaseFragment extends Fragment {
private boolean isInject = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
isInject = true;
// View view = inflater.inflate(R.layout.fragment_base, container, false);
return x.view().inject(this,inflater,container);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (!isInject){
x.view().inject(this,getView());
}
}
}
子類fragment:
package qianfeng.com.day36_xutils.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import qianfeng.com.day36_xutils.R;
@ContentView(R.layout.fragment_view)
public class ViewFragment extends BaseFragment {
@ViewInject(R.id.fragemnt_tv)
TextView fragment_tv;
@Event(R.id.fragemnt_tv)
private void onClick(View view) {
Toast.makeText(getActivity(), "彈彈彈", Toast.LENGTH_SHORT).show();
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
fragment_tv.setText("實例化數據");
}
}
子類對應布局
<framelayout android:layout_height="match_parent" android:layout_width="match_parent" tools:context="qianfeng.com.day36_xutils.fragment.ViewFragment" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
</framelayout>
在適配器中使用
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_layout, parent, false);
holder = new ViewHolder();
// 初始化View
x.view().inject(holder, convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.item_name_tv.setText(list.get(position).getName());
holder.item_age_tv.setText(list.get(position).getAge());
holder.item_sex_tv.setText(list.get(position).getSex());
return convertView;
}
static class ViewHolder {
@ViewInject(R.id.item_name_tv)
TextView item_name_tv;
@ViewInject(R.id.item_age_tv)
TextView item_age_tv;
@ViewInject(R.id.item_sex_tv)
TextView item_sex_tv;
}
注意初始化:初始化一般application中如下
package com.example.app;
import android.app.Application;
import org.xutils.x;
/**
* Created by Administrator on 2016/10/17.
*/
public class Myapplication extends Application {
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(true);//打開日志信息 不屬於初始化 發布時可以刪除 影響性能
}
}
package qianfeng.com.day36_xutils;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import org.xutils.image.ImageOptions;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
import java.io.File;
@ContentView(R.layout.activity_image)
public class ImageActivity extends AppCompatActivity {
@ViewInject(R.id.show_iv)
private ImageView show_iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_image);
x.view().inject(this);
// 通過 這個 管理者加載 Assets 文件中的 資源
// AssetManager
}
@Event({R.id.file_bt, R.id.sd_bt, R.id.http_bt})
private void onClick(View view) {
switch (view.getId()) {
case R.id.file_bt:
// 圖片 處理參數配置
ImageOptions.Builder builder = new ImageOptions.Builder();
builder.setIgnoreGif(false);// 設置 不要忽略 Gif圖片 默認是 true 不支持
builder.setLoadingDrawableId(R.mipmap.ic_launcher); // 加載的時候顯示的圖片
builder.setFailureDrawableId(R.mipmap.ic_launcher);// 加載失敗的時候顯示的圖片
x.image().bind(show_iv, "assets://cat.gif", builder.build());
break;
case R.id.sd_bt:
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "qq.png";
TranslateAnimation animation = new TranslateAnimation(0, 200, 0, 200);
animation.setDuration(10000);
ImageOptions options = new ImageOptions.Builder()
.setUseMemCache(true)//使用緩存 默認為ture 如果為false每次都會從文件中讀取 動畫也會執行多次 為ture只會執行一次動畫
// .setCircular(true)//使這個圖片變成個圓
.setRadius(20)// 設置圓角角度
.setCrop(true)// 設置是否填充大小 如果圖片是100 *100 現在設置200,200 如果此選項為false那麼保持原圖大小
// .setSize(200,200)
.setAnimation(animation) // 添加加載後執行的 動畫
.setAutoRotate(true)// 自動旋轉
.setConfig(Bitmap.Config.RGB_565)// 每個像素的 格式
.build();
//必須初始化 x.Ext.init(getApplication()); 此案例已經寫在application類中
x.image().bind(show_iv, path, options);
}
break;
case R.id.http_bt:
x.image().bind(show_iv, "http://img5.duitang.com/uploads/item/201510/01/20151001014728_tmHdG.jpeg");
break;
}
}
}
數據庫模塊(ROM):
package com.example.app;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import org.xutils.DbManager;
import org.xutils.db.annotation.Column;
import org.xutils.db.annotation.Table;
import org.xutils.db.sqlite.WhereBuilder;
import org.xutils.ex.DbException;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
import java.util.ArrayList;
import java.util.List;
@ContentView(R.layout.activity_db)
public class DBActivity extends AppCompatActivity {
@ViewInject(R.id.lv)
ListView lv;
private DbManager db;
private ArrayAdapter adapter;
private List dataText;
/**
* 數據庫建表
* 1.在類名上面寫上@Table(name = "TableName")
* 2.在屬性上面添加 @Colum(name = "columName" )
* isId 是否是主鍵
* autoGen 自增長 默認 true
* 3.構造方法必須全寫有參構造以及 無參構造
*
*
*
*
* Created by ${Mr.Zhao} on 2016/10/17.
*/
//自動創建對應的表
@Table(name="Student")
static class Student{
//name = xxx 誰知對應在數據庫的字段名
// isId 是否為主鍵
//autoGen 是否自增長
//如果使用自增長 添加時想讓id自動雖數據庫變化應使用此Api db.saveBindingId(s); 不然id為bean 對象id
@Column(name = "id",isId = true,autoGen = true)
int id;
@Column(name="name")
String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public Student() {
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);
DbManager.DaoConfig config = new DbManager.DaoConfig();
config.setDbName("info.db");
config.setDbVersion(1);
//設置數據庫的位置 不設置為默認數據庫位置data/data/pagekage/database/XXX.DB
// config.setDbDir();
dataText = new ArrayList<>();
db = x.getDb(config);
for (int i = 20; i < 40; i++) {
Student s= new Student(i,"asd"+i);
try {
db.saveBindingId(s);
} catch (DbException e) {
e.printStackTrace();
}
}
adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,dataText);
lv.setAdapter(adapter);
}
@Event({R.id.cx,R.id.del, R.id.update})
private void test(View v) throws DbException {
switch (v.getId()) {
case R.id.cx:
List all = db.findAll(Student.class);
dataText.clear();
for (int i = 0; i < all.size(); i++) {
dataText.add(all.get(i).name);
}
adapter.notifyDataSetChanged();
break;
case R.id.del:
WhereBuilder builder = WhereBuilder.b("name","=","asd20");
int delete = db.delete(Student.class, builder);
Toast.makeText(this, ""+delete, Toast.LENGTH_SHORT).show();
break;
case R.id.update:
db.saveOrUpdate(new Student(13,"ヾ(ToT)Bye~Bye~一"));
break;
default:
}
}
}
package qianfeng.com.day36_xutils;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import org.xutils.common.Callback;
import org.xutils.http.HttpMethod;
import org.xutils.http.RequestParams;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
import java.io.File;
public class HttpActivity extends AppCompatActivity {
@ViewInject(R.id.http_show_iv)
private ImageView http_show_iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_http);
x.view().inject(this);
}
@Event({R.id.http_get_bt, R.id.http_post_bt, R.id.http_request_bt, R.id.http_down_bt})
private void onClick(View view) {
switch (view.getId()) {
case R.id.http_get_bt:
// 通過 get方式獲取數據
getNetData();
break;
case R.id.http_post_bt:
// post方式
postNetData();
break;
case R.id.http_request_bt:
// 請求
requestNetData();
break;
case R.id.http_down_bt:
//下載
downNetData();
break;
}
}
// 下載
private void downNetData() {
// 獲取文件下載的 地址
final String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "pic.jpg";
RequestParams params = new RequestParams("http://tupian.enterdesk.com/2013/mxy/10/14/1/7.jpg");
// 設置 文件下載後的保存路徑
params.setSaveFilePath(file_path);
// 文件下載設置的進度監聽器
x.http().get(params, new Callback.ProgressCallback() {
@Override
public void onWaiting() {
}
@Override
public void onStarted() {
}
@Override
public void onLoading(long total, long current, boolean isDownloading) {
// 文件下載的進度
int l = (int) (current * 100 / total);
Log.d("Mr.Zhao", "onLoading: " + l);
}
@Override
public void onSuccess(File result) {
// 文件下載成功後的結果
Bitmap bitmap = BitmapFactory.decodeFile(file_path);
if (bitmap != null)
http_show_iv.setImageBitmap(bitmap);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
private void requestNetData() {
// 直接請求 網絡數據 配置請求方法 HttpMehod GET POST 常量
x.http().request(HttpMethod.GET, new RequestParams("http://218.244.149.129:9010/api/industry.php"), new Callback.CommonCallback() {
@Override
public void onSuccess(String result) {
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
// 以post方式請求
private void postNetData() {
RequestParams params = new RequestParams("http://218.244.149.129:9010/api/companylist.php");
params.addBodyParameter("industryid", "100");
x.http().post(params, new Callback.CommonCallback() {
@Override
public void onSuccess(String result) {
Log.d("Mr.Zhao", "onSuccess: " + result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
// 以get方式 請求網絡數據
private void getNetData() {
String path = "http://218.244.149.129:9010/api/industry.php";
RequestParams params = new RequestParams(path);
Callback.Cancelable cancelable = x.http().get(params, new Callback.CommonCallback() {
@Override
public void onSuccess(String result) {
// 獲取成功的時候執行該方法 並返回數據
Log.d("Mr.Zhao", "onSuccess: " + result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
// 拋出異常的時候執行該方法
Log.d("Mr.Zhao", "onError: ");
}
@Override
public void onCancelled(CancelledException cex) {
// 當 調用了 取消方法的時候 執行該方法
Log.d("Mr.Zhao", "onCancelled: ");
}
@Override
public void onFinished() {
// 執行結束的時候執行該方法
// 包含成功後
Log.d("Mr.Zhao", "onFinished: ");
}
});
// 通過get方法 返回值 進行 取消訪問網絡的 操作
// cancelable.cancel();
}
}
初始化 當然也可以不用 我們在application中
package qianfeng.com.picassodemo.app;
import android.app.Application;
import android.graphics.Bitmap;
import com.squareup.picasso.LruCache;
import com.squareup.picasso.Picasso;
/**
* Created by ${Mr.Zhao} on 2016/10/17.
*/
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
initPicasso();
}
private void initPicasso() {
int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);
Picasso picasso = new Picasso.Builder(this)
.memoryCache(new LruCache(maxSize))//設置內存緩存
/*默認false
true 會在 ImageView 的 左上角 添加一個 三角形的 符號
紅色 網絡 第一次下載
綠色 內存 銷毀Activity再次進入
藍色 SD 清空了任務列表
*/
.indicatorsEnabled(true)
// .downloader() 修改下載器
.defaultBitmapConfig(Bitmap.Config.RGB_565)
.build();
// 設置當前的 Picasso對象為 單例模式
Picasso.setSingletonInstance(picasso);
}
}
package qianfeng.com.picassodemo;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import com.squareup.picasso.Picasso;
public class MainActivity extends AppCompatActivity {
private String path = "http://img5.duitang.com/uploads/item/201510/01/20151001014728_tmHdG.jpeg";
private ImageView show_iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show_iv = (ImageView) findViewById(R.id.show_iv);
Picasso.with(this).load(path)
.config(Bitmap.Config.RGB_565)
// .resize(50, 50) // 重新定義大小
// .centerCrop()//執行裁剪
.error(R.mipmap.ic_launcher)// 錯誤的時候 顯示的圖片 請求網絡 三次 失敗
.placeholder(R.mipmap.ic_launcher)// 默認圖片
.into(show_iv);
}
}
Android簡易實戰教程--第二十五話《網絡圖片查看器》
訪問網絡已經有了很成熟的框架。這一篇只是介紹一下HttpURLConnection的簡單用法,以及裡面的”注意點”。這一篇可以復習或者學習Http
android監聽返回按鈕事件的方法
本文實例講述了android監聽返回按鈕事件的方法。分享給大家供大家參考。具體如下:用戶在點擊手機的返回按鈕時,默認是推出當前的activty,但是有時用戶不小心按到返回
GreenDao應用解析
一、概論GreenDao是一種對象關系映射(ORM)型數據庫,在Android開發中使用較為廣泛,比其他關系映射數據庫性能更加良好。GreenDao的Github源碼地址
Android開發本地及網絡Mp3音樂播放器(十四)網絡音樂下載功能實現
實現功能:實現網絡音樂搜索功能實現網絡音樂下載功能下載好的音樂目前不在播放器內,可以通過文件浏覽器查看。後續將博文,將實現歌詞和下載音樂掃描功能。經過將近4天,才發布這一