駆け出しエンジニアぱかぱかの成長記録

引くほど忘れっぽい駆け出しSEぱかぱかの備忘録です。

【Java Gold】入出力について復習①

こんばんは!金曜日の夜のぱかぱかです!

本日は免許の更新を理由に有休を取得しておりました😆

免許取得してから無事に5年経ったようで、ついにゴールド免許ゲットです🏅

これからも安全運転を心がけます🚗

 

免許更新は思いの外一瞬で終わったので、本屋さんに立ち寄り本を2冊購入しました。

 

1冊目は「良いコード/悪いコードで学ぶ設計入門」です。

とてもタメになるとプロジェクト内で話題になっていたこの本。

良い設計という視点がまだ全く持てておらず指摘を喰らうことも多いので、しっかり読んで今後に役立てたいと思います。

また今度ブログでも内容について取り上げたいですね。

 

 

2冊目は「たった2日でマスターできるiPhoneアプリ開発集中講座」というiOSアプリ開発の本です。

たった2日でマスターは流石に大袈裟だろうと思うのですが…

そんな夢のような話があるのでしょうか…😂

最近自主学習ではAndroidの方ばかり進めていたのですが、実務ではiOSも同じくらいの比率で触れる機会があるので流石に一通りさらっておいた方がいいかと思い始めました。

いろいろ手をつけるとどちらも中途半端になりそうで怖いのですが…

でもせっかくXcodeを入れたいがためにMacBookを奮発して購入したわけなので、iOSの方もぼちぼち手をつけていきたいですね!

 

 

本屋さんから帰ってきたら、今日はゆっくり腰を据えて勉強時間を取ることができましたよ。

最近平日も休日も忙しくてろくに勉強できていなかったので、良い時間となりました。

 

本日はJava Goldの復習シリーズで入出力についてまとめていきたいと思います。

自作AndroidアプリでWeb APIの連携を実装していた時に、InputStreamのレスポンスデータを取得する場面があり「お!全然覚えてない!笑」となったので復習していきます。

 

◆入出力用のパッケージ

入出力用のパッケージはバージョンアップに伴いライブラリが拡充し、現在は以下のようなパッケージが存在します。 

 

JavaI/O 

入出力の基本機能(JavaI/O)を提供 

java.ioパッケージに含まれる 

 

NIO 

追加機能(NewI/O)を提供 

基本データ方を格納するバッファや高機能な入出力チャネル、正規表現ライブラリなど 

java.nioパッケージに含まれる 

 

NIO.2 

ファイル自体の操作を充実させるための追加機能(NIO.2)を提供 

java.nio.file.Pathインターフェース、java.nio.file.Filesクラスなど 

 

◆Fileクラス 

ディスクに保存されているファイルやディレクトリをオブジェクトとして表現できます。

 

UNIXLinuxでパス名の表現が異なるため、Javaでは抽象パス名を導入しています。

これによりシステムに依存せずにパス名を表現できます。

 

パス名を入力するコンストラク 

コンストラクタ名 

説明 

File(String pathname) 

指定されたパス名文字列を抽象パス名に変換 

Fileオブジェクトを生成 

File(String parent, String child) 

親パス名文字列および子パス名文字列から 

Fileオブジェクトを生成 

File(File parent, String child) 

親抽象パス名及び子パス文字列から 
Fileオブジェクトを生成 

 

◆ストリーム 

ファイルへのデータ書き出し・読み込みなどデータ送受信を連続的に行うものをストリーム(データの流れ)といいます。

 

ストリームの抽象クラス 

大きく分けると4種類あります。

 

バイトストリーム 

(byte単位) 

キャラクタストリーム 

(char単位) 

出力ストリーム 

(データ書き出し) 

OutputStream 

Writer 

入力ストリーム 

(データ読み込み) 

InputStream 

Reader 

 

主なバイトストリーム 

クラス名 

説明 

FileInuputStream 

ファイルからbyte単位の読み込みを行うストリーム 

FileOutputStream 

ファイルからbyte単位の書き出しを行うストリーム 

DataInputStream 

基本データ型のデータを読み込めるストリーム 

DataOutputStream 

基本データ型のデータを書き出せるストリーム 

 

主なキャラクタストリーム 

クラス名 

説明 

FileReader 

