AttributeSet.getAttributeName

AttributeSet.getAttributeNameで、属性名を取得する。

AttributeSet  |  Android Developers

引数indexで指定したindex番目の属性名を取得。
独自の属性を追加して、それも取得できるようにする。

xmlns:appを追加し、"http://schemas.android.com/apk/res-auto"とする。
独自属性app:custom_dataを"ABCDE"にする。
ただし、

custom_dataとは何なのかということになる
custom_dataとは何なのかということになる

custom_dataとは何なのかということになる。
そこで、

Android XMLを追加
Android XMLを追加

Android XMLを追加。

attrs.xmlとする
attrs.xmlとする

attrs.xmlとする。

ここはそのまま
ここはそのまま

ここはそのまま。
attrs.xmlは、

こういう風に書く。
declare-styleableでCustomView。
属性名custom_dataで、フォーマットがstring。
CustomView.javaで、

attrs.getAttributeNameで、0番目から3番目までの属性名を取得し、ログ出力。

属性名は取得出来てる。(androidやappなどの名前空間は入らない。)
属性名は取得出来てる。(androidやappなどの名前空間は入らない。)

属性名は取得出来てる。(androidやappなどの名前空間は入らない。)

Sample/android/AttributeSet/getAttributeName/src/AttributeSet at master · bg1bgst333/Sample · GitHub

AttributeSet

AttributeSetは、Viewなどの属性情報を持つ。

AttributeSet  |  Android Developers

View(context, attrs)の項で、引数にAttributeSetのattrsが渡された。
これには、CustomViewのXMLで指定した属性情報が格納されている。
activity_main.xmlで、CustomViewには、

id, layout_width, layout_heightが指定されている。
CustomView.javaで、

attrs.getAttributeNameで、属性名を取得できるので、0番目から2番目までを取得し、出力してみた。

起動時
起動時

起動時は、こうなるが、

id, layout_width, layout_height
id, layout_width, layout_height

id, layout_width, layout_height、という属性名を取得出来てる。

Sample/android/AttributeSet/AttributeSet/src/AttributeSet at master · bg1bgst333/Sample · GitHub

Fragment.setArguments

Fragment.setArgumentsで、渡したい引数をセットする。

Fragment  |  Android Developers

ファクトリメソッドnewInstanceを定義し、

渡す引数をnewInstanceの引数にして、生成をこのようにまとめられる。

newInstanceをこのように呼び出せる。

newInstanceに来てる
newInstanceに来てる

newInstanceに来てる。

引数が渡されてる
引数が渡されてる

引数が渡されてる。

Sample/android/Fragment/setArguments/src/Fragment at master · bg1bgst333/Sample · GitHub

Fragment.getArguments

Fragmentにパラメータを渡すには、Fragment.setArgumentsを使い、そのパラメータを受け取るには、Fragment.getArgumentsを使う。

Fragment  |  Android Developers

MainActivity.javaで、

Bundleを使ってキーと値を登録し、そのBundleをsetArgumentsに渡す。
Fragment1.javaは、

getArgumentsでBundleを取得。
getStringにキーを与えると、値を取り出せる。
onCreateじゃなくてもいいが、ダメなところもあるらしい。

Buttonを押して、Fragmentを追加した時
Buttonを押して、Fragmentを追加した時

Buttonを押して、Fragmentを追加した時に、

valueに"ABCDE"が渡されてるのがわかる。
valueに"ABCDE"が渡されてるのがわかる。

valueに"ABCDE"が渡されてるのがわかる。

横回転での再生成
横回転での再生成

横回転での再生成でも、

再び渡されるようになっている
再び渡されるようになっている

再び渡されるようになっている。

Sample/android/Fragment/getArguments/src/Fragment at master · bg1bgst333/Sample · GitHub

Fragment.onViewStateRestored

API Level 17で、Fragment.onViewStateRestoredが追加された。

Fragment  |  Android Developers

ここでViewの状態を復元する。
作成時に、

17以上に
17以上に

17以上に。

こうすると、

ここから
ここから

ここから、

こうなった時
こうなった時

こうなった時、

onViewStateRestoredで復元
onViewStateRestoredで復元

onViewStateRestoredで復元。

Sample/android/Fragment/onViewStateRestored/src/Fragment at master · bg1bgst333/Sample · GitHub

Fragment.onViewCreated

API Level 13から、Fragment.onViewCreatedが追加された。

Fragment  |  Android Developers

LayoutInflater.inflateなどで生成し、onCreateViewで戻り値にするViewを返す前に、そこのViewをいじって初期化をすることもできたが、onCreateViewはinflateで生成したViewを返すだけにして、onViewCreatedで渡されたviewを初期化するほうが安全らしい。
違いは、FragmentのViewが、親となるActivityのViewと紐づいているかどうかである。
Fragment1.javaで、

view.getParentで、親Viewがあるか確認。

ここから
ここから

ここから、

回転させると
回転させると

回転させると、

onCreateViewだとviewParentはnullだが、onViewCreatedだとそうではない。
onCreateViewだとviewParentはnullだが、onViewCreatedだとそうではない。

onCreateViewだとviewParentはnullだが、onViewCreatedだとMainActivityにあるFrameLayoutを指している。

Sample/android/Fragment/onViewCreated/src/Fragment at master · bg1bgst333/Sample · GitHub

ViewParent

View.getParentの戻り値は、本来ViewParent。
LinearLayoutなどのViewGroupは、ViewParentインターフェースを実装している。
つまり自身が親となり、子Viewを持つことが出来る。

ViewParent  |  Android Developers

activity_main.xmlで、

今回は、2段にした。
MainActivity.javaで、

textview1の親がlayout_subで、さらにその親がlayout_mainかどうかを確認。

起動する
起動する

起動する。

layout_mainまで取得出来ている
layout_mainまで取得出来ている

layout_mainまで取得出来ている。

Sample/android/ViewParent/ViewParent/src/ViewParent at master · bg1bgst333/Sample · GitHub