ページ

2013/07/30

[Android]スクリーンショットを撮る(ViewをBitmapとして取得する)

時々プログラムからスクリーンショットを撮りたくなることがあると思います。
ずっとできないと思っていたのだけど実は View で描画したものを
Bitmap として取得することができました。

ステータスバーなどを含んだ画面全体を Bitmap として取得

いわゆるスクリーンショット。
View#getRootView | Android Developersを使うためになにか適当な View が必要。
public Bitmap getScreenBitmap(View view){
    return getViewBitmap(view.getRootView());
}

特定の View を Bitmap として取得

public Bitmap getViewBitmap(View view){
    view.setDrawingCacheEnabled(true);
    Bitmap cache = view.getDrawingCache();
    if(cache == null){
        return null;
    }
    Bitmap bitmap = Bitmap.createBitmap(cache);
    view.setDrawingCacheEnabled(false);
    return bitmap;
}
View#getDrawingCache | Android Developers はシステムの持っている Bitmap の参照を返す。
システム側から recycle されるので Bitmap#createBitmap | Android Developers で作り直す必要がある。

MVCモデルにおけるModelの関係性とRailsでのアソシエーションの設定

Rails を勉強中です。学んだことをちょっとずつまとめていきたいと思います。
誤りがあれば教えていただけると幸いです。

アソシエーションって何?

日本語訳すると、「つながり」とか「関係性」とか訳される。
MVCフレームワークを使うと出てくるアソシエーションは、モデル同士の関係性のこと。
すごく大雑把に言えば、テーブルの JOIN の繋ぎ方のこと。たぶん合ってる。

なぜアソシエーションが必要なのか?

設定しておくと Rails では JOIN を明示的に書かなくても SELECT できたり、
紐付いたデータを一緒に削除できたり、色々とフレームワークの支援を得られる。
何故アソシエーションなの?(Why Associations?) - Active Record Associations - 株式会社ウサギィwiki
Active Record Associations — Ruby on Rails Guides

MVC モデルにおける Model の関係性

  1. 1対1関連(has_one, belongs_to)
  2. 経由モデルありの1対1関連(has_one :through)
  3. 1対多関連(has_many, belongs_to)
  4. 中間テーブルに属性ありの多対多関連(has_many :through)
  5. 中間テーブルに属性なしの多対多関連(has_and_belongs_to_many)
  6. ポリモーフィック関連(has_many :as)
Rails での主なアソシエーションの種類は上記の6つ。
ちゃんと理解するために身近なサンプルを作ってみることにした。

1対1関連(has_one, belongs_to)

User - Blog
上記のような 1 User に 1 Blog というブログサービスを想定したアソシエーションの設定は以下のようになる。
class User < ActiveRecord::Base
    has_one :blog
end
class Blog < ActiveRecord::Base
    belongs_to :user
end
has_one アソシエーション - Active Record Associations - 株式会社ウサギィwiki
belongs_to アソシエーション - Active Record Associations - 株式会社ウサギィwiki
The belongs_to Association - Active Record Associations — Ruby on Rails Guides
The has_one Association - Active Record Associations — Ruby on Rails Guides

経由モデルありの1対1関連(has_one :through)

User - Blog - Setting
User から Blog を通して Setting にアクセスするような3つのモデルの直線的な関係性は以下のように設定する。
class User < ActiveRecord::Base
    has_one :blog
    has_one :setting, through: :blog
end
class Blog < ActiveRecord::Base
    belongs_to :user
    has_one :setting
end
class Setting < ActiveRecord::Base
    belongs_to :blog
end
has_one :through アソシエーション - Active Record Associations - 株式会社ウサギィwiki
The has_one :through Association - Active Record Associations — Ruby on Rails Guides

1対多関連(has_many, belongs_to)

Category - Article
1 カテゴリに複数の記事、1 記事に 1 カテゴリという関係性を定義したい場合は以下のように設定する。
class Category < ActiveRecord::Base
    has_many :article
end
class Article < ActiveRecord::Base
    belongs_to :category
end
has_many アソシエーション - Active Record Associations - 株式会社ウサギィwiki
The has_many Association - Active Record Associations — Ruby on Rails Guides