ファイルからchar単位の読み込みを行うストリーム 

FileWriter 

ファイルからchar単位の書き出しを行うストリーム 

BufferedReader 

char単位で文字・配列・行をバッファリングしながら 

読み込むストリーム 

BufferedWriter 

char単位で文字・配列・行をバッファリングしながら 

書き出すストリーム 

 

FileInputStreamとFileOutputStream 

byte単位でファイルの入出力を行うストリームを生成します。

コンストラクタは引数にFileオブジェクトをとるものとファイル名をとるものがあります。 

 

FileInputStream(File file) 

FileInputStream(String name) 

 

read() 

入力ストリームからバイトデータを読み込む 

ファイルの終わりに達すると-1を返す 

close() 

ストリームを閉じる 

 

FileOutputStream(File file) 

FileOutputStream(String name) 

 

write(int b) 

引数で指定されたバイトデータをファイル出力ストリームに書き出す 

write(byte[] b) 

引数で指定されたバイト配列をファイル出力ストリームに書き出す 

close() 

ストリームを閉じる 

 

DataInputStreamとDataOutputStream 

基本データ型(int, float)、String型のデータを読み書きできるストリームです。

単体では使用できず、他のストリームと連結して使用する必要があります。

 

DataInputStream(InputStream in) 

 

readInt() 

4バイトの入力データを読み込む 

readUTF() 

UTF-8形式でエンコードされた文字列を読み込む 

 

DataOutputStream(OutputStream out) 

 

writeByte(int v) 

byte値を1バイト値として出力ストリームに書き出す 

writeInt(int v) 

Int値を4バイト値として出力ストリームに書き出す 

writeUTF(String str) 

引数で指定されたデータをUTF-8形式で出力ストリームに書き出す 

・close() 

ストリームを閉じる 

 

◆FileReaderとFileWriter 

char単位で読み書きを行い、文字コードは自動的に変換されます。

JavaプログラムからOSの文字コードを意識せず入出力できます。

 

FileReader(File file) 

FileReader(String fileName) 

 

read() 

入力ストリームから単一文字を読み込む 

ファイルの終わりに達すると-1を返す 

 

FileWriter(File file) 

FileWriter(String fileName) 

 

write(String str) 

引数で指定された文字列を書き出す 

・flush() 

目的の送信先にただちに文字を書き出す 

 

◆BufferedReaderとBufferedWriter 

文字列をブロック単位で読み書きするためのストリームを生成 

まとめて読み書きすることで入出力を効率よく行える 

 

BufferedReader(Reader in) 

BufferedReader(Reader in, int sz) 

 

引数で指定された入力ストリームからデータを読み込むためのオブジェクト作成 

第2引数で指定されたバッファサイズでバッファリングする 

 

read() 

入力ストリームから単一文字を読み込む 

ファイルの終わりに達すると-1を返す 

readLine() 

1行のテキストを読み込む 

1行の終わりは改行(¥n)か復帰(¥r)で認識 

終わりに達するとnullを返す 

mark(int readAheadLimit) 

ストリームの現在位置にマークを設定する 

引数にはマークを保持しながら読み込むことができる文字数上限を指定 

reset() 

ストリームをmark()によりマークされた位置にリセット 

skip(long n) 

引数で指定された文字数をスキップする 

 

 

BufferedWriter(Writer out) 

BufferedWriter(Writer out, int sz) 

 

引数で指定された入力ストリームからデータを書き出すためのオブジェクト作成 

第2引数で指定されたバッファサイズでバッファリングする 

 

write(String str) 

引数で指定された文字数をスキップする 

newLine() 

改行文字を書き出す 

flush() 

目的の書き出し先にただちに文字を書き出す

 

 

まだシリアライズやファイル操作についてもありますが、ちょっと長くなりそうなので今日はこれくらいにします。

また気が向いたら入出力第2弾をまとめたいと思います。

最後まで読んでくださりありがとうございました。

見たい鳥をDBに保存する

こんにちは!日曜朝のぱかぱかです!

平日は残業、土日は遊びに費やしてしまいなかなか勉強時間が取れていない昨今…

随分前に作成した自作アプリでDBとの連携を行う機能の記事が書けていなかったのですが、ついに筆を進めております。

これを片付けて今日も午後から遊びに出かけてきます😇

 

