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

Androidアプリ開発パーフェクトマスター - 2日目 - 前半

Chapter 7

続きから。
Genymotionのエミュレータが起動しなくなったので、一旦仮想端末設定を削除して作り直した。

  • Javaだけでレイアウトから処理までをすべてまかなう。activity_main.xmlを使わない方法。
package com.myexample.chapter7_4.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity implements View.OnClickListener {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout testLayout = new LinearLayout(this);
        testLayout.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        testLayout.setOrientation(LinearLayout.VERTICAL);
        setContentView(testLayout);

        textView = new TextView(this);
        textView.setText("");
        textView.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        testLayout.addView(textView);

        Button button = new Button(this);
        button.setText("Button");
        button.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        button.setOnClickListener(this);
        testLayout.addView(button);
    }

    @Override
    public void onClick(View view) {
        textView.setText("Button Pushed.");
    }
}
  • イベントリスナー専用のクラスをつくる
package com.myexample.chapter7_5.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout testLayout = new LinearLayout(this);
        testLayout.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        testLayout.setOrientation(LinearLayout.VERTICAL);
        setContentView(testLayout);

        textView = new TextView(this);
        textView.setText("");
        textView.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        testLayout.addView(textView);

        Button button = new Button(this);
        button.setText("Button");
        button.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        button.setOnClickListener(new MyCls());
        testLayout.addView(button);
    }

    class MyCls implements View.OnClickListener {

        @Override
        public void onClick(View view) {
            textView.setText("Button Pushed.");
        }
    }
}
  • 複数のイベントを処理する
package com.myexample.chapter7_6.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);

        ((Button) findViewById(R.id.button)).setOnTouchListener(
            new View.OnTouchListener() {

                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                        textView.setText("Button Pushed.");
                    } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                        textView.setText("Button Released.");
                    }

                    return true;
                }
            }
        );
    }
}
  • Chapter 7 で学んだイベント処理で一番よいのは?
    • ビューにイベントリスナーを直接登録するのが基本
    • MainActivityにOnClickListenerを実装するのは、ボタンがいっぱいある場合など、イベントをまとめて受け取ってそれから処理を専用メソッドに振り分ける場合
    • イベントリスナー専用をクラスを作るのは、イベントリスナーのコードが長くて複雑な場合
    • レイアウトファイルにメソッド呼び出しを埋め込む方法はJavaソースから見れないのでわかりにくくなるのでおすすめしない
      • ケースバイケースかな

Chapter 8 ウィジェットを配置する

  • ウィジェットを配置するコツは、とりあえずGUIでポトペタやって、修正をXMLベースで
  • イベントリスナーを登録
package com.myexample.chapter8_1.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    private int i = 0;

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

        ((Button) findViewById(R.id.button)).setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    ((TextView) findViewById(R.id.textView)).setText(
                        String.format("%d 回目", ++i)
                    );
                }
            }
        );
    }
}
  • MainActivityに実装
package com.myexample.chapter8_1_2.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;


public class MainActivity extends ActionBarActivity implements View.OnClickListener{
    private int i;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((Button) findViewById(R.id.button)).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        ((TextView) findViewById(R.id.textView)).setText(
            String.format("%d 回目", ++i)
        );
    }
}
  • レイアウトをJavaソースで
package com.myexample.chapter8_1_3.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Button;


public class MainActivity extends ActionBarActivity {
    private TextView textView;
    private int i;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout testLayout = new LinearLayout(getApplication());
        testLayout.setLayoutParams(
            new LayoutParams(
                LayoutParams.MATCH_PARENT,
                LayoutParams.MATCH_PARENT
            )
        );
        testLayout.setOrientation(LinearLayout.VERTICAL);
        setContentView(testLayout);

        textView = new TextView(this);
        textView.setText("ボタンをタップした回数を数えます");
        textView.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        testLayout.addView(textView);

        Button button = new Button(this);
        button.setText("Button");
        button.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        button.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    textView.setText(String.format("%d 回目", ++i));
                }
            }
        );

        testLayout.addView(button);
    }
}
  • ロングクリック時のイベント処理
package com.myexample.chapter8_1_2_1.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

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

        ((Button) findViewById(R.id.button)).setOnLongClickListener(
            new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    ((TextView) findViewById(R.id.textView)).setText(
                        "ロングクリックイベントが発生しました"
                    );

                    return true;
                }
            }
        );
    }
}
  • ボタンにアニメーション
package com.myexample.chapter8_1_3_1.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.CycleInterpolator;
import android.view.animation.ScaleAnimation;
import android.widget.Button;

public class MainActivity extends ActionBarActivity {

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

        ((Button) findViewById(R.id.button)).setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    ScaleAnimation scale = new ScaleAnimation(
                        0.5f,
                        10.0f,
                        0.5f,
                        10.0f,
                        view.getWidth() / 2,
                        view.getHeight() / 2
                    );
                    scale.setDuration(1000);
                    scale.setInterpolator(new CycleInterpolator(0.5f));
                    view.startAnimation(scale);
                }
            }
        );
    }
}

タイマー機能でスクショ撮ってみた。
f:id:yossk:20141214131357j:plain