中間テーブルに属性ありの多対多関連(has_many :through)

Blog - Reader - User
中間テーブルが属性(理論的な意味でのカラムのこと)を持つ際の多対多の関連性は以下のように定義する。
class Blog < ActiveRecord::Base
    has_many :readers
    has_many :users, through: :readers
end
class Reader < ActiveRecord::Base
  belongs_to :user
  belongs_to :blog
end
class User < ActiveRecord::Base
    has_many :readers
    has_many :blogs, through: :readers
end
has_many :through アソシエーション - Active Record Associations - 株式会社ウサギィwiki
The has_many :through Association - Active Record Associations — Ruby on Rails Guides

中間テーブルに属性なしの多対多関連(has_and_belongs_to_many)(HABTM)

Article - Tag
中間テーブルが属性を持たず、2つのテーブルの関係性の情報しか持たない場合は以下のように定義する。
class Article < ActiveRecord::Base
    has_and_belongs_to_many :tags
end
class Tag < ActiveRecord::Base
    has_and_belongs_to_many :articles
end
has_and_belongs_to_many アソシエーションの規約
  • 中間テーブルを作成しなければならない。
  • 中間テーブルのテーブル名は参照先のテーブル名を辞書順に「_」で連結しなければならない。(※)
  • 中間テーブルの主キー列を無効化しなくてはならない。
  • 中間テーブルの外部キー列は「参照先のモデル名_id」の形式にしなければならない。
  • 中間テーブルのタイムスタンプ列を削除しなくてはならない。
※ 両方のモデルの has_and_belongs_to_many アソシエーションの指定の後に
join_table でテーブル名を指定すれば任意のテーブル名を指定することができる。
rails g migration CreateArticlesTags でマイグレーションファイルが生成されるので
上記の規約に従い、以下のように修正する。
class CreateArticlesTags < ActiveRecord::Migration
  def change
    create_table :articles_tags, :id => false do |t|
      t.references :article, index: true
      t.integer :article_id
      t.references :tag, index: true
      t.integer :tag_id
    end
  end
end
has_and_belongs_to_many アソシエーション - Active Record Associations - 株式会社ウサギィwiki
The has_and_belongs_to_many Association - Active Record Associations — Ruby on Rails Guides
[Rails]中間テーブルを使って他テーブルの情報を参照する - has_and_belongs_to_many (m:n) のケース
has_and_belongs_to_many アソシエーションのための結合テーブルの作成 - 株式会社ウサギィwiki
Creating Join Tables for has_and_belongs_to_many Associations — Ruby on Rails Guides

ポリモーフィック関連(has_many :as)

Blog - Article
 └ Picture ┘
あるモデルが1つ以上の他のモデルに属する場合、以下のように定義する。
class Blog < ActiveRecord::Base
    has_many :pictures, as: :imageable
end
class Article < ActiveRecord::Base
    has_many :pictures, as: :imageable
end
class Picture < ActiveRecord::Base
    belongs_to :imageable, polymorphic: true
end
polymorphic アソシエーション - Active Record Associations - 株式会社ウサギィwiki
Polymorphic Associations - Active Record Associations — Ruby on Rails Guides

参考

ruby/rails/RailsGuidesをゆっくり和訳してみたよ/Active Record Associations - 株式会社ウサギィwiki
Active Record Associations — Ruby on Rails Guides

2013/07/16

郵便番号フィールドにinput[type="number"]を使ってはいけない

スマホサイトを制作したのだがフォームにフォーカスを当てた際に出るキーボードを
数字キーボードにしたいという要望があったので
input[type="number"] や input[type="tel"] を使えば良いと聞いていた俺は
それぞれ郵便番号と電話番号のフィールドの type を text から変更したのだけど
input[type="number"] には罠があったので共有します。
input[type="number"] というよりは iOS の Safari にある罠です。

iOS の Safari は input[type="number"] のフィールドで入力値がゼロ始まりの数値の場合、頭のゼロを自動で除去する

この仕様…あのおせっかいな Excel を思い出す仕様だぜ…ギリッ…