それでは見ていきましょう!

 

「鳥図鑑」から「見たい鳥DB」に登録したい

まずは今回やりたいことをお話しします。

現在作っている野鳥コレクションアプリに存在する画面は以下の通りです。

 

鳥図鑑:鳥の情報が羅列されている

見たい鳥リスト:鳥図鑑から登録した見たい鳥のリストを表示

発見した鳥リスト:鳥図鑑から登録した発見した鳥のリストを表示

 

これを踏まえ今回のゴールは以下の2つになります。

★鳥図鑑で「見たい鳥へ登録」を押した際にその情報をDBに保存する

見たい鳥リストはDBから情報を取得して表示する

 

相変わらず味気ないトップ画面

 

DBとの連携

Androidの端末内にデータを保存するにはプリファレンスやストレージなどいくつか方法がありますが、今回はOS内にあらかじめ備わっているSQLiteデータベースを使っていきます!

私は以前OSS-DB SilverというPostgre SQL🐘の資格を取得していたので、ぜひDBとして実際に使う練習をしてみたいと思っていたのですが、デフォルトがSQLiteということなのでこれを使うほかありませんね…

今後アプリ開発をやっていくとしたら、ずっとSQLiteとお付き合いすることになるのでしょう。

正直違いはあまりよく分かりませんが!笑

 

DBを利用する手順としては以下のようになります。

データベースヘルパークラスを作成しインスタンスを生成する。

②アクティビティでデータベースヘルパーオブジェクトからデータベース接続オブジェクトSQLiteDatabaseオブジェクト)を取得する。

③SQLiteDatabaseオブジェクトを使ってSQLを実行、結果を取得する。

 

それでは1つずつ進めていきます。

 

データベースヘルパークラスを作成しインスタンスを生成

まずはSQLiteOpenHelperクラスを継承してDatabaseHelperというクラスを作成します。

SQLiteOpenHelperクラスではonCreate()onUpgrade()の2つが抽象メソッドとして定義されているため実装する必要があります。

onCreate()はコンストラクタで指定したDB名のDBが存在しない時、つまり初期状態に1回だけ実行されます。

よって、そのonCreateメソッド内に以下のようなデータベース作成用SQL文字列を記述することで初期設定を行います。

今回はwantBirdという見たい鳥の名前と登録日を登録するテーブルを作成します。

※今回onUpgrade()については一旦空の実装としているため省略します。

 

override fun onCreate(db: SQLiteDatabase) {
val sb = StringBuilder()
sb.append("CREATE TABLE wantBird (")
sb.append("_id INTEGER PRIMARY KEY,")
sb.append("name TEXT,")
sb.append("date TEXT")
sb.append(");")
val sql = sb.toString()

//SQLの実行。
db.execSQL(sql)
}

 

②アクティビティでSQLiteDatabaseオブジェクトを取得

次に鳥図鑑画面のActivityでヘルパーオブジェクトを生成、解放する処理を記述します。

 

・オブジェクトの生成

ヘルパーオブジェクトはアクティビティの様々な処理で使われるため、あらかじめアクティビティのプロパティとして生成しておく必要があります。

private val _helper = DatabaseHelper(this@BirdListActivity)

 

・オブジェクトの解放

実行タイミングはアクティビティの終了時、すなわちonDestroy()が最適です。

override fun onDestroy() {
// ヘルパーオブジェクトの解放。
_helper.close()
super.onDestroy()
}

 

次に生成したヘルパーオブジェクトからデータベース接続オブジェクトを取得し、データ保存処理を記述します。

ただ、現在は鳥図鑑のリストをタップした際に以下のようなダイアログを表示するようにしています。

よってデータ保存処理はダイアログフラグメントの「登録」ボタン処理中に記述してあげます。

 

 

③SQLiteDatabaseオブジェクトを使ってSQLを実行

「登録」ボタン押下時に実行されるinsertWantBirdメソッドの処理が以下です。

取得したデータベース接続オブジェクトを使ってインサート文を実行します。

これによって、鳥図鑑から見たい鳥リストに鳥を登録できるようになりました。

 

