2013/12/15

Android で 円をきりとる。

タイトル微妙。
なんて表現していいかわからないがこんな感じの円を切り取ってつくる

2013/12/05

TextView の フォントを変えると中国っぽさがでる。フォントによっては・・・。

端末のフォントが気に食わないことも多々あるかと思います。そこで TextView フォントを変えましょうということに。ただ普通のフォントがいいのでいいものないかなーと探していたら、Android SDK のなかにフォントが入ってた。ソレを使ってみます。

/path/to/sdk/platforms/android-[xx]/data/fonts/
にたくさん入ってます。
※ [xx] はバージョン番号


2013/11/30

Android で隙間なく Button を並べる。

ボーダー付きのカスタムボタンをびっちり隙間なく並べると、カッコ悪い。連続したボーダーがあるもんだからボーダーが太くなる。こんな感じ。


結論からだと。ボーダーは定義しないで、隙間開けて背景色を見せることでボーダーっぽく見せる。なんか昔のhtmlみたいだ・・・。

なんやかんやでこうなる。一番上のはボーダーありだから太い箇所がある。
縦線だけ、ヨコ線だけ、あと最初と最後の要素だけ角丸も。角丸がちょっと微妙かも・・・。内と外の radius がなかなかビッタリいかない。悩みどころ。まあ許容範囲内?


もうちょっとスマートな方法ないものかしら?

style="?android:attr/buttonBarStyle"
style="?android:attr/buttonBarButtonStyle"

あたりをちゃんと理解すればいいのかな?

とりあえず今回のサンプルプロジェクトは githunb にあげておきます。
drawable と layout の中身見ればまあそれなりに。

2013/11/15

こんな Android コードは嫌だ

public class SomeActivity extends Activity {
ArrayList<String> list_items;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_some);
this.list_items = new ArrayList<String>();
this.list_items.add("one");
this.list_items.add("two");
this.list_items.add("three");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.some, menu);
return true;
}
private class ListAdapter extends BaseAdapter {
@Override
public int getCount() {
return list_items.size();
}
@Override
public Object getItem(int position) {
return list_items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.list_item, null);
}
String item = list_items.get(position);
// do something
return convertView;
}
}
}
view raw gistfile1.java hosted with ❤ by GitHub


うん。やだ。

2013/11/08

DialogFragment のイベントを Activity とか Fragment に伝えたい。

削除しますか?「はい/いいえ」の確認ダイアログ出して、「はい」したらもとの画面からも消えてるみたいな。ダイアログのイベントを元々の画面伝えたい。そんな感じのよくある話。

DialogFragment になにか渡したいときは Fragment の特徴である DialogFragment#setArguments() で渡さないといけない。でもリスナー渡したいときは一筋縄ではいかない。DialogFragment#setOnDoSomethingListener() なんかを生やしても大人の事情でダメ。ここでこうやってみる。

まずはなんにせよ Listener を作る。
public class ConfirmDialogFragment extends DialogFragment {
public interface OnButtonClickListener {
public void onPositiveClick();
public void onNegativeClick();
}
}
view raw gistfile1.java hosted with ❤ by GitHub

こんな感じ。

Activity に通知する場合。


Activity にリスナーを implements するの忘れない。Dialog 側は onAttach(Activity activity) をオーバーライドする。ライフサイクルに組み込まれてるこのメソッドでは Activity が渡されるので、そのアクティビティが Listener を implements してるかチェックできる。なので DialogFragment#setArguments() で渡さなくてもいい。
// DialogFragment
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
this.mOnDialogButtonClickListener = (OnDialogButtonClickListener)activity;
} catch (ClassCastException e) {
e.printStackTrace();
}
}
view raw gistfile3.java hosted with ❤ by GitHub

こんな感じ。あとは必要なところでthis.mOnDialogButtonClickListenerのメソッド使えばいい。

Fragment に通知する場合。


