アプリの公開
アプリできました。
ストアに公開しました。
https://play.google.com/store/apps/details?id=xyz.wisdomapp.alcohol
今後やること
・多言語対応(これは簡単そう)
・逆引き機能(これがメイン)
・UIの改善(たぶんやらなそう)
アイコンとアプリ名の変更
アプリも大方出来上がったのでアイコンを初期設定のドロイド君から変更する。
resフォルダの下のmipmapフォルダの中に各解像度に合わせたドロイド君のpngファイルが入ってる。
これらを別途用意したアイコンのファイルに置き換えれば完了。
ファイルをそのままドラッグアンドドロップで置き換えられるらしいが何故かうまく行かなかったので、Cドライブのプロジェクトフォルダから無理やり置き換えた。
C>ユーザー>ユーザー名>AndroidStudioProjects>プロジェクト名>app>src>main>resにあった。
細い位置は人それぞれ違うかもしれない。
mipmap-(解像度)となっているフォルダの中身をそれぞれ用意したアイコンのpngファイルと置き換えたら終了。
注意として、置き換えたファイルの名前は、元々のファイル名と全く同じにすること。
異なるファイル名でもいいけどManifestファイルの記述を書き換えないといけないから面倒。
アプリ名の変更は、strings.xmlの記述を書き換えれば完了。
<string name="app_name">酔覚めチェッカー</string>
起動してみた。
ちゃんとオリジナルのアイコンに置き換わってアプリ名も変更されてる。
これでアプリはほぼ完成したので、アプリストアに登録してみようと思う。
現在時刻の取得と加算減算
日時時刻の取得にはCalendarクラスを使う。
使い方。
Calendar cale=Calendar.getInstance();
Calendarオブジェクトを作成して、日時時刻を取得。
SimpleDateFormat sdf1=new SimpleDateFormat("HH:mm");
表示形式を設定。
SimpleDateFormat sdf1=new SimpleDateFormat("H時mm分");
上記の場合、○時○○分と表示される。
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
上記なら2017/02/06 16:04:55みたいな感じ。
んで、取得した日時を加算・減算させたいときはaddメソッドを使う。
cale.add(Calendar.HOUR,3);
cale.add(Calendar.MINUTE,-3);
上は3時間加算した場合。
下は3分減算した場合。
変数も入れられる。
いざ表示。
((TextView)this.findViewById(R.id.textView)).setText(sdf1.format(cale.getTime()));
○○.format(○○.getTime())で設定した表示形式通りに表示させる。
addメソッドで加算・減算済なら加算・減算された時刻が表示される。
今回は、酔いが覚めるまでの時間を加算した時刻を表示させるようにしてみた。
実行するとこんな感じ。
数値の四捨五入や切り捨て切り上げ
数値を指定した桁数で四捨五入したり、切り上げ、切り捨てをしたい場合は、
java.math.BigDecimalクラスを使用する。
//元データ
double val = 42.195;
//元データをBigDecimal型にする
BigDecimal bd = new BigDecimal(val);
//四捨五入する
BigDecimal bd1 = bd.setScale(0, BigDecimal.ROUND_HALF_UP); //小数第1位
BigDecimal bd2 = bd.setScale(1, BigDecimal.ROUND_HALF_UP); //小数第2位
//切り捨てする
BigDecimal bd3 = bd.setScale(0, BigDecimal.ROUND_DOWN); //小数第1位
BigDecimal bd4 = bd.setScale(1, BigDecimal.ROUND_DOWN); //小数第2位
//切り上げする
BigDecimal bd5 = bd.setScale(0, BigDecimal.ROUND_UP); //小数第1位
BigDecimal bd6 = bd.setScale(1, BigDecimal.ROUND_UP); //小数第2位
//画面表示
System.out.println("四捨五入(小数第1位):" + bd1.doubleValue());
System.out.println("四捨五入(小数第2位):" + bd2.doubleValue());
System.out.println("切捨て(小数第1位):" + bd3.doubleValue());
System.out.println("切捨て(小数第2位):" + bd4.doubleValue());
System.out.println("切上げ(小数第1位):" + bd5.doubleValue());
System.out.println("切上げ(小数第2位):" + bd6.doubleValue());
intに変換したければintValue();を使う。
BigDecimal型のままでは扱えないので注意。
spinnerで選択した文字列の取得
getSelectedItem();を使えばできる。
final Spinner spinner=(Spinner)this.findViewById(R.id.spinner);
spinnerのIDを取得して、
String str=(String)spinner.getSelectedItem();
String型につっこめば終わり。
何故かOnItemSelectedListenerを使わないとできないと勘違いしていてまた一日潰した。
OnItemSelectedListeneはspinerを選択したときに有効になると学んだ。
Toastとか出したいときに使おう。
例外処理について (try,catch)
前回はIntentを使って別Activityに数値を送ることに成功した。
しかし、入力欄が空欄(null)の状態で計算開始を押すとアプリが落ちるバグが見つかったので今回は例外処理を使ってエラー表示を出すようにした。
例外処理よくわからんから敬遠してたがめっちゃ簡単だった。
使用するのはtryブロックとcatchブロック
使い方はこんな感じ
try {
//例外が発生しそうな処理
}
catch(例外クラスの型 変数名){
//例外が発生したときの処理
}
んで、tryブロックにどこまで入れればいいかわかんなかったから
計算開始ボタンのonClickメソッドの中身をぶちこんでみたら普通に動いた。
便利すぎる。
public void onClick(View view) {
EditText edit=(EditText)findViewById(R.id.editText);
try {
Editable getText = edit.getText();
int int_text = Integer.parseInt(getText.toString());
Intent intent = new Intent(MainActivity.this, Result.class);
intent.putExtra("DATA1",int_text);
startActivity(intent);
}
catch(Exception e){
TextView error=(TextView)findViewById(R.id.textView4);
error.setText("数字を入力してください!");
}
}
catchブロックには計算開始ボタンの上にエラーテキストを表示する処理を書いてみた。
実行するとこんな感じになった。
これでアプリが落ちなくなった。
とりあえずエラー出そうな処理は片っ端から例外処理作っといたほうがいいのかもしれない。
ちなみに文字色の変え方
android:textColor="#FFFFFF"
これをxmlのTextViewに追加。
16進数表記のRGBはググればでてくる。
EditTextから取得した値をIntentを使って別Activityに表示させるだけで丸一日かかった
知識0からと言いましたがアプリ作成自体は4日前くらいから始めてるので導入とかはないです。
とりあえず今の状況
作るもの・・・酔覚めチェッカー
仕様・・・体重、体質、アルコール度数と飲んだ量を入力すると呼気中のアルコール濃度と酔いから覚めるまでの時間を表示
進捗
UIはこんな感じ
計算開始を押すと別Activityで計算結果を表示するようにしたかった。
ひとまず体重を入力して計算開始を押したら入力した数値が別Activityに表示されるようにしてみたい。
なので、計算結果ボタンのonClickメソッドにこんな感じの記述を追加。
public void onClick(View view) {
EditText edit=(EditText)findViewById(R.id.editText);・・・①
Editable getText=edit.getText();・・・②
int int_text=Integer.parseInt(getText.toString());・・・③
Intent intent = new Intent(MainActivity.this, Result.class);・・・④
intent.putExtra("DATA1",int_text);・・・⑤
startActivity(intent);・・・⑥
}
① 体重EditTextのIDを取得
② 文字列を取得
③ 文字列を数値に変換
④ Intent作成
⑤ putExtraで数値を送る
⑥ Activity移動
書いた処理が果たして合ってるかは自信ないけど動くので問題なし。
なんでこれだけの作業に1日費やしたかというと、上の①②③を書く位置を間違えてました。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText edit=(EditText)findViewById(R.id.editText);・・・①
Editable getText=edit.getText();・・・②
int int_text=Integer.parseInt(getText.toString());・・・③
こんな感じでonCreateの下に書いてました。
コンパイルは正常にできるのが余計わかりにくい。
こういった処理はonClickの下に書こう!
ちなみに受け取り側
Intent intent=getIntent();・・・①
int data1=intent.getIntExtra("DATA1",0);・・・②
((TextView)this.findViewById(R.id.textView5)).setText(String.valueOf(data1));・・・③
①で呼び出して②で定義して③で文字列に変換してTextViewにぶちこむ。
②のdata1は数値なのでいろいろ弄れる。
これをアルコール度数と飲酒量の分も作って計算式に入れて結果を表示させれば完成なはず。
あと最初の入力時に空欄で計算開始押すとアプリが落ちるから例外処理が必要っぽい。
例外処理よくわかってないからやりたくないけど仕方ない。
終わり!