呼び出し元のActivityに戻ってみよう
前回新しいActivityを呼び出して違う画面に遷移することが出来る様になりましたが、呼び出し元のActivityへの戻り方が判らなかったので調べてみました。
呼び出したActivityはfinish()をコールする事で終了して、呼び出し元のActivityに戻る事が出来ます。
画面遷移的には戻るボタンを使っても呼び出し元のActivityに戻れるんですが、内部的にはfinish()と同じ動作になるんだろうかね?
別画面に遷移してみたい
アプリを作っていると、今の画面以外の物を表示したい時が出てきますよね。
Androidではそんな時にIntentを使って別Activityを呼び出す事で出来ます。
Intentの使い方はこんな感じ。
- Intentに遷移したいクラスを設定して作成する
- 受け渡したい値があればputExtra()を使う。
- startActivity()の引数にIntentを渡して、別Activity(class)へ遷移。
サンプルはこちら
/* Intent発行側 */ String nowPeak = "No Data"; Intent intent=new Intent(getApplicationContext(),BtnResult.class); intent.putExtra("nowPeak", nowPeak); startActivity(intent);
これでIntentを作成し別Activityへ遷移が出来、この別Activityで画面を表示する事で別画面への遷移が出来ます。
遷移側でデータを受け取って使いたい時はこんな感じ。
- getIntent()で作成したIntentを受け取る
- 受け取ったIntentが存在する場合はget〜Extra()を使って受け取る
- 今回は文字列を受け取るのでgetStringExtra()を使う
サンプルはこちら
/* Intent受取側 */ Intent intent = getIntent(); String str = ""; if(intent != null){ str = intent.getStringExtra("nowPeak"); }
これで画面遷移が出来る様になりました。
こんな風にIntentを使うのを明示的Intentと言うみたいです。
データ保存を出来るようにしたよ
前回東京電力の電気使用状況csvファイルを取得出来る様にしましたが、ボタンを押すたびにファイルを取得する様になっていました。
そこで「ファイルを取りに行った時間」と「その時の値」を保存して、一定時間はファイルを取得しないようにしてみました。
今回データを保存するのに使ったのは「プリファレンス」。
ファイル作ってそこに保存したり、SQLiteを使ったりしないといけないのかな〜とか思ってたけど、このプリファレンスを使うとメッチャ簡単!
データをキーIDと結びつけて保存出来て、読込も簡単なの。
でも、これ何処にデータ保存してるんだろうか?
ここら辺はもうちょっと勉強が必要かな。
サンプルはこんな感じ
SharedPreferences sf = getSharedPreferences("PeakGetTime",MODE_PRIVATE); /* ファイルを取得した時間を読込 */ long pgt = sf.getLong("time", 0); /* 前回取得時間よりも10分以上経過していれば取得する */ if((System.currentTimeMillis() - pgt) >= 1000 * 60 * 10){ /* csvを取得し解析 */ 〜 中略 〜 /* 取得時間と電力の値を保存 */ Editor editor = sf.edit(); editor.putLong("time", System.currentTimeMillis()); editor.putString("peak", nowPeak); /* 保存 */ editor.commit(); }else{ /* 保存データを読込み表示 */ String nowPeak = sf.getString("peak", "NoData"); Btn01.setText(nowPeak + "\n(Local data)"); }
これで10分はファイルを取得しないで保存したデータを表示出来る様になりました。
東京電力の電気使用状況csvファイルを取得してみたよ
Androidアプリで、今日公開された東京電力の電気使用状況csvファイルを取得してみました。
意外と簡単にファイル取得って出来るのね。
前回のボタンを押した時のイベントでcsvファイルを取得する様にしてあります。
ネットに接続させる方法はこちら
- URLを設定する
- 接続するためのオブジェクトを取得する
- データのGETを設定する
- 設定したURLへ接続を開始する
- データ取得後、接続を閉じる
サンプルはこんな感じ
public void onClick(View arg0) { if(arg0 == Btn01){ try{ String array[] = null; String nowPeak = "No Data"; /* データ取得 */ URL url = new URL("http://www.tepco.co.jp/forecast/html/images/juyo-j.csv"); HttpURLConnection http = (HttpURLConnection)url.openConnection(); http.setRequestMethod("GET"); http.connect(); /* データ読込 */ BufferedReader reader = new BufferedReader(new InputStreamReader(http.getInputStream())); /* 解析 */ while (true){ String line = reader.readLine(); if ( line == null ){ break; } if(line.indexOf(",") != -1){ array = line.split(","); if(!(line.substring(0,4)).equals("DATE")){ if(!array[2].equals("0")){ nowPeak = array[1] + "のピーク電力は" + array[2] + "万kW"; } } } } /* 文字列表示 */ Btn01.setText(nowPeak); /* 接続終了 */ http.disconnect(); reader.close(); /* エラー処理 */ }catch(Exception e){ Btn01.setText(e.toString()); } } }
ここでURLを指定して、ファイルに接続しに行くには
URL url = new URL("http://www.tepco.co.jp/forecast/html/images/juyo-j.csv");
HttpURLConnection http = (HttpURLConnection)url.openConnection();
http.setRequestMethod("GET");
http.connect();
続いてはデータを読み込むには
BufferedReader reader = new BufferedReader(new InputStreamReader(http.getInputStream()));
後、Manifestファイルにインターネットに接続するよ〜って宣言が必要です。
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
これでcsvファイルを読み込んで、最新の電力ピーク状況を取得出来ます。
ただし、これだとボタンを押す毎にファイルを取得しに行ってしまうのが問題ですね。
データを保存して、時間が経っていたらファイルを取得するように変更する必要があるかな。
ボタンをクリックしたときのアクションを設定しよう
前回ボタンの大きさをソース上で変更する所までを実装してみました。
続いては、そのボタンをクリックした時に何かしらの動作をさせてみましょう。
ボタンをクリックした時に動作をさせる方法はこちら
- クラスを規定している後ろのほうに「implements View.OnClickListener」を追加します。
- このままだとエラーが出るので、「onClick関数」を追加します。
- 方法は赤い×が出ている部分をクリックすると出てくる「実装されていないメソッドを追加」を選択する事で、ソースの中に「onClick関数」が追加されます。
- 続いて、ボタンをクリックするよって言うのを「setOnClickListener」を使ってボタンビューにセットします。
これでボタンを押した時に「onClick関数」が動くようになりました。
続いてはボタンが押された時の処理をonClick関数内に書いてみます。
「onClick関数」はクリックされたビューIDを引数に受け取るので、関数内でどのIDを受け取ったかを判別して処理を行いましょう。
方法はこちら
- 「onClick関数」の引数とイベントを設定したいボタンビューIDを比べます。
- IDが一致したら「setText」でボタンビューにテキストをセット。
ボタンは1つしかないのでIDを比べる必要はありませんが、今後ボタンが増えた時の事を考えてIDを比較する様にしてあります。
サンプルはこんな感じ
public class BtnTest extends Activity implements View.OnClickListener { private Button Btn01; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* タスクバー削除 */ this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); /* ステータスバー削除 */ getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); /* Windowサイズ取得 */ WindowManager windowmanager = (WindowManager)getSystemService(WINDOW_SERVICE); Display disp = windowmanager.getDefaultDisplay(); int width = disp.getWidth(); int height = disp.getHeight(); /* ボタンビューのIDを取得 */ Btn01 = (Button) findViewById(R.id.Btn01); Btn01.setText("fullxfull"); /* ボタンサイズの設定 */ Btn01.setWidth(width); Btn01.setHeight(height); /* ボタンビューにクリックイベントをセット */ Btn01.setOnClickListener(this); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub if(arg0 == Btn01){ Btn01.setText("Click"); } } }
これで、ボタンをクリックして処理を行える様になります。
ソースの中でビュー(ボタン)の大きさを変更する
まずはビューのひとつ、ボタンのサイズ変更を行うには
- layoutのxmlファイルに記載する時に、「android:layout_width」や「android:layout_heigh」を「wrap_content」にする
- setWidthやsetHeightでサイズを指定する。
勉強時にwrap_contentではなく、200dpなどの固定値で書いていた為、サイズが変わらずに何でだ?となりました。
また「fill_parent」で記載しても最大サイズとなる為、setWidthでサイズが変更出来ません。
サンプルはこんな感じ
public class BtnTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button Btn01; /* ボタンビューのIDを取得 */ Btn01 = (Button) findViewById(R.id.Btn01); /* テキスト設定 */ Btn01.setText("200x200"); /* ボタンサイズの設定 */ Btn01.setWidth(200); Btn01.setHeight(200); } }
findViewByIdでボタンビューのIDを取得し、そこに「setWidth」でサイズを記載する。
ソースでなくxmlファイルで設定するには「wrap_content」ではなく、200dpと書けばOK。
画面一杯にボタンを表示する方法
続いては、画面一杯にボタンを表示してみます。
画面一杯にボタンを表示するには
- タスクバーとステータスバーを表示しない
- 画面サイズを取得する
サンプルはこんな感じ
public class BtnTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* タスクバーを削除 */ this.requestWindowFeature(Window.FEATURE_NO_TITLE); /* ステータスバーを削除 */ getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); /* Windowサイズ取得 */ WindowManager windowmanager = (WindowManager)getSystemService(WINDOW_SERVICE); Display disp = windowmanager.getDefaultDisplay(); int width = disp.getWidth(); int height = disp.getHeight(); Button Btn01; /* ボタンビューのIDを取得 */ Btn01 = (Button) findViewById(R.id.Btn01); /* テキスト設定 */ Btn01.setText("fullxfull"); /* ボタンサイズの設定 */ Btn01.setWidth(width); Btn01.setHeight(height); } }
タスクバーを削除するには
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
ステータスバーを削除するには
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
画面のサイズを取得するには
WindowManager windowmanager = (WindowManager)getSystemService(WINDOW_SERVICE);
Display disp = windowmanager.getDefaultDisplay();
int width = disp.getWidth();
int height = disp.getHeight();
getWidthで画面横のサイズ、getHeightで画面縦のサイズを取得できる。