例えば皇居の郵便番号 100-0001 は分割された郵便番号フォームの後ろの部分が以下のように頭ゼロになります。
-
表示上は iOS でも全く問題ないのだけれど POST するタイミングで iOS の Safari は 0001 を 1 に変換します。
ベーシックなバリデーションで郵便番号 7 桁とか判定して 7 桁入力してくださいとかエラー出すと
ユーザーは 7 桁入力したのにとなるので確実にクレームものです。
iPhone を普段使いしていない僕は完全に油断してやられました。
iOS のみで起こり、input[type="number"] でゼロ始まりの数値を POST した時にようやく分かるバグです。
全く油断もすきもありません。

とりあえず対処として input[type="text"] に戻しました。
input[type="tel"] に変えるのも一瞬考えましたが
電話番号でないフィールドに input[type="tel"] を適用するのも
またろくでもないことになりそうだったのでやめておきました。

2013/07/15

[SQLite]SQLite Shellの設定を起動時に自動的に読み込む

Rails の開発を始めたら開発時のデータベースが SQLite だったので
SQLite のシェルを使っているのだが、
各種設定が起動時にリセットされる(というか保存されていない)ので設定を保存したい。

調べてみると ~/.sqliterc を用意すれば良いらしい。

参考
sqlite3 コマンドラインツールの設定保存 - wicaの日記
.headers ON
.mode column
.nullvalue "(null)"
.timer ON
.tables
これで起動時に各種設定が実行される。
それを逆手に取って起動時にそのデータベースファイルのテーブル一覧を表示するように最後の行を追加した。
これでテーブル名のコピペも楽ちん。本当は Tab 補完して欲しいのだけど。

2013/07/14

[Vim]vimdiffで差分を表示・マージして元ファイルとの差分を確認する

よく vimdiff で差分を取るのだけれどマージのコマンドを忘れてしまうので備忘録。

vimdiff file1 file2


まあ、これは基本。
初期設定の vimdiff の配色はすごく目に悪い感じだったので .vimrc に以下の設定をした。
hi DiffAdd    ctermfg=black ctermbg=2
hi DiffChange ctermfg=black ctermbg=3
hi DiffDelete ctermfg=black ctermbg=6
hi DiffText   ctermfg=black ctermbg=7
参考: そんな僕らはコピペプログラマー!: vi・vim : vimdiffの色設定

ココから差分を確認してマージしていくにはマージした行にカーソルを合わせる必要がある。
吹き出しの根本がカーソルのある画面。

新規行の右方向のマージ

左画面の新規行にカーソルを合わせて dp


コマンドさえ覚えていればそこまで問題ない。
diff put で dp

変更行の左方向のマージ

左画面の行にカーソルを合わせて do


こちらもコマンドさえ覚えていれば問題ない。
diff obtain で do

変更行の右方向のマージ

左画面の行にカーソルを合わせて dp


変更行の時も新規行と同様にマージしたい行にカーソルを合わせてコマンドを実行するだけ。

新規行の左方向のマージ

右画面の新規行にカーソルを合わせて dp


コレが一番のクセモノ。
dp, do コマンドを実行するにはマージしたい行にカーソルを合わせる必要があるが、
右画面のファイルで新規の場合は左画面のファイルには存在しない行なのでカーソルを合わせることができない。
そのため、右画面へ移動してマージしたい行にカーソルを合わせて dp コマンドで取り込む必要がある。
左画面から右画面への移動は Ctrl + W, Ctrl + W で行う。逆も同様。

左画面の新規行の下の行にカーソルを合わせて do

この記事を書いていて気がついたのだが、
左画面の新規行(カーソルが置けない)の下の行にカーソルを合わせて do コマンドで取り込むことで、
右画面の新規行を左画面にマージすることができる。
わざわざ左画面から右画面へ移動する必要なんてなかった。

元ファイルとの差分を確認する

:DiffOrig