private fun insertWantBird(_birdId: Int, _birdName: String, _registerDate: String ) {
// データベースヘルパーオブジェクト。
val _helper = DatabaseHelper(requireContext())
// データベースヘルパーオブジェクトからデータベース接続オブジェクトを取得。
val db = _helper.writableDatabase

// インサート用SQL文字列の用意。
val sqlInsert = "INSERT INTO wantBird (_id, name, date) VALUES (?, ?, ?)"
//SQL文字列を元にプリペアドステートメントを取得。
var stmt = db.compileStatement(sqlInsert)
// 変数のバインド。
stmt.bindLong(1, _birdId.toLong())
stmt.bindString(2, _birdName)
stmt.bindString(3, _registerDate)
// インサートSQLの実行。
stmt.executeInsert()
}

 

次は見たい鳥リストの表示です。

見たい鳥リストのアクティビティでは以下のようにDBからデータを取得する処理を記述します。

 

val cursor = db.query("wantBird", null, null, null, null, null, null)
lvBirds.adapter = SimpleCursorAdapter(
this@WantBirdList,
R.layout.want_bird_row,
cursor,
arrayOf("name", "date"),
intArrayOf(R.id.tvBirdNameRow, R.id.tvRegisterDateRow),
0
)
db.close()

 

その結果がこちらです。

見たい鳥リストに登録した鳥が表示されるようになりました。

 

App Inspectionの機能を使って実際のDBの状態を見てみると以下のようになっています。

しっかりと登録されていますね。

 

今日はこれにて終了とします。

また少しずつアプリらしくなってきて嬉しいです。

ここまで読んでくださりありがとうございました。

【Java Gold】JDBCについて復習

ご無沙汰しております!ぱかぱかです!

ゴールデンウィークはキャンプに行ったり帰省をしたり色々エンジョイしてしまい

明けてからもバタバタしていたらブログの更新が滞ってしまっていました…

いろんな人と会って話せて、なかなか充実した日々になりましたよ。

また気持ちを切り替えて頑張っていきます😆

 

仕事の方では先日、1年間のOJT明け報告会がありました。

もう働き始めて1年経ったんだなと思うと感慨深いです。

色々振り返ってみると、学べたこともたくさんあったのですが

その分忘れていることもたくさんあるな…と気づきました。

 

そのうちの1つがJava Goldの知識です。

せっかく勉強したのに、モバイルのプロジェクトに移ってから

Javaのことを結構忘れちゃってる…

 

でも、仕組みとしてはモバイルもJavaとやり方が似ていたりします。

というわけで、Androidの学習を進めがてらJavaの復習もしてみようと思います!

 

本日はJDBCについてまとめていきます。

 

JDBCとは 

JDBCとはJavaプログラムから様々なDBにアクセスするための 

共通インターフェース・クラスを提供する標準仕様 です。

JDBC APIを使用することでDB製品に依存しないプログラムを作成できます。

 

◆主なクラスとインターフェース 

JDBCを扱うにあたり使われるクラスやインターフェースには以下のようなものがあります。

そして、各インターフェースの実装クラスがJDBCドライバとして各ベンダから提供されています。

 

インターフェース名/クラス名 

説明 

java.sql.DriverManager 

DBのドライバを管理し、DBの接続を行う 

java.sql.DataSource 

サーバ側で管理されたデータソース(DB接続情報)を保持する 

このオブジェクトを経由してDB接続を行う 

java.sql.Connection 

特定のDBとの接続を表現する 

java.sql.PreparedStatement 

SQL文を表すオブジェクト 

任意でINパラメータの利用が可能 

java.sql.ResultSet 

DBの結果セットを表すオブジェクト 

 

JDBCアプリケーションの作成 

JDBCを扱うアプリケーションの作成手順を見ていきます。

 

java.sqlパッケージのインポート 

まずはデータにアクセスして処理する基本APIを提供している

java.sqlパッケージをインポートします。

 

import java.sql.*; 

 

②DBの指定 

JDBC URLを文字列で準備します。

URLは以下のような構文で指定します。

jdbc:<subprotocol>:<subname> 

 <subprotocol> ドライバにより異なる 

 <subname> DB特定情報 ホスト名、ポート番号、DB名など 

 

Ex) jdbc:mysql://localhost:3306/golddb 

 

③DBとの接続 

DriverManagerクラスのgetConnection()メソッドを呼び出し 

Connectionオブジェクトを取得します。

