Android開発のFragmentで嵌った
GW前に前々から読みたいと思ってAmazonの欲しいものリストに入れていたCode CompleteのKindle版が上下巻とも半額だったので衝動買いし、GW中は、Code Completeを読んでいました。
書評は既に多くの方が書いているので割愛。
今回はCode Completeを読み終えたので、過去に途中で辞めてしまった、Androidアプリ開発に再度挑戦してみました。
※AndroidがSwiftで開発できるようになるといった噂も出たりしていますが、果たしてどうなるのか。。
参考資料
今回はmixiさんが公開している、AndroidTrainingを利用させていただき、学習を進めています。
※昔、別の入門書をやったことがありますが、結局作りたいアプリのイメージが沸かずに途中で止めてしまったため、あまり覚えていません・・
今回はトレーニング完了までに作りたいアプリのイメージを固めねば。。
1. アプリのレイアウト作成
このセクションは大きく嵌まる事もなく終了。
以下のレイアウトについて学べました。
- LinerLayout
- RelativeLayout
- FrameLayout
- ScrollView
Android Support Library 23.0からPercentRelativeLayout
とPercentFrameLayout
というものが登場しているようなので、こちらも別途学習する必要がありそう。
また、マテリアルデザインについても別途学習が必要な気がします。
2.ActivityとFragment
ここの実習で結構ハマりました。
新しいActivityの実装は特に問題なく終了
新しいFragmentの実装部分で特に実習には書かれていなかったのですが、Bundle経由でパラメータを渡して表示してみようと思い、実装してみました。
↓最初の状態がこちら
public class Main3Fragment extends Fragment { public Main3Fragment() { // Required empty public constructor } public static Fragment createInstance(int hoge) { Fragment fragment = new Main3Fragment(); Bundle args = new Bundle(); args.putInt("hoge", hoge); fragment.setArguments(args); return fragment; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_main3, container, false); TextView hogeText = (TextView) view.findViewById(R.id.hoge); hogeText.setText(savedInstanceState.getInt("hoge")); return view; } }
onCreateView
メソッドに渡される引数のsavedInstanceState
がBundle
型なので、createInstance
メソッドで設定したhoge
というパラメータがsavedInstanceState
から取得できるのかと思いきや、null
となってしまいました。
色々調べた結果、以下のようにgetArguments
でBundler
を取得するように書き換えることでうまくいきました。
// onCreateViewメソッドだけ抜粋 @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_main3, container, false); Bundle arguments = getArguments(); TextView hogeText = (TextView) view.findViewById(R.id.hoge); int hoge = arguments.getInt("hoge"); hogeText.setText(String.valueOf(hoge)); return view; }
※呼び出し元のActivityはこんな感じ
public class Main3Activity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); if (savedInstanceState == null) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); // ここでMain3Fragmentのインスタンス生成とreplace transaction.replace(R.id.Main3FragmentContainer, Main3Fragment.createInstance(999)); transaction.addToBackStack("main3FragmentContainerReplace"); transaction.commit(); } } }
他にもonCreateView
ではなくonCreate
に実装してしまっていたりと・・色々ありましたが、今回はこんな感じです。
実習・課題形式なので、実際に入門書をそのまま写経するよりも身についているという実感があるのがいい感じです。