上の vimdiff 画面で右画面へ移動し、 右画面を :q コマンドなどで終了、閉じた後、
:DiffOrig コマンドを実行すると上の画像のようになる。
左下に [Scratch] と書かれている方が元ファイルである。
先ほどと左右が逆になって左画面だった編集後のファイルが右画面になる。
上のマージ操作で取り込んだもの(変更業の左方向のマージ、新規行の左方向のマージ)が差分として現れている。
これで意図しないマージをしていないか確認することができる。

※注意
Vim のチュートリアルと基本設定 | DevAchieveで解説した
$VIMRUNTIME/vimrc_example.vim の設定をしていないと DiffOrig が使えない。
以下が設定してあれば使用できるので設定しておいたほうが良い。
if !exists(":DiffOrig")
  command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
    \ | wincmd p | diffthis
endif

おまけ

差分のある行への移動

] + c : 次の差分の行へ移動
[ + c : 前の差分の行へ移動

参考
2つのテキストファイルの差分をマージする — 名無しのvim使い
最後に保存してから、どのくらい編集したのかの差分を表示 — 名無しのvim使い

2013/07/13

Vim のチュートリアルと基本設定

もっぱら GUI を使っていますが CUI ともお友達にならなきゃいけないので
CUI のエディタである Vim のチュートリアルをやってみました。
また、その中で出た設定ファイルも組み込んでみました。

Vim のチュートリアルは Vim が入っていればたぶん入っていて、
以下のコマンドを実行すれば良いです。
vimtutor ja
全7章からなる Vim の基本的な使い方のチュートリアルです。
30分くらいでできると思うので使う人は是非やってみることをオススメします。

その中で Vim の設定ファイルである .vimrc の例があったのでこちらに少しいじったのを載せておきます。
原文は適当なファイルで以下のコマンドを実行して確認してください。
:read $VIMRUNTIME/vimrc_example.vim
" :read $VIMRUNTIME/vimrc_example.vim

" When started as "evim", evim.vim will already have done these settings.
" "evim" コマンドで開始した場合は設定済みとして読み込まずに終了する。
if v:progname =~? "evim"
  finish
endif

" Use Vim settings, rather than Vi settings (much better!).
" This must be first, because it changes other options as a side effect.
" Vi の設定よりも Vim の設定を使用する。
" これは副作用として他のオプションを変更するため最初に記述する。
set nocompatible

" allow backspacing over everything in insert mode
" 挿入モードの全てにおいてバックスペースを許可する
set backspace=indent,eol,start

if has("vms")
  set nobackup    " do not keep a backup file, use versions instead
else
  set backup      " keep a backup file
endif
set history=50    " keep 50 lines of command line history
                  " コマンドライン履歴を50行保持する
set ruler         " show the cursor position all the time
                  " 常にカーソルのポジションを表示する
set showcmd       " display incomplete commands
                  " 不完全なコマンドを表示する
set incsearch     " do incremental searching
                  " インクリメンタルサーチをする

" Don't use Ex mode, use Q for formatting
" フォーマットに Q を使用する Ex モードを使用しない。
map Q gq

" CTRL-U in insert mode deletes a lot.  Use CTRL-G u to first break undo,
" so that you can undo CTRL-U after inserting a line break.
" 挿入モードでの CTRL-U で たくさん削除する。
" 改行を入れた後の CTRL-U で元に戻せるようにするために、
" まず CTRL-G u を使ってアンドゥを中断してください。
inoremap <C-U> <C-G>u<C-U>

" In many terminal emulators the mouse works just fine, thus enable it.
" 多くのターミナルエミュレータでマウスは良い働きをするので有効化する。
if has('mouse')
  set mouse=a
endif

" Switch syntax highlighting on, when the terminal has colors
" Also switch on highlighting the last used search pattern.
" ターミナルに色がある場合、シンタックスハイライトを ON に変更する。
if &t_Co > 2 || has("gui_running")
  syntax on
  set hlsearch
endif

" Only do this part when compiled with support for autocommands.
" autocommands のサポートが有効な場合のみこの部分を実行する
if has("autocmd")

  " Enable file type detection.
  " ファイルタイプ検出を有効にする。
  " Use the default filetype settings, so that mail gets 'tw' set to 72,
  " 'cindent' is on in C files, etc.
  " Also load indent files, to automatically do language-dependent indenting.
  " デフォルトのファイルタイプ設定を使用する。
  " また、言語ごとのインデントを自動実行するためのインデントファイルを読み込む。
  filetype plugin indent on

  " Put these in an autocmd group, so that we can delete them easily.
  " 削除しやすいように autocmd グループにこれらを記述する。
  augroup vimrcEx
  au!

  " For all text files set 'textwidth' to 78 characters.
  " すべてのテキストファイルについてテキスト幅は 78 文字にセットする。
  autocmd FileType text setlocal textwidth=78

  " When editing a file, always jump to the last known cursor position.
  " ファイルの編集中に常に最後のカーソルポジションにファンプできるようにする。
  " Don't do it when the position is invalid or when inside an event handler
  " (happens when dropping a file on gvim).
  " Also don't do it when the mark is in the first line, that is the default
  " position when opening a file.
  autocmd BufReadPost *
    \ if line("'\"") > 1 && line("'\"") <= line("$") |
    \   exe "normal! g`\"" |
    \ endif

  augroup END

else

  set autoindent    " always set autoindenting on
                    " 常にオートインデントを ON にする。

endif " has("autocmd")

" Convenient command to see the difference between the current buffer and the
" file it was loaded from, thus the changes you made.
" 変更前と変更後の diff を確認する便利コマンド
" Only define it when not defined already.
" すでに定義されていない場合のみ定義する。
if !exists(":DiffOrig")
  command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
    \ | wincmd p | diffthis
endif
訳文は怪しいところがチラホラ。意味や動きがよくわかってない設定もチラホラ。
とりあえず設定を書いて読み込むと Vim がカラーついて便利になると思います。

僕は直接コレを ~/.vimrc には書きたくなかったので .vimrc.ex を用意して .vimrc から読み込むことにしました。
参考: Vim-users.jp - Hack #108: vimrc で外部ファイルを取り込む
構造は以下のとおりです。
.vimrc
.vim
└── .vimrc.ex
" 基本的な Vim の設定(必ず最初に読み込む)
if filereadable(expand('~/.vim/.vimrc.ex'))
  source ~/.vim/.vimrc.ex
endif

" 以下、その他の自分で追加した設定
使い方も覚えてちょっと便利になったので少しずつ改良していきたいです。

Mac OSX10.8でrbenvを使ってRuby1.9とRails4.0をインストールする

ついに僕も Ruby on Rails での開発デビューしてみることになったので
Ruby on Rails 環境構築のメモを残しておきます。

HomeBrew を使用するので MacPorts の人は読み替えてください。
また、僕は zsh を使っているので bash の人も読み替えてください。
HomeBrew や zsh をインストールしようという人は以下の事が参考になるかと思います。
MacにHomeBrewとzshを導入してみた | DevAchieve

rbenv と ruby-build のインストール

brew install rbenv

brew install ruby-build

vi .zshrc
# rbenv の初期化
eval "$(rbenv init -)"
source .zshrc
eval "$(rbenv init -)" で rbenv へのパスを通すのとコマンドの補完や引数の処理、rehash をしている。
echo "$(rbenv init -)" で処理内容を確認できる。

rehashとは、
rbenv -h で確認すると以下のように書かれている。
rehash: Rehash rbenv shims (run this after installing binaries)
gem とか入れたらやれってことでいいのだろうか。
gem を入れまくると重くなる?のか rehash が重くなることがあるらしい。
猫好きモバイルアプリケーション開発者記録 rbenv init が重い問題に対する対処法
gem を(アン)インストールしたら自動で rehash してくれる gem があるのでこれを入れておくと良いかも。
ryansouza/rbenv-rehash - github

依存パッケージのインストール

brew install readline

brew link readline

brew install openssl

brew link openssl

Ruby をインストールする

CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local" rbenv install 1.9.3-p194
CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local" rbenv install まで
入力して Tab で補完すればバージョンを指定できる。
とりあえず Ruby1.9 の最新版のパッチが当てられた(p の後の数字が大きい)バージョンをインストールした。
Ruby2.0 も候補に出たけど 2.0.0-dev しか表示されなかったのでインストールはやめておいた。
MacにRuby2.0とRails4をインストール - Qiita [キータ]

rehash して使用するバージョンを指定する

rbenv rehash
rbenv global 1.9.3-p194

バージョンを確認する

rbenv version
1.9.3-p194 (set by /Users/wada/.rbenv/version)
ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.4.0]