取得できなかった場合はSQLExcepition発生します。

 

・getConnection(String url) 

 URLのみを引数にとる 

・getConnection(String url, String user, String password) 

 URL・ユーザ名・パスワードを引数にとる 

 

ステートメントの取得 

PrepareStatement()の引数にSQL文を指定し実行することで 

PreparedStatementオブジェクトを取得します。

 

SQL文の実行 

PreparedStatementインターフェースのメソッドを使用しSQL文を実行します。

PreparedStatementインターフェースには以下の3種類があります。

 

インターフェース名 

説明 

Statement 

標準的なSQL文を実行 

PreparedStatement 

プリコンパイルされたSQL文を実行 

CallableStatement 

ストアドプロシージャを実行 

 

ここではPreparedStatementについて見ていきます。

・PreparedStatement 

可変となるカラムの値をINパラメータ?で指定できる 

 

Ex) String sql = "SELECT dept_name FROM department " + 

                 "WHERE dept_code =  ?   OR  dept_code =  ?  "; 

 

PreparedStatement取得後、setXXX()で値を設定します。

第1引数にパラメータの位置(1から始まる)、第2引数に設定する値を渡します。

 

        PreparedStatement pstmt = con.prepareStatement(sql)) { 

        pstmt.setInt(1, 1); 

        pstmt.setInt(2, 3); 

 

SQL文の実行には以下のメソッドを使用します。

メソッド名 

説明 

executeQuery() 

検索のSQLクエリを実行 

ResultSetオブジェクトを返す 

結果の取得に1回はnext()を呼ぶ 

executeUpdate() 

更新のSQLクエリを実行 

DMLINSERT, UPDATE, DELETE)DDLを指定 

 

DML → 行数を返す 

DDL・更新なし → 0を返す 

execute() 

検索・更新いずれも実行可能 

実行結果がResultSet → true 
更新行数または結果がない場合 → false 

 

ResultSetを取り出すにはgetResultSet() 

更新行数を取り出すにはgetUpdateCount() 

 

        ResultSet rs = pstmt.executeQuery(); 

 

⑥結果の取得と処理 

ResultSetオブジェクトとして結果が返ります。

さらに取得した結果をもとに以下のように取得します。

 

・行へのアクセス 

next()により1行分ずつデータを取り込む 

次に行が存在する場合true、存在しない場合false 

ResultSet生成時はカーソルが先頭行の前にあるため 

必ず1回はnext()を実行する必要がある(しないとSQLException) 

 

・列へのアクセス 

getterで引数に列番号を指定しデータ取り出し 

getXXX(列名)またはgetXXX(列番号) 

 

        while(rs.next()){ 

          System.out.println("dept_name : " + rs.getString(1)); 

        } 

 

⑦接続のクローズ 

すべての処理が終了したらリソースを解放します。

PreparedStatement、ResultSetインターフェースはclose()で解放します。

try-with-resouces文を使えば省略が可能です。 

 

まとめていたらだいぶ頭が整理されました。

次回はAndroidのDB接続と比較して見てみたいですね。

ここまで読んでくださりありがとうございました。

歯医者に行った土曜日の日記

こんばんは!火曜深夜のぱかぱかです!

土曜の夜にDB連携に関する記事を書こうと思っていたのですが

その日の日記部分だけ書き上げて、肝心の内容を書ききれず…

 

今晩ようやくDBとの連携が成功し記事を書けるようになったのですが

書きかけの内容を消すのももったいないので一度あげることにしました笑

あまりまとまりもないですがお付き合いください😆

 

土曜日は大学院時代に研究室が一緒だった留学生2人と歯医者さんに行ってきました。

あまり自己紹介では触れていませんでしたが、私は生物系の研究を大学院の修士課程までやっておりました。

ITとは全く関係ない分野ですね…

今でも大学の近くに住んでいるので、研究室のメンバーとは交流があります。

仲良くしている留学生は1人がベトナム人、もう1人がタイ人。

ベトナムでは年1回歯医者でスケーリング(歯石取り)をするのが慣習のようで、春先に一緒に行くのが恒例になっています。

歯医者さんを予約する時「3人で予約したいのですが…」と言ったら流石に困惑していましたね笑

飲食店を予約する時のノリ笑

 

