@neiraza

2匹の怪獣が寝た後にプログラマーしてる、最近はサイバーエージェントでゼミ長もしてる僕のネタ帳

複数のEditTextがジムやボールのようにTextWatcherした

追記:20130731
TextWatcher#onTextChanged(CharSequence s, int start, int before, int count)
このcountて文字数が返ってくるけど、数値を入力すると0 or 1しか返ってこなかった。
s.lenght()の方が良いかなと思い修正。

豆腐になったビグザム

最近、豆腐になってたビグザムさん。

子供の頃から今でも一番好きなMA。
f:id:redogu:20081202065013j:plain

なんで、これが好きかというと、
他者の追随を許さない圧倒的なバランスの悪さが、とても心に響く。

そして、この人、ドズル中将。
cvさんはお亡くなりなってしまっており、もうあの名言が聴けないかと思うと残念。
f:id:redogu:20100119090357j:plain

本題

EditTextが並ぶような入力画面をせっせと作ってて、
あれ?と思ったこと。

EditTextの入力値チェックをやりたいんだけど、
複数のEditTextを同時に対象とすると、良い解決方法がなかた。
もしかしたら、何か標準的なやり方が用意されているのでは?と調べても、考えても思いつかない。

なので、TextWatcherを実装して、こんなの作って解決してみた。
ねー、他に何かないのかな?

汎用的なAlertDialogを用意ついでにDialogFragmentデビュー

AlertDialogを汎用的につくろうと思って、下記を参考にDialogFragmentデビューしてみた。

http://d.hatena.ne.jp/sakura_bird1/20130207/1360193574:DialogFragmentでシンプルで汎用的なダイアログ

イメージ的にはこんな感じだけど、
これだとFragmentが再生成されたときとかに落ちてしまうはず。
ま、それは別の話しなので、そのうち。

https://gist.github.com/neiraza/6076893:neiraza / CommonDialogFragment

UITextFieldの本当の文字数をみてなかた

ほんたったで写経したり、設計書や資料集やらを置いて捗りまくりです。

EDISON ほんたった赤(ハードケース入り)

EDISON ほんたった赤(ハードケース入り)

本題

UITextFieldを2つ、UIButtonを1つの画面を作っていて、
UITextFieldが2つともN文字以上の場合のみ、UIButtonを有効にしたい

こういう時、UITextFieldDelegateを使いますよね。
UITextFieldDelegate Protocol Reference

たぶん、使うのはshouldChangeCharactersInRangeだと思うんですけど、
なんか思い通りにいかなくて。

hogeTextFieldの長さを取得するのに、

int hogeLen = hogeTextField.text.length;

こうしてるんだけど、

1文字入力
hogeLen :0

1文字削除
hogeLen :1

なんでだよーと思ってたら、ようはdelegateで捕まえてきた時の入力前の状態なのね。

というわけで、shouldChangeCharactersInRangeの引数を使って解決。

まとめ

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{    
    NSMutableString *str = [textField.text mutableCopy];
    [str replaceCharactersInRange:range withString:string];

    /*
      * あとはlengthをとって、文字数オーバならNOを返せばいいし、
      * 問題ないなら、そのhogeTextField.selected = YESとかしちゃって、
      * 他UITextFieldのselectedをみつつ、条件が合致すれば、button.enabled でいいかも
      */
 
    return YES;
}

とあるiOSの残念なバグ

動いていない自分のアプリを眺めてて、残念すぎるバグを見つけてしまったのでメモ。

関係ないけど、今日も動画を貼っておく

とある科学の超電磁砲S』のOP
これを歌ってる人のPVにはタッチが出ていて、「とある双子の幽体離脱」状態だた。

fripSide - sister's noise [ANIMAX STUDIO MUSIX ...

さて、本日の本題に入ろうか

エラー的にはどっかでメモリが解放されてしまってて、
おまえの見たい先なんてねーよって言われてた。

そもそも、このアプリっていつ作ったんだっけと思いつつ、
ログをみると、

Application windows are expected to have a root view controller at the end of application launch

これ、なんだけかーと思って、AppDelegate.mを見ると、
こんな記述を見つけて、ios6からsetRootViewControllerとか書かないと
警告でるとかだったような思い、

[self.window addSubView:hogeViewController.view];

こう書いてみたら・・・・

[self.window setRootViewController:hogeViewController];

何事もなかったように、動き始めた。
激しく無駄な時間を過ごした、日曜日の夜。

タッチイベントをスルーとか

あるviewのタッチイベントをスルーしつつ、そのview上のボタンイベントを拾いたい。
例えば、viewAの上に透明なviewBをのせて、viewB上にbtnCを置くとか。

これ特別なことではないんだけど、
AndroidとiOSをいったりきたりしてると、よく書き方を忘れてしまうので。

*今日の息抜きMAD (もうすぐDVD1巻発売ですね記念)*2013/6/17現在

【MAD】俺の妹がこんなに可愛いわけがない 『これが私の生きる道』 - YouTube

viewをスルーしたいだけなら、これでも可。
ただし、view上のボタンもスルッと抜けてしまうはず。

userInteractionEnabled= NO;

そこで、これ。
オーバーライドしちまって、特定のviewだけふがふが。

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *view = [super hitTest:point withEvent:event];
    if ( self == view ) {
        return nil;
    }
    return view;
}


6月19日発売、『俺の妹がこんなに可愛いわけがない。 1(完全生産限定版) [Blu-ray]』
特典に、原作者書き下ろしの短編小説がついてくるとか。

Androidのwebview背景を透過でクンカクンカ

日々、AndroidやiOSをいったりきたりしつつ、
ちょいちょい、JSも差し込みで対応しながら、アプリつくってます。

今日は忘れがちな、webview背景を透過について。
やりたいことはActivityの画面遷移後でも、1つ前の画面を見えるようにしておきたい。

ラノベ最終巻12が出たばっかですし、
せっかくなので、黒猫のクンカクンカを貼っておきますね。
BD1巻出るまでイ㌔


黒猫族のくんか - YouTube

  • Activityの背景を透過しよう
<activity
    android:name=".hoge.FugaActivity"
    android:theme="@android:style/Theme.Translucent"/>
  • webviewの背景を透過しよう
webView.setBackgroundColor(0);


これで万事解決!

GCMで複数のレシーブ様が登場したぜヒャッハー

今更ですが、C2DMからGCMへ移行したので、
気になったポイントを1つピックアップ。


その前に神猫さんがクルッとまわりますね
f:id:redogu:20130611182407g:plain


Pushサービスを複数利用できる仕様ではだと思うので、
https://developer.android.com/google/gcm/adv.html:Receiving Messages from Multiple Sendersを参照
n個のPushサービスに対し、アプリ内で1つのレシーバでokかなと思うけど、

もし、外部の既製品であるPushサービスを利用すると、
提供されるSDKにレシーバも入っていると思うのね。
そいつと、元々自分がGCMBaseIntentServiceを拡張してつくったレシーバで、
処理が競合してくるよね、何も考えないと両方が受信し始めて。

というわけで、僕はこんな処理で自分のsenderさんだけ対応するような実装してる。

@Override
protected void onMessage(Context context, Intent intent) {
    String senderId = intent.getStringExtra("from");
    //notification出す為にゴニョゴニョするんだと思う
}


っていうのが、自信ないのでエントリを書いておくことにした。