読者です 読者をやめる 読者になる 読者になる

アニマネ開発日誌

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

iOS開発者が作る、初めてのAndroidアプリ (イベント・画面遷移編)

Android Java アプリ開発

前回まででAndroid開発の流れはある程度分かったので、さらに進めます。

過去のエントリーはこちら。

animane.hatenablog.com

animane.hatenablog.com

今回はイベントと画面遷移の取り扱いを学びます。

イベント処理

AndroidでもiOS同様にViewに対してイベントの設定が可能です。

Javaの構文はまだ全く勉強できてないけど、ラムダっぽい感じできるようです。 クラスを継承してる感じなのかな?
基本的なJavaの書き方はもう少し勉強が必要になりそう。

view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //hogehoge
    }
});

実際に使う場合、XcodeだとIBOutletで紐付けることが多かったけど、Androidの場合はリソースのオブジェクトから参照します。

findViewById()で子ビューのIDからViewを取得してイベントをセットする感じです。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_main, container, false);
    view.findViewById(R.id.textView).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //hogehoge
        }
    });
    return view;
}

iOS同様、Viewには内部的にidが割り当てられていますので、「R.id.textView」という形で参照できます。

「textView」はレイアウトXMLの「android:id」属性で指定した文字列が参照されます。

<!-- fragment_main.xml  -->
<TextView android:text="Hello World!" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />

個人的にはXcodeのようにIBOutletで繋ぐのが面倒だったので、この仕組は中々よさそうなのですが、Viewの部品が増えた時の管理が面倒そう。

idの重複に関してはエディタがチェックしてくれるのでいいとして、名前空間は欲しい。

android:id="@+id/main/textView"」みたいな感じはできないみたいなので、何か他にいい方法ないのかな?
この辺りはもうちょっと調べる必要がありそう。

あと、イベントのバブリングなど、詳しい構造はまだ調べてないので、必要になった時に調べるとします。

画面遷移

画面遷移は調べた感じだとXcodeのsegue的なものはなく、コードで制御するみたいです。 Intentというオブジェクトに遷移元のオブジェクトと、新しく生成するActivityのクラスを渡してあげることで遷移可能です。

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);

Fragmentから遷移する時はFragmentをIntentに渡せないため、親にあたるActivityを渡す必要ある。

調べた限りでは、onAttach()で渡ってきたActivityをFragmentのプロパティに定義しておいてIntentに渡すみたい。

テキストがクリックされたら時に画面遷移する処理をコードにすると下記のような感じ。

/**
 * MainActivityFragment.java
 */
public class MainActivityFragment extends Fragment {

    public MainActivityFragment() {
    }

    private MainActivity parent;

    @Override
    public void onAttach(Activity activity) {
        parent = (MainActivity) activity;
        super.onAttach(activity);
    }

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

        view.findViewById(R.id.textView).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(parent, DetailActivity.class);
                startActivity(intent);
            }
        });
        return view;
    }

}

ちょっと冗長な感じが何とも言いがたい。
Fragmentから直接Activityを参照できるプロパティなりメソッドなりがありそうな気はするので、あとで調べてみる。

画面遷移時のアニメーション

ユーザーの操作によって、画面遷移することはできましたので、あとは遷移時のアニメーションです。

アニメーションに関してはXMLで定義を行い、ViewのoverridePendingTransitionに渡してやることで、 画面遷移時のアニメーションを定義できるようです。

furudate.hatenablog.com

上記がとても参考になりました。

XMLの定義は上記のエントリーが詳しいので、ここでは省きます。

プログラムとしてはstartActivityで呼び出したあとに、overridePendingTransitionを呼ぶだけです。 さっきのFragmentから遷移するコードだと下記のようになります。

Intent intent = new Intent(parent, DetailActivity.class);
startActivity(intent);
parent.overridePendingTransition(R.animator.slide_in_right, R.animator.slide_out_left);

複雑なアニメーションはプログラム的な制御が必須になると思いますが、簡単なアニメーションならXMLで定義できるのは使いやすそうです。

Androidの画面生成周りは軽くですが一通りは理解できたので、あとは試行錯誤しながらアプリ開発に励みたいと思います。