【Android】分かりやすいonClick()を使ったボタン押下検知方法


前書き


突然ですが、ユーザーからのクリックが必要ないアプリって存在しないですよね?

Androidアプリを作成するには、ユーザーからのクリックを検知する必要があります。


今回はこういった疑問を解決し、

AndroidアプリでのクリックイベントonClick()を、初心者向けに分かりやすく説明していきます。



1. ボタンにonClickListener()を設定 setOnClickListener()

2.クリックを検知 onClickListener()

3.具体的な処理実装 onClick()

これが、Androidアプリにおけるボタンクリックの大まかな流れです。


Androidアプリでは、ボタンにsetOnClickListener()しておくことによって、

ボタンがクリックされたことを、onClickListener()で検知して、

onClick()のイベントが呼び出されるようになります。

ボタンが押下された後の具体的な処理はonClick()内で実装していきます。

※これらはJavaで実装

では具体的なonClick()の実装方法を3パターン紹介します。

細かい処理は違いますが、大元である、

1. ボタンにonClickListener()を設定 setOnClickListener()

2.クリックを検知 onClickListener()

3.具体的な処理実装 onClick()

という流れは変わりません。


1.クラスでonClickListenerをimplementsする

ボタンを配置しているActivityやFragment のクラスで、

onClickListenerをimplementsする実装方法です。

onClickListenerをimplementsすると、

onClick()の実装をしないとエラーが起きます。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = findViewById(R.id.test_text);
        Button testButton = findViewById(R.id.test_button);
        testButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.test_button) {
            Log.d(TAG, "Test button pressed!");
            mTextView.setText("TestButtonのクリック検知!");
        }
    }
}

Point

・クラスの定義の際にimplements View.OnClickListenerを行う。

・onCreate()であらかじめレイアウトxmlで定義しているボタンに対してsetOnClickListener(this)を行う。

※ここの引数thisはクラス全体を表します。
クラス全体がonClickListenerを実装していることになるので、このような引数になります。

onClick()でボタンが押下されたときの処理の実装

引数のviewに、押下されたボタンViewの情報が詰まっています。
View .getId()をすることによって、どのボタンが押下されたかを識別できます。

今回とは別件になりますが、findViewById()はsetContentView()の後に行わないと、
Viewが用意されていないのにfindViewすることになるので、
nullが返ってしまうようになります。
findViewById()はsetContentView()の後に行うようにお気をつけください!

こちらのコードを実装し、ボタンを押下すると下の写真のような結果となります。


2.匿名クラスを作成する

onCreate()内で匿名クラスを定義する方法です。

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = findViewById(R.id.test_text);
        Button testButton = findViewById(R.id.test_button);
        testButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (v.getId() == R.id.test_button) {
                    Log.d(TAG, "Test button pressed!");
                    mTextView.setText("TestButtonのクリック検知!");
                }
            }
        });
    }
}

コード量が少なくシンプルな実装ができるので、

今回のようなonClick()内の処理がシンプルな時はおすすめです。

しかし、onClick()内で複雑な処理を行う時、そもそもボタンが多い時などは、

onCreate()というメソッド内で複雑な処理を書くことになるので、可読性を損ないます。

★長いですが、下記のコードがsetOnClickListenerの引数です。

new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.test_button) {
            Log.d(TAG, "Test button pressed!");
            mTextView.setText("TestButtonのクリック検知!");
        }
    }
}

こちらのコードを実装し、ボタンを押下した際も下の写真のような結果となります。


3.匿名クラスを変数として用意する

1と2の中間のような実装方法です。

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = findViewById(R.id.test_text);
        Button testButton = findViewById(R.id.test_button);
        testButton.setOnClickListener(onClickListener);
    }

    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.test_button) {
                Log.d(TAG, "Test button pressed!");
                mTextView.setText("TestButtonのクリック検知!");
            }
        }
    };

}

2.で解説した★部を、onClickListenerという名前の変数に格納した実装となります。

★長いですが、下記のコードがsetOnClickListenerの引数です。

処理が複雑になっても可読性が悪くならず、個人的に慣れているため、僕はこの書き方が一番好きです。笑

こちらのコードを実装し、ボタンを押下した際も下の写真のような結果となります。


4.複数ボタンの実装方法

個人的にお気に入りの3.の方法で、二つのボタンが設置されているときの

サンプルコードを記載します。

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = findViewById(R.id.test_text);
        Button testButtonPrimary = findViewById(R.id.test_button_primary);
        Button testButtonSecondary = findViewById(R.id.test_button_secondary);

        testButtonPrimary.setOnClickListener(onClickListener);
        testButtonSecondary.setOnClickListener(onClickListener);
    }

    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.test_button_primary) {
                Log.d(TAG, "Test button primary pressed!");
                mTextView.setText("TestButtonPrimaryのクリック検知!");
            } else if (v.getId() == R.id.test_button_secondary) {
                Log.d(TAG, "Test button secondary pressed!");
                mTextView.setText("TestButtonSecondaryのクリック検知!");
            } else {
                Log.e(TAG, "Unexpected view id.");
            }
        }
    };

}

onCreate()でButton1Button2それぞれにsetOnClickListener(onClickListener)

onClick()内で、引数viewから押下されたボタンのリソースIDを取得し、

クリックされたボタンを識別して各々の処理を実行する。

こちらのコードを実装し、ボタンを押下すると下の写真のような結果となります。



まとめ

AndroidのクリックイベントonClick()の実装方法は大体理解できましたでしょうか?

今回紹介した方法以外にも実装方法はありますが、原理は全て同じです。

1. ボタンにonClickListener()を設定 setOnClickListener()

2.クリックを検知 onClickListener()

3.具体的な処理実装 onClick()

適切な場面で適切な方法を選んで、初心者のうちから可読性の高いコーディングを意識していきましょう!

ご精読ありがとうございました!!

【Android】分かりやすいonClick()を使ったボタン押下検知方法」への1件のフィードバック

  1. ピンバック: 【Android中級者以上向け】ラムダ式でonClick()を実装する方法 | Memento Mori Blog

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です