Rails をインストールする

gem list -r --all rails
*** REMOTE GEMS ***

rails (4.0.0, 3.2.13, 3.2.12, 3.2.11, 3.2.10, 3.2.9, 3.2.8, 3.2.7, 3.2.6, 3.2.5, 3.2.4, 3.2.3, 3.2.2, 3.2.1, 3.2.0, 3.1.12, 3.1.11, 3.1.10, 3.1.9, 3.1.8, 3.1.7, 3.1.6, 3.1.5, 3.1.4, 3.1.3, 3.1.2, 3.1.1, 3.1.0, 3.0.20, 3.0.19, 3.0.18, 3.0.17, 3.0.16, 3.0.15, 3.0.14, 3.0.13, 3.0.12, 3.0.11, 3.0.10, 3.0.9, 3.0.8, 3.0.7, 3.0.6, 3.0.5, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 2.3.18, 2.3.17, 2.3.16, 2.3.15, 2.3.14, 2.3.12, 2.3.11, 2.3.10, 2.3.9, 2.3.8, 2.3.7, 2.3.6, 2.3.5, 2.3.4, 2.3.3, 2.3.2, 2.2.3, 2.2.2, 2.1.2, 2.1.1, 2.1.0, 2.0.5, 2.0.4, 2.0.2, 2.0.1, 2.0.0, 1.2.6, 1.2.5, 1.2.4, 1.2.3, 1.2.2, 1.2.1, 1.2.0, 1.1.6, 1.1.5, 1.1.4, 1.1.3, 1.1.2, 1.1.1, 1.1.0, 1.0.0, 0.14.4, 0.14.3, 0.14.2, 0.14.1, 0.13.1, 0.13.0, 0.12.1, 0.12.0, 0.11.1, 0.11.0, 0.10.1, 0.10.0, 0.9.5, 0.9.4.1, 0.9.4, 0.9.3, 0.9.2, 0.9.1, 0.9.0, 0.8.5, 0.8.0)