自分もせっかくなのでスケーリングしてもらったのですが、めちゃめちゃ染みる場所があって縮み上がりました…

虫歯かと思い焦りましたが、どうやら知覚過敏が悪化していた模様…

染みないようにするコーティングをしてもらいましたよ!

 

ベトナムの子の方はほとんど日本語がわからないので、スケーリング中は通訳的な感じで隣に座っていました。

しかし、英語を普段使わなさすぎて、前にも増して言葉が出てこない…
「椅子倒します」って訳してもらってもいいですか?

って歯科医師さんに言われたけど、意外とパッと思いつかず…

今考えたらput seat backで通じますね…😅

改めて力不足を実感した1日となりました…脱ルー大柴したい…🥹

 

そして夜ご飯は本格的なベトナム料理を食べに行きましたよ!

本場の料理との違いとかどういう食材が使われているとか、色々教えて貰いました。

フォーももちろんですが、後ろに映っている「チェー」というスイーツもとても美味しかったです!

日本では馴染みないですが、甘く煮た豆が使われたぜんざい的なスイーツです。

フォー!

流暢じゃなくても会話が楽しめればOKということにしよう🥹

言ってることは全然わかるんだけどな〜🧐

久しぶりに色々話せて、楽しい休日となりました!

 

明日(というか今日)は久しぶりに在宅勤務なので気が楽です!

業務後はゴルフの打ちっぱなしに行ってきたいと思います⛳️

それではここらへんで!

Androidアプリケーション技術者とるぞ!

こんにちは!土曜の朝のぱかぱかです!

昨日は仕事終わりに家帰って勉強しようと思ったけど

ご褒美に買ったポテチをバクバク食べて案の定寝てしまいました…

まあ金曜日なので良しとしましょう…

 

今日はいつものようなAndroidアプリ開発をちまちま進めていく記事とは打って変わり

資格に関するお話をしたいと思います!

 

タイトルにも書きましたが、「Androidアプリケーション技術者ベーシック

という資格を取得してみることにしました!

 

私は2022年4月から地方SIerに入社し、未経験からSEをやっている身なのですが

わからないことだらけで少しでも成長したくて

この1年間で勉強のために以下のような資格を取得してきました。

 

基本情報技術者

Java Silver

Java Gold

OSS-DB Silver

 

やっぱり資格という目標があると、学ぶべきことの指針が定まるので

何から手をつけていいかわからないという状況から

脱却することができるのが良いと思っています。

 

また学んだことが資格という形に残るので、周りからも評価されやすいですね😀
Java Goldを取得してから、会社の方からの目が明らかに変わったように思います。

資格を取っても実務に活かせなきゃ意味ないと思うので

ただただ恐縮な気持ちしかないのですが…

 

そして何より、私の今いる会社では受験料の全額補助だけでなく

合格時の報奨金というものが支給されるので、小遣い稼ぎにもなるのです笑💰

先輩から資格副業と言われてしまいました…笑

 

というわけで継続的に何かしらの資格勉強を続けてきた1年でしたが

今年の2月にOSS-DB Silverを取得してから次の目標が定まっていませんでした。

年始からアプリ開発のプロジェクトに異動になったので

その勉強であっぷあっぷしていたというのもあり…

 

しかしつい先日、プロジェクトの先輩が

Androidアプリケーション技術者ベーシックに合格したので参考書を売ります」

という話をモバイル開発のメンバーに持ちかけてくれました。

 

正直この資格、2012年に作られてから

内容のアップデートがされていない化石のような資格です。

これを受けるくらいならSwiftの資格を受けた方がいいかななんて思っていました…

しかし、参考書をいざ開いてみるとAndroid開発に関わる知識について

網羅的にまとまっており、初心者の自分にはちょうどいいのでは?と思い始めました。

 

思い立ったが吉日、早速その先輩に参考書の値段交渉です!

その先輩はなかなかの商売人なので、なるべく高値で売りつけようとしてきます…笑

こちらは押しに弱いので負けそうになりましたが

周りの先輩が「タダで譲るの普通じゃないですか?」「守銭奴!」

などというありがたい横槍を!

結果、定価3800円の本を1000円でゲットすることができました!笑

 

手に入れたのはこちらの参考書です。

 

その先輩は3冊もこの資格に関わる参考書を保有していたのですが

