スマートフォン推進室の前田です。
AndroidQueryという便利なライブラリーがるの知ってますか?
AndroidのViewをjqueryライクに使える+ユーティリティという非常に便利なシロモノです。
ホームページは
こちら
どんなことができるか大まかなものは、
Wikiをみてもらえばわかるかと思います。
ソースコードがスッキリとして見通しが良くなるので是非利用してみて下さい。
■導入方法
プロジェクトを作成し、libs直下に
ココからDLしたjarファイルを格納するだけ。
■実装例
今回はListViewでよくある、CustomArrayAdapterをAndroidQueryを使ってコードダイエットをしたいと思います。
・AndroidQuery未使用
class CustomArrayAdapter extends ArrayAdapter<Data> {
private final String TAG = CustomArrayAdapter.class.getSimpleName();
private final LayoutInflater inflater;
public CustomArrayAdapter(Context context, List<Data> objects) {
super(context, 0, objects);
inflater = LayoutInflater.from(getContext());
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null || convertView.getId() != position) {
convertView = inflater.inflate(R.layout.row, parent, false);
holder = new ViewHolder();
holder.nameText = (TextView) convertView.findViewById(R.id.name);
holder.descriptionText = (TextView) convertView.findViewById(R.id.description);
holder.img = (ImageView) convertView.findViewById(R.id.img);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final Data d = getItem(position);
holder.nameText.setText(d.getName());
holder.descriptionText.setText(d.getDiscription());
loadImageAsync(holder.img, d.getImgUrl());
return convertView;
}
}
private void loadImageAsync(ImageView imgView, String url) {
// 非同期で読み込み、imgViewに画像をセットする処理
}
class ViewHolder {
TextView nameText, descriptionText;
ImageView img;
}
・AndroidQuery使用
class CustomArrayAdapter extends ArrayAdapter<Data> {
private final String TAG = CustomArrayAdapter.class.getSimpleName();
private final LayoutInflater inflater;
public CustomArrayAdapter(Context context, List<Data> objects) {
super(context, 0, objects);
inflater = LayoutInflater.from(getContext());
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
AQuery aq = null;
if (convertView == null || convertView.getId() != position) {
convertView = inflater.inflate(R.layout.row, parent, false);
aq = new AQuery(convertView);
convertView.setTag(aq);
} else {
aq = (AQuery) convertView.getTag();
}
final Data d = getItem(position);
aq.id(R.id.name).text(d.getName());
aq.id(R.id.description).text(d.getDiscription());
//URLから非同期で画像を取得し、メモリとファイルキャッシュをする。
aq.id(R.id.img).image(d.getImgUrl(), true, true);
return convertView;
}
}
このように、ViewHolderをAndroidQueryのクラスに変更するだけです。
更に、便利なことに画像をURL指定で取得する場合には非同期で取得しキャッシュ(メモリ、ファイル)の指定もできます。このへんを自分で実装してもいいのですが色々と面倒な事が多いとおもいます。サイズ変更にも対応しています。画像周りの詳細は
こちらを見るとよくまとまっています。
■OAuth処理
twitter, facebook, google+のOAuthの認証を行うことも出来ます。(Intentの連携を使うことが多いとは思いますが、、、)
http://goo.gl/4L5ie
認証の実装にはAndroidQueryの変更、幾つかのライブラリーの追加が必要になります。
BasicAuth, Twitter, Facebookの認証をする場合には
fullのついたAndroidQueryが必要になります。
ご参考までに簡単なサンプルを書きました。
Facebookから自分の情報をJson形式で取得するサンプルです。
public class SampleAuthActivity extends Activity {
AQuery aq;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_auth);
aq = new AQuery(this);
// Facebook認証用ボタン
findViewById(R.id.facebook_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SampleAuthActivity.this.authFacebook();
}
});
}
// Facebook認証
void authFacebook() {
FacebookHandle facebookHandle = new FacebookHandle(this,
"YOUR_FACEBOOK_APP_ID", PERMISSIONS);
facebookHandle.sso(1000);
final String url = "https://graph.facebook.com/me/";
aq.auth(facebookHandle).ajax(url, JSONObject.class, this, "facebookCb");
}
// Facebook認証完了時コールバック
void facebookCb(JSONObject json) {
Log.i("", "facebookCb");
AQUtility.debug(json);
}
}
URLなどを変更すると他のパラメータも取ってくることができます。
簡単なFacebookアプリならAndroidQueryで実装してもいいかもしれないですね。
以上、非常に簡単な説明でしたがご参考になればと思います。
多くの機能(非同期通信、エラーハンドリングetc)があるので是非Wikiを見て色々試して見て下さい。
【余談(すごく昔ですが…)】
去年(!!!)CROOZ「UI/UX勉強会」に参加してきました。
非常に面白いイベントでした。
所感としては、「UXを中心にしたアプリ開発が主流になってきている。どのようにしたらユーザに価値ある体験をしてもらえるかを常に考えながら、UI設計、アプリ設計をする必要がある。」でした。
以下のサイトにまとまっているので、まだ見ていない方は是非みてみて下さい。
また、弊社デザイナーブログでもUI/UXの話をしているので参考にしてください。