...etc
Rials のバージョンを確認する。他にも色々表示されたが省略。
最近、 Rails4.0 が公開された。
rbenv exec gem install rails
rbenv exec gem install rails -v 3.2.13 等でバージョンを指定してインストールできる。たぶん。
指定しないと最新の 4.0.0 がインストールされる。

インストールしたので rehash する

rbenv rehash

バージョンを確認する

rails -v
Rails 4.0.0

Rails プロジェクトを作成する

rails new proj
cd proj

開発を開始する

俺達の開発はまだまだこれからだ!

参考:
Ruby on Rails 3.2 を Mac OS X にインストールする手順をかなり丁寧に説明してみました - Rails 雑感 - Ruby on Rails with OIAX
【初心者向け】Mac OSX10.8(Mountain Lion)で Ruby on Railsを動かすための5ステップ « pplog.org
Rails開発環境の構築(rbenvでRuby導入からBundler、Rails導入まで) - Qiita [キータ]
MacにRubyをインストールする時のメモ - Qiita [キータ]

2013/07/07

[Android]古いスタイルのダイアログが出ない透明なActivityのテーマ

最近まで画面を表示しない透明な Activity は
@android:style/Theme.Translucent で良いと思っていました。
[Android]Activityを非表示にする | DevAchieve

ほとんどの場合それでも問題なかったのですが、
その透明 Activity からダイアログを表示した際に
Android 3.0以上なのに Holo テーマとかじゃなくて
Android 2.x 系のテーマのダイアログが表示されてしまいました。

ダイアログ自体のテーマに Holo とか設定すればいいだろうとか思ったけど
なぜかダイアログで setTheme するとダイアログの枠の外に背景がついたりしてダメでした。