DialogFragment にいつもの newInstance() を生やす。ここで引数に Fragment をとるようにして、DialogFragment#setTargetFragment() を使って Fragment を保持。必要なときに DialogFragment#getTargetFragment() から Fragment を取ってきてリスナーにキャストして使う。ちょっと回りくどい。

public class ConfirmDialogFragment extends DialogFragment implements
DialogInterface.OnClickListener {
public interface OnDialogButtonClickListener {
public void onPositiveClick();
public void onNegativeClick();
}
public static ConfirmDialogFragment newInstance(Fragment fragment) {
ConfirmDialogFragment dialog = new ConfirmDialogFragment();
dialog.setTargetFragment(fragment, 0);
return dialog;
}
@Override
public void onClick(DialogInterface dialog, int which) {
OnDialogButtonClickListener listener;
try {
listener = (OnDialogButtonClickListener) this.getTargetFragment();
} catch (ClassCastException e) {
// リスナーなし
return;
}
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
listener.onPositiveClick();
break;
case DialogInterface.BUTTON_NEGATIVE:
listener.onNegativeClick();
break;
}
}
view raw gistfile4.java hosted with ❤ by GitHub

こんな感じでいいんじゃまいか。

2013/11/06

DialogFragment#dismiss() で NullPointerException がたまにでる。

「たまにでる」ここぽいんと。

ローディングのくるくるダイアログとか DialogFragment とかって出すことは、まあよくあると思う。そんな感じで出してたら NullPointerException でた。
こんな感じのとこ。

// ダイアログ出すとこは
// this.mLoadingDialog = LoadingDialog.newInstance("ちょっとまってねっ!");
// っていう感じでメンバ変数に入れといてる。
if (this.mLoadingDialog != null) {
this.mLoadingDialog.dismiss(); // ここでぬるぽ
}
view raw gistfile1.java hosted with ❤ by GitHub


いやいや、null じゃなければって言ってるでしょ?どうも DialogFragment の中で何かが null っぽい(例外メッセージ忘れた)なので、こう変えた。

// ダイアログ出す時
FragmentManager fragmentManager = this.getSupportFragmentManager();
LoadingDialog dialogFragment = LoadingDialog.newInstance("ちょっとまってねっ!");
dialogFragment.show(fragmentManager, LoadingDialog.DIALOG_TAG);
// ダイアログ消す時
FragmentManager fragmentManager = this.getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(LoadingDialog.DIALOG_TAG);
if (fragment != null && fragment instanceof DialogFragment) {
((DialogFragment)fragment).dismiss();
}
view raw gistfile2.java hosted with ❤ by GitHub


TAG を指定して生成、消すときも TAG 指定で取得、fragment が帰ってくるから一応 null チェックとそいつが DialogFragment かどうかを見て、dismiss() 呼び出す。これで一応 NullPointerException はなくなりました。ここらへんどうなんだろうかっていうのはある。ドキュメント見てもshow() の例は書いてるけど dismiss() の例もないものね。

追記


12-03 17:57:12.331: E/AndroidRuntime(5279): java.lang.NullPointerException
12-03 17:57:12.331: E/AndroidRuntime(5279): at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:184)
12-03 17:57:12.331: E/AndroidRuntime(5279): at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:155)


こんなかんじの例外でした。

2013/07/21

Android でクラスを作るときに TAG も一緒につくる。

Log.d(TAG, "hogehoge")
とか何かと物入りな TAG という代物。

クラスを作成するたびに
private static final String TAG = "hoge";
とかやっていたけど、まあめんどいし忘れるし。
うまいことできんかと思ったらテンプレート機能が Eclipse さんには備わっておる。

2013/06/04

Java の Calendar は Singleton ではなくて Factory Method。

カレンダーを取得する際はCalendar.getInstance() でとる。このgetInstalnce()だけで、勝手にシングルトンだと思っていた。実際は Factory Method パターン でした。

ソースコードを見ると
Calendar#getInstance() -> Calendar#createCalendar(TimeZone zone, Locale aLocale) で言語、国なんかを判別して
  • new sun.util.BuddhistCalendar(zone, aLocale);
  • new JapaneseImperialCalendar(zone, aLocale);
  • new GregorianCalendar(zone, aLocale);
