アニマネ開発日誌

アニメアプリのアニマネの開発日誌です。

iOS開発者が作る、初めてのAndroidアプリ (開発の基本編)

前回の続きです。

animane.hatenablog.com

前回はHellow Worldプロジェクトを作って実行するまでだったので、 今回はもう少し開発の流れをみたいと思います。

Androidの開発全体についてはmixiのテキストがよくまとまっていて、参考になりました。

github.com

Activity

早速みていきます。
まずはActivity

iOSでいうUIViewControllerのような感じです。

プロジェクトを作る時に選択したBlank Activityでは、最初に呼ばれるクラスがMainActivityなので、 ここから調べてみます。

// MainActivity.java
public class MainActivity extends ActionBarActivity

継承しているActionBarActivityというのは、iOSでいうUINavigationControllerみたいな感じのようです。

ActivityにもiOS同様にライフサイクルはありますが、UIViewControllerのようにViewの状態は管理しておらず、 画面の生成やバックグラウンドに入った時、フォアグラウンドに入った時、オブジェクトが破棄された時などだけを管理しているようです。

ライフサイクルだけみるとUIViewControllerというよりは、AppDelegateに近いかも。

クラスの内容をもう少し見てみる。

// MainActivity.java
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

onCreate()はライフサイクル上で一番最初に呼ばれるメソッドです。 ここで表示するビューをセットしているようです。 「R.layout.activity_main」はプロジェクト上のapp/res/layout/activity_main.xmlにあたります。

Androidではxmlや画像、音声などの静的なファイルをリソースとして扱っており、
変数R以下のオブジェクトとして参照できるようです。

続いてエディターでactivity_main.xmlを開くとXcodeのInterfaceBuilderのような画面になりますが、
ペイン下部に「Design」と「Text」があって、ここで切り替え可能です。

テキストにすると下記のようなファイルでした。

<!-- activity_main.xml -->
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fragment"
    android:name="com.studio_port.animane.MainActivityFragment" android:layout_width="match_parent"
    android:layout_height="match_parent" tools:layout="@layout/fragment_main" />

ここででてきたFragment。
activity_main.xmlを開くとGUIで色々設置できそうでしたが、 fragmentの中には追加ができないようなので、
次はFragmentを調べてみる。

Fragment

activity_main.xmlで定義された「fragment」要素の「android:name」属性が呼び出されるクラスで、
「tools:layout」属性が画面を定義したファイルを指しています。

まずはクラスから。

// MainActivityFragment.java
public class MainActivityFragment extends Fragment {

    public MainActivityFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_main, container, false);
    }
}

onCreateView()はビューを返しているので、UIViewControllerでいうloadView()と同等と思われます。 Viewのインスタンスを返しているので、iOSのviewWillLayoutSubviewsやviewDidLayoutSubviewsを兼ねている感じなのかな。

Fragmentのライフサイクルは冒頭で紹介したmixiのテキストが参考になるのでここでは詳しく説明しませんが、
UIViewControllerに近い感じのライフサイクルです。

次にFragmentのビューを見てみる。

<!-- fragment_main.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivityFragment">

    <TextView android:text="Hello World!" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

このファイルが実際のレイアウトを構築しています。 RelativeLayoutがiOSでいうAutoLayoutに近い感じのようで、相対的なビューの表示を指定できます。

ちょっと調べた限りでは、CSSに近い感じでプロパティの指定ができるようなので、iOSのAutoLayoutに比べると学習しやすそうです。

軽く触った感じでは思い通りにレイアウトが組めそうな感じでした。
このあたりはデバイスの種類が多いAndroidならではということでしょうか。

まとめ

ざっとですが、ActivityとFragmentを調べてみました。

ActivityはUIViewControllerのような役割で、
FragmentはiOSでいうxib、StoryboardならiOS9から使えるContainerViewの参照先をStoryboard Referencesで設定できるイメージです。

Viewを部品化した上で、それに対応するコントローラーを対にすることで、メンテナンスしやすいコードになります。

画面遷移はこれから学ぶ必要はありますが、取っ掛かりはつかめました。

続き。

animane.hatenablog.com