そのうち一番おすすめと言っていたのがこちらでした。

 

読んでみると言語が全てJava前提だったり、

Eclipseで開発を行っていたりと時代を感じる…

しかし、Androidアプリ開発の根っこの思想は変わっていないと思うので

こちらをひとまず活用して勉強していきたいと思います!

 

私の会社は報奨金の金額が資格のレベルの応じて定まっているのですが

この資格はなぜかS~DまであるうちのBランクに属しています。

応用情報よりも上、Java Goldと同じランクです。

内容をチラ見した感じ、そのランク設定は本当にそれは妥当なのか?

そんなに難しいのか?とも思ってしまいます…

アプリ開発をやっているメンバーからも、あの資格は穴場と陰で噂されていました。

制度が改定されこの資格のランクが下がってしまう前に

合格して一儲けしたいと思います💰

 

ではまた!

コンテキストメニュー

こんばんは!

仕事終わりでモスバーガーに来ているぱかぱかです!

(もはやお決まりなのでハンバーガーの写真は割愛)

 

例のごとく今日も日記パートから始まります。

昨日は仕事終わりにRRRというインド映画を観てきました!

映画好きの会社の先輩が6回も(!?)見に行ったと言っていたので

気になっていたのですが、想像以上に面白かったです。

インド映画自体が初めてだったのですが、

王道できっと何事もうまくいくのだろうという謎の安心感と

主人公二人の真っ直ぐで熱い生き様が逆に新鮮…!

普通に元気出ましたし、観終わるとなんかスッキリしました。

ミュージカルがちょっと苦手なのですが

インド映画特有の突然始まるダンスもキレキレで楽しくて見入っちゃいましたね…
(今日は仕事中ずっと頭の中ナートゥナトゥナトゥでした)

今度、他のインド映画も観てみたいと思います😳

 

 

それでは今日はコンテキストメニューについてまとめていきます!

 

コンテキストメニューって何?

コンテキストメニューはリストビューを長押しした時などに表示されるメニューです。

前回作成したオーバーフローメニューと似ていて、作り方もほとんど一緒です。

長押しすると出てくる

それでは早速作っていきましょう!

 

①メニュー用のxmlファイルを用意

オプションメニューと同じように、まずはxmlファイルを作ります。

メニュー用のxmlファイルはmenuタグで始まり

この中に選択肢1つにつきitemタグを1つ記述というのも同じです。


<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/regist_watch_list"
android:title="@string/register_watch_bird" />
<item
android:id="@+id/delete_want_list"
android:title="@string/delete_want_bird" />
</menu>

今回は見たい鳥リストの鳥を長押しした時に

「発見した鳥に登録」と「見たい鳥リストから削除」の

2つのメニューを選択肢を作ることにしました。
(仕様を考えず思いつきで進めているので後で大変なことになりそう…)

 

itemタグには以下の2つの属性を記述する必要があります。

・id

 R値として使用するid

android:title

 選択肢の表示文字列

オーバーフローメニューにあったshowAsActionは今回ありません。

 

②アクティビティでxmlファイルをインフレイト

xmlの画面部品をJavaオブジェクトにするインフレイトです。

これもオーバーフローメニューと同じになります。

アクティビティクラスにonCreateContextMenu()メソッドを記述して

その中でインフレイトしてあげます。

ヘッダタイトルも追加できるので「操作を選んでください。」という文言を設定。

override fun onCreateContextMenu(menu: ContextMenu, view: View, menuInfo: ContextMenu.ContextMenuInfo) {
// 親クラスの同名メソッド呼び出し。
super.onCreateContextMenu(menu, view, menuInfo)
// コンテキストメニューxmlファイルをインフレイト。
menuInflater.inflate(R.menu.menu_context_menu_list, menu)
// コンテキストメニューのヘッダタイトルを設定。
menu.setHeaderTitle(R.string.menu_list_context_header)
}

 

コンテキストメニューを表示する画面部品を登録

onCreate()メソッドの中で以下のメソッドを記述することで

コンテキストメニューを表示するビューを登録してあげます。

registerForContextMenu(lvBirds)

 

コンテキストメニュー選択時の処理を実装

ここで「発見した鳥に登録」と「見たい鳥リストから削除」の