を new してインスタンス生成して返してる。

シングルトンだと思っていたから、 Calendar#add() とかして、アプリで使う Calendar インスタンスの時間ずれたらどうしようとか今更心配した・・・。大丈夫だった・・・。

2013/05/19

Eclipse で Gradle で Android する。

なんか Maven でこの前同じようなの書いてた気がするが、Maven は諦めた。XML の設定が慣れない・・・・。 Gradle は Groovy らしい。Groovy よくわかってない。

どうも Android のビルドツールは Gradle になるようだ。Android Studio のビルドツールは Gradle。ant が何かもよくわかってないのに!そして ActionBarSherlock も Gradle に対応したらしいし、ADT 22 から Gradle プロジェクトにエクスポートもできるようですしとりあえず触ってみる。

2013/05/16

Eclipse ADT 22 のバージョンアップでは Android SDK Manager のアップデートは 2 回する。

Android Studio が発表されたり、そんななか ADT もバージョンアップして、おもむろにカジュアルにバージョンアップした。そしたらエラーだらけで大変なことに。

2013/05/03

Mac で JAVA_HOME 環境変数を設定する。

zsh にを使っていて JAVA_HOME 環境変数を設定する必要がある。

~/.zshrc

 export JAVA_HOME=$(/usr/libexec/java_home)

× export JAVA_HOME=/usr/libexec/java_home

$() で囲まないと以下のように怒られる。
Error: JAVA_HOME is not defined correctly.
We cannot execute /usr/libexec/java_home/bin/java
実行結果を展開してるのかな?

シンボリックリンクになっているようだ
ls -al /usr/libexec/java_home
lrwxr-xr-x 1 root wheel 79 4 27 21:16 /usr/libexec/java_home -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java_home

2013/04/29

Mac を2 回再インスールしても生き残った必須アプリ 27 個

最近カジュアルに OS の入れなおしをしています。重要なのは Dropbox なんかに入れてるので Mac の中が削除されてもそう痛くないんですよね。むしろ、中から綺麗になってスッキリするのでちょっと好きです。アプリを入れなおしてるんですが、そんな中生き残ってるアプリがあるので、次インストールするときに迷わないように記録しておく。

2013/04/19

ViewPager に区切りを追加する

ViewPager でページング作ってスワイプ楽しいです。ただ、単色の背景が続くとスワイプしたのかどうかがわからんくなってくる。なにげに Google Play のアプリを見てたらページ間に仕切りがついていた。なにそれ欲しい。

2013/04/12

いつか使いたい!!! Android 用ライブラリ 24 個

有名ドコのアプリのヘルプなんかをチェックして使用されているライブラリ、及び Github 探索して良さげなライブラリをまとめてみました。今すぐ使いたいものから、これ使えるのか?というものまで様々ですが、せっかくあるもの。すごい人達のゴイスーなものでちょっとでも楽したいものです。

とりあえずアルファベット順で。簡単な説明もつけたので参考にしてください。というか触ってないのも多いので各自ぜひともお試しください。ちなみに依存関係は深く確認してません。また、ライセンスについては現時点 2013-04-11 のものとなります。使用の際は都度確認くだし。


もくじ

  1. ACRA
  2. ActionBarSherlock
  3. AndroidAnnotations
  4. Android Asynchronous Http Client
  5. android-gpuimage
  6. android-mapviewballoons
  7. android-query
  8. Android-Universal-Image-Loader
  9. Android-ViewPagerIndicator
  10. Apache Commons
  11. DiskLruCache
  12. facebook-android-sdk
  13. GT-FaceSearch
  14. google-gson
  15. guava-libraries
  16. libgdx
  17. NineOldAndroids
  18. PullToRefresh
  19. oauth-signpost
  20. RoboGuice
  21. SlidingMenu
  22. SmartImageView
  23. Twitter4J
  24. zxing

2013/04/11

