My Note Pad

Qiitaに書くほどでもない技術的なことや日々の雑感を書いていきます

Android開発のFragmentで嵌った

GW前に前々から読みたいと思ってAmazonの欲しいものリストに入れていたCode CompleteのKindle版が上下巻とも半額だったので衝動買いし、GW中は、Code Completeを読んでいました。

ec.nikkeibp.co.jp

ec.nikkeibp.co.jp

書評は既に多くの方が書いているので割愛。

今回はCode Completeを読み終えたので、過去に途中で辞めてしまった、Androidアプリ開発に再度挑戦してみました。
AndroidSwiftで開発できるようになるといった噂も出たりしていますが、果たしてどうなるのか。。

参考資料

今回はmixiさんが公開している、AndroidTrainingを利用させていただき、学習を進めています。

mixi-inc.github.io

※昔、別の入門書をやったことがありますが、結局作りたいアプリのイメージが沸かずに途中で止めてしまったため、あまり覚えていません・・

今回はトレーニング完了までに作りたいアプリのイメージを固めねば。。

1. アプリのレイアウト作成

このセクションは大きく嵌まる事もなく終了。
以下のレイアウトについて学べました。

  • LinerLayout
  • RelativeLayout
  • FrameLayout
  • ScrollView

Android Support Library 23.0からPercentRelativeLayoutPercentFrameLayoutというものが登場しているようなので、こちらも別途学習する必要がありそう。
また、マテリアルデザインについても別途学習が必要な気がします。

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メソッドに渡される引数のsavedInstanceStateBundle型なので、createInstanceメソッドで設定したhogeというパラメータがsavedInstanceStateから取得できるのかと思いきや、nullとなってしまいました。
色々調べた結果、以下のようにgetArgumentsBundlerを取得するように書き換えることでうまくいきました。

    // 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に実装してしまっていたりと・・色々ありましたが、今回はこんな感じです。

実習・課題形式なので、実際に入門書をそのまま写経するよりも身についているという実感があるのがいい感じです。