そこで以下のように透明のテーマ自体を修正したら Android 3.0以上で Holo 系のダイアログが表示されました。
<style name="Theme.Transparent" parent="android:Theme.Light.NoTitleBar">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>
<style name="Theme.Transparent" parent="android:Theme.Holo.Light.NoActionBar">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>
参考: ネタ帳 A.B.C: いまどきの透明なActivityのつくり方
values-v11 と values-v14 と書かれているけど values-v11 と書けば API LEVEL 11 以上となるので
同じ物を values-v14 に用意する必要はないです。
参考: Providing Resources | Android Developers

2013/07/06

[Android]Google playでのアルファ版・ベータ版配布機能を使ってみた

Google I/O 2013 で発表された Google Play のアルファ・ベータ版配布機能について↓
Google I/O 2013 - What's new for Developers in Google Play - YouTube
公式ヘルプ: Beta-testing and staged rollouts - Android Developer ヘルプ
日本語のわかりやすい解説: Android - Google playでのベータ版配布機能について

特徴

公開範囲を Google グループまたは Google+ のコミュニティに限定できる機能で、
ユーザーにとって一般公開のアプリとほとんど変わらない感覚でインストールすることができる。
ユーザーに提供元不明アプリのインストール許可設定をして貰う必要がなく、
テスター登録のワンクリックだけでインストールできるようになるので双方にとって楽。

アルファ版・ベータ版とあるので、アルファ版で社内テストしてもらって
ベータ版で一部ユーザーに配布してユーザーテストとかできるのできっと色々捗る。
アルファ版・ベータ版ではアプリの評価ができないらしいので不本意に評価も下がることはないみたい。
評価ができない分、フィードバックを返せるようにしておいたほうがいいらしい。

注意点

基本的に普通のアプリ公開と変わらないので、
例えばアルファ版でアップした apk と同じバージョンコードの apk はアップできない。
アルファ版からベータ版にプロモートする必要がある。
バージョンコードを上げればベータ版に上げることができるかは不明。今度試したい。

ということで

DevCamera - Google Play の Android アプリをリリースしました。

撮影、連写、無音撮影、無音連写ができるカメラアプリです。
この機会にDevCameraテスターコミュニティ - Google+を作りました。
DevCamera は純粋な開発者の興味から色々な機能を実装してみようというカメラアプリです。
その色々な機能をテストしてもらいたくコミュニティをつくりました。
今回のリリースバージョンは初期状態で機能封印をかけていますが、
テストユーザーには全機能開放しようと思っています。
どうぞよろしくお願いします。

2013/07/02

[Android]View に border-bottom をつける

Android で作る View が HTML/CSS で書けたら楽なのにと思う @wada811 です。
今回は border-bottom を付けたいと思って適当に View で border と打つも
何も補完されなかった悲しみについて説明したいと思います。
まさかの Android には border をつける方法がないという現実がそこにはありました。

だからと言って画像を用意するのは面倒だし、何か方法はないかと探してみたところ
drawable を XML で定義する方法で border-bottom をつける方法がありました。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="rectangle" >
            <solid android:color="@color/borderColor" />
        </shape>
    </item>
    <item android:bottom="@dimen/borderWidth">
        <shape android:shape="rectangle" >
            <padding android:bottom="@dimen/borderPadding" />
            <solid android:color="@color/bgColor" />
        </shape>
    </item>
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="borderColor">#0099CC</color>
    <color name="bgColor">#E8E8E8</color>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="borderWidth">1dp</dimen>
    <dimen name="borderPadding">4dp</dimen>
</resources>
イメージ的には青い背景の上に borderWidth 分だけ上にずらした灰色の背景を重ねて表示するような感じ。
borderPadding で TextView とかに border-bottom を適用する際に文字とボーダーの間を調節できる。

2013/07/01

[Android]プログラムでTextViewのテキストスタイルを設定する

テキストを bold にする際に android:textStyle を使っていたけど
動的に変えたくなったので適当に setTextStyle とかメソッドを探してみたらなかった。

調べてみたら TextView#setTypeface(Typeface) で設定するみたい。
こんな感じ↓
textView.setTypeface(Typeface.DEFAULT_BOLD);