Chrome の「ユーザー」が便利

同じサービスで違うアカウントを持つこと多々あると思います。例えば Gmail。会社用アカウント、個人用アカウント。ひもづけることもできるけど、それはちょっと・・・。そうは言ってもいちいちログアウトしてのログインしなおしなんてめんどい。

そんな時に Chrome の「ユーザー」

2013/04/09

画像の切り抜き(トリミング)なら BitmapRegionDecoder が超便利

Android で画像を読み込むのは結構厄介。一つの ImageView に読み込むならそんなに悩まないけど、 ListView やら GridView やらで画像を扱うとすぐ OutOfMemory って怒られる。限られた資源、守りたいですね。

基本は BitmapFactory.Options.inJustDecodeBounds = true にして、画像の情報だけを とって BitmapFactory.Options.inSampleSize を適切にしてあげて全体を無難に読み込む。そうじゃなくて、大きな画像の一部を切り抜いてもいいんじゃないかと。そんな画像切り抜き BitmapRegionDecoder クラスというのがあります。

2013/03/08

PHP アプリケーション開発のために Eclipse に入れてるプラグインと設定。 その2


第一弾はこちら

PHP アプリケーション開発のために Eclipse に入れてるプラグインと設定。
ちょっと今の環境が変わったので再度まとめてみる。

2013/02/23

Adblock Plus によって zenback が表示されなくなった時は。

残念ながら、Adblock Plus [Chrome ウェブストア] を入れると zenback が表示されません。
(日本向けフィルタ(仮) を適用後かな?)

ソーシャルボタンなんかも一気に消えてしまうので、いい記事に出会っても何もアクション取れなくなってしまう、悲しい出来事。(はてブはできるけど。)

そんな時は Adblock Plus の 「自作フィルタ」に以下を登録。
@@||*.zenback.jp/

こんな感じ。ニコ動も再生できなくなっちゃったから、それ用のフィルタも入れてある。


2013/02/21

Facebook の通知音を消す方法(2013/02/21 現在)

いつも Facebook はブラウザで開きっぱで、メッセージやら自分のコメントへの返信やらはタイトルに (1) とかでるとか、赤いアイコン(アレ)に変わっているだけで十分の通知だった。

しかし今日(2013/02/21から?)は違った。なんと音がなる。「ポコッ」って。

ヒジョーにうざい。消したい。ググった。

2013/02/07

PhpStorm のタブ文字が自己主張しすぎるので、色を変えてみた。


PhpStorm をちょいちょい触っています。Eclipse PDT をメインに使っていますが、ダイブ話題になっていたりして気になった。

どうしても比較してしまうのでアレなんですが、ダメなのがタブ文字。タブでインデントしてるファイル開いた時に初めて分かる奴の主張っぷり。
Eclipse は 透過度替えられるのに・・・・。

お前はモットおとなしくしててもいい。

2013/01/29

Android でカメラ撮影後メンバ変数が空になる。

理由はわかっていたんです。
カメラから戻ってくるときに onActivityResult が呼ばれるんですが、
そのまえに onCreate() が呼ばれている。要するに Activity が再生成されているから、
カメラ呼び出し前にメンバ変数セットしていようとも、もろともいなくなってしまったと。

以前にこんなのを書きました。
Android でカメラかギャラリーから画像を読み込んでトリミングして表示するサンプル
ただここに盲点が有りました。

Samsung Galaxy シリーズという盲点がぁがぁ・・・!!(大げさ)


※2013/01/30 21:33 追記
Google+ でご指摘頂きました。
Activity が破棄され、メンバ変数が初期化されてしまうような場合、
Activity#onSaveInstanceState(Bundle outState) で Bundle に メンバ変数として保持していた値を put() 。
その後復帰後に Activity#onRestoreInstanceState(Bundle savedInstanceState) で Bundle から 取り出して再度メンバに設定してあげるようです。

Activity のライフサイクル大事!!
ご指摘ありがとうございます!!

2013/01/25