2つの処理を実装してあげたいところなのですが

今は配列をコードでベタ打ちしている状態なので

DBの連携ができてから実装することにしたいと思います😅

 

というわけで本日の成果は

長押しでコンテキストメニューが表示されるとこまでです!

早く選択肢の処理を実装したい…

 

読んでくださりありがとうございました!

ではまた!

オーバーフローメニュー

こんばんは!仕事終わりのぱかぱかです!

今日も家に帰るとだダラけそうだったのでモスバーガーに来てしまいました笑

近所にあるし空いていて長居しても咎められない雰囲気なのでよく来てしまいます…

本日はスパイシーモスバーガーを注文!

スパイシーモス

あんまりお腹いっぱいにはならないので、帰ってまた食べてしまいそう…笑

 

本日はオーバーフローメニューについてまとめていきたいと思います!

 

オーバーフローメニューって何?

オーバーフローメニューはオプションメニューの一種です。

オプションメニューとは画面上部のアクションバーに表示されるメニューのこと。

タップするとさらに選択肢が表示される以下のようなメニューのことを言います。

タップすると出てくる

それでは早速作っていきましょう。

 

①メニュー用のxmlファイルを用意

メニュー用のxmlファイルはmenuタグで始まり

この中に選択肢1つにつきitemタグを1つ記述します。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/watchBirdAllList"
app:showAsAction="never"
android:title="@string/watch_bird_all_list" />
<item
android:id="@+id/watchBirdFavoriteList"
app:showAsAction="never"
android:title="@string/watch_bird_favorite_list" />
</menu>

今回はひとまず「すべての鳥」と「お気に入りの鳥」で

選択肢を2つ作ることにしました。

 

itemタグには以下の3つの属性を記述する必要があります。

・id

 R値として使用するid

・app:showAsAction

 選択肢をアクションバーに表示させるかの設定

 以下の3つの属性値がある

 ・never:選択肢をオーバーフローメニューに格納。

 ・always:常にアクションバーに表示

 ・ifRoom:余裕がある場合は表示

android:title

 選択肢の表示文字列

 

今回はneverを設定し選択肢をオーバーフローメニューに格納します。

ちなみにalwaysを選択すると以下のようになるみたいですよ。

ちょっと邪魔くさそう

 

②アクティビティでxmlファイルをインフレイト

まずインフレイトって何?って感じなのですが

inflateは膨らませるという意味で

Androidではxmlの画面部品をJavaオブジェクトにすることをこう言うみたいです。

メニューを表示させるにはアクティビティクラスにonCreateOptionMenu()メソッドを

記述して、その中でインフレイトしてあげる必要があります。

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
// オプションメニュー用xmlをインフレイト。
menuInflater.inflate(R.menu.menu_options_list, menu)
return true
}

メニューのインフレイトを行うクラスはMenuInflaterがあります。

アクティビティはMenuInflaterインスタンス

menuInflaterプロパティとして保持しているので

上記のようにインフレイトできます。

この内容はオプションメニューを表示するときの定型文のようなものみたいです。

 

③オプションメニュー選択時処理の実装

選択したメニューによって違う画面が表示されるように処理を記述します。

今回は戻るメニューを押したときの表示もついでに実装してます。

override fun onOptionsItemSelected(item: MenuItem): Boolean{
var returnVal = true
when(item.itemId) {
R.id.watchBirdAllList ->
// すべての鳥リストデータの生成。
_birdList = createWatchBirdList()
R.id.watchBirdFavoriteList ->
// すべての鳥リストデータの生成。
_birdList = createWatchBirdFavoriteList()
android.R.id.home ->
                   // 戻るボタンタップ時。
finish()
else ->
returnVal = super.onOptionsItemSelected(item)
}
val lvBirdList = findViewById<ListView>(R.id.lvWatchBirdList)
// SimpleAdapterを選択されたメニューデータで生成。
val adapter = SimpleAdapter(this@WatchBirdListActivity, _birdList, R.layout.row, _from, _to)
// アダプタの登録。
lvBirdList.adapter = adapter
return returnVal
}

 

そして完成した後の画面遷移イメージはこんな感じです!

メニューを押したら切り替わる

またさらにアプリらしくなってきました!

 

それでは今日はこの辺にします。

読んでいただきありがとうございました!