Chrome for Android の USB ウェブデバッグでスマフォWEBサイトをデバッグする

Android 端末にインストールした Chrome を通して、
PC 側の Chrome で WEBページのデバッグができますよと。
試してみました。

用意。

  • Android 端末。
  • Chrome (PC側もAndroid側も)
  • Android SDK

まあぶっちゃけ ココ を見てしまえば終わりなんですが、
Chrome は両方にインストール済として話を進める。

Android SDK と Android SDK Platform-tools の準備。

とりあえず Android SDK をダウンロードして任意の場所に展開。 ~/Library/android-sdk-macosx (以下 SDK_PATH)な感じで僕は置いてる。
SDK_PATH/tools/android
を実行するとなんか (Android SDK Manager) 出るので、Android SDK Platform-tools をインストールする。SDK_PATH/platform-tools っていうディレクトリができてるはず。

Android 端末の設定。

SDK ダウンロードしてる間にでも Android 側の設定をしときます。OSのバージョンが・・・

  • 3.2 以下:[設定] -> [アプリケーション] ->[開発者向けオプション] -> [USBデバッグ]
  • 4.0 以上:[設定] -> [開発者向けオプション] -> [USBデバッグ]
  • 4.2 以上:[設定] -> [この端末について] -> [ビルド番号]を 7回タップ -> 画面戻って戻って[開発者向けオプション] -> [USBデバッグ]

にチェック。日本語のメニュー項目名は違うかも。そして 4.2 以上の端末は隠しコマンド的なのなにそれこわい。

そして、Chrome の[設定] -> [デベロッパーツール] -> [USB ウェブ デバッグを有効化] にチェックを入れておく。

それでは・・・

Android と PC を USBでつなぐ。

adb コマンド叩く (PC 側)

./SDK_PATH/platform-tools/adb forward tcp:9222 localabstract:chrome_devtools_remote

* daemon not running. starting it now on port 5037 *
* daemon started successfully
って出たらOK。

Chrome でアクセス (PC 側)

http://localhost:9222

アクセスすると、Android の Chrome で開いているタブ一覧が出てくるので、好きなのクリック。PC 側の Chrome で デベロッパーツールが開くのでよしなにします。

Enjoy!

※404 的なことになったら
SDK_PATH/platform-tools/adb kill-server
からの
./SDK_PATH/platform-tools/adb forward tcp:9222 localabstract:chrome_devtools_remote
をお試しくだしあ。

ただ・・・


  • Android 標準ブラウザで使えない。
  • 結局は端末依存とかあるし、やっぱり該当の機種がないとアレ。
  • だったら、Chrome でユーザーエージェントいじったほうが早くね?

ヽ(´Д`;)ノアゥ...

結論

FireMobileSimulator すごい。
https://chrome.google.com/webstore/detail/firemobilesimulator-for-g/mkihbloiacgiofaejgagokalpeflnmbe?hl=ja





2013/01/21

Eclipse にて @Override アノテーションで must override a superclass method と怒られた。

わかっていたはずなのに、無駄にハマった。
忘れないために、自分で記録しておく。


こんなかんじで must override a superclass method と怒る Eclipse さん。
これはコンパイラのレベル が 1.5 になっているから。Android  開発の場合は 1.6 に変更します。

[command + ,] で [Preferences] を開いて、
[Java] -> [Compiler] を開く。
[Compiler compliance level] を 1.6 に変更。

これで直る。
エラーが消えなかったら、プロジェクトのクリーンをしてみる。[Project] -> [clean]
ん?これって昔書いたっけ?


2013/01/20

VirtualBox でコンソール画面を出さずに仮想マシンを起動する。

Oracle VM VirtualBox マネージャーから起動すると、
もれなくコンソール画面がついてくる。

邪魔。

サーバー用途の場合画面なんていらなので、消したい。

VirtualBox でゲストの CentOS に SSH で接続したい。

所謂ホストオンリーネットワーク。

ホスト: MacOS X 10.8.2
ゲスト: CentOS 6.3
VirtualBox: 4.2.6