10 April 2014

(Android) ボタン押下イベントの実装方法5種

ボタン押下イベントの実装、5通りの方法。GoogleのAndroid SDKのサンプルプログラムでは、この記事の「例2」の実装方法が最も多いようだ。

20140410-button-test.jpg

例1: XMLで画面定義・イベントリスナ関数を指定、ボタン毎にリスナ関数を定義する場合

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <Button
        android:id="@+id/button_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClickButton1"
        android:text="Button 1"
        android:width="@dimen/dialog_fixed_width_major" />
 
    <Button
        android:id="@+id/button_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClickButton2"
        android:layout_below="@+id/button_1"
        android:text="Button 2"
        android:width="@dimen/dialog_fixed_width_major" />
 
    <Button
        android:id="@+id/button_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClickButton3"
        android:layout_below="@+id/button_2"
        android:text="Button 3"
        android:width="@dimen/dialog_fixed_width_major" />
    
</RelativeLayout>
MainActivity.java
package com.example.android_widget_create_test_2;
 
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
 
import android.widget.Toast;
 
public class MainActivity extends ActionBarActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
 
    // Button 1
    public void onClickButton1(View v) {
        Toast.makeText(MainActivity.this, "Button 1が押されました", Toast.LENGTH_LONG).show();
    }
 
    // Button 2
    public void onClickButton2(View v) {
        Toast.makeText(MainActivity.this, "Button 2が押されました", Toast.LENGTH_LONG).show();
    }
 
    // Button 3
    public void onClickButton3(View v) {
        Toast.makeText(MainActivity.this, "Button 3が押されました", Toast.LENGTH_LONG).show();
    }
}

例2: XMLで画面定義、onCreateでイベントリスナ関数を指定、ボタン毎にリスナ関数を定義する場合

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <Button
        android:id="@+id/button_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button 1"
        android:width="@dimen/dialog_fixed_width_major" />
 
    <Button
        android:id="@+id/button_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button_1"
        android:text="Button 2"
        android:width="@dimen/dialog_fixed_width_major" />
 
    <Button
        android:id="@+id/button_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button_2"
        android:text="Button 3"
        android:width="@dimen/dialog_fixed_width_major" />
    
</RelativeLayout>
MainActivity.java
package com.example.android_widget_create_test_2;
 
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
 
import android.widget.Toast;
import android.widget.Button;
import android.view.View.OnClickListener;
 
public class MainActivity extends ActionBarActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // ボタン押下イベントリスナーの登録
        Button button = (Button)findViewById(R.id.button_1);
        button.setOnClickListener(mButton1Listener);
 
        button = (Button)findViewById(R.id.button_2);
        button.setOnClickListener(mButton2Listener);
 
        button = (Button)findViewById(R.id.button_3);
        button.setOnClickListener(mButton3Listener);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
 
    // Button 1
    private OnClickListener mButton1Listener = new OnClickListener() {
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "Button 1が押されました", Toast.LENGTH_LONG).show();
        }
    };
 
    // Button 2
    private OnClickListener mButton2Listener = new OnClickListener() {
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "Button 2が押されました", Toast.LENGTH_LONG).show();
        }
    };
 
    // Button 3
    private OnClickListener mButton3Listener = new OnClickListener() {
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "Button 3が押されました", Toast.LENGTH_LONG).show();
        }
    };
}

例3: 上の例でイベントリスナ関数を1個にまとめると

onClickの引数より、呼び出し元のボタンのリソースIDを得て、どのボタンから呼び出されたのかを判別している。

MainActivity.java
public class MainActivity extends ActionBarActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // ボタン押下イベントリスナーの登録
        Button button = (Button)findViewById(R.id.button_1);
        button.setOnClickListener(mButtonListener);
 
        button = (Button)findViewById(R.id.button_2);
        button.setOnClickListener(mButtonListener);
 
        button = (Button)findViewById(R.id.button_3);
        button.setOnClickListener(mButtonListener);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
 
    // Button 1〜3
    private OnClickListener mButtonListener = new OnClickListener() {
        public void onClick(View v) {
            switch(v.getId()){
            case R.id.button_1:
                Toast.makeText(MainActivity.this, "Button 1が押されました", Toast.LENGTH_LONG).show();
                break;
            case R.id.button_2:
                Toast.makeText(MainActivity.this, "Button 2が押されました", Toast.LENGTH_LONG).show();
                break;
            case R.id.button_3:
                Toast.makeText(MainActivity.this, "Button 3が押されました", Toast.LENGTH_LONG).show();
                break;
            }
        }
    };
}

例4: 上の例を、さらにイベントリスナーをクラス自身にまとめてしまうと…

MainActivity.java
public class MainActivity extends ActionBarActivity implements OnClickListener {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // ボタン押下イベントリスナーの登録
        Button button = (Button)findViewById(R.id.button_1);
        button.setOnClickListener(this);
 
        button = (Button)findViewById(R.id.button_2);
        button.setOnClickListener(this);
 
        button = (Button)findViewById(R.id.button_3);
        button.setOnClickListener(this);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
 
    // Button 1〜3
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.button_1:
            Toast.makeText(MainActivity.this, "Button 1が押されました", Toast.LENGTH_LONG).show();
            break;
        case R.id.button_2:
            Toast.makeText(MainActivity.this, "Button 2が押されました", Toast.LENGTH_LONG).show();
            break;
        case R.id.button_3:
            Toast.makeText(MainActivity.this, "Button 3が押されました", Toast.LENGTH_LONG).show();
            break;
        }
    }
}

例5: XMLを用いずに、onCreate内でボタンを定義する場合

リソースIDを手動で割りつけて、onClick関数内で呼ばれたボタンを判別するのに用いている。

MainActivity.java
package com.example.android_widget_create_test_1;
 
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.os.Build;
 
import android.widget.Button;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.view.ViewGroup.LayoutParams;
import android.content.DialogInterface;
import android.widget.Toast;
 
public class MainActivity extends ActionBarActivity implements OnClickListener {
 
    // リソースIDの定義(setIDで用いる一意の正の値)
    private static final int id_button_1 = 1;
    private static final int id_button_2 = 2;
    private static final int id_button_3 = 3;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        setContentView(layout);
  
        Button button = new Button(this);
        button.setText("Button 1");
        button.setId(id_button_1);
        layout.addView(button);
        button.setOnClickListener(this);
 
        button = new Button(this);
        button.setText("Button 2");
        button.setId(id_button_2);
        layout.addView(button);
        button.setOnClickListener(this);
 
        button = new Button(this);
        button.setText("Button 3");
        button.setId(id_button_3);
        layout.addView(button);
        button.setOnClickListener(this);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
 
    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case id_button_1:
            Toast.makeText(MainActivity.this, "Button 1が押されました", Toast.LENGTH_LONG).show();
            break;
        case id_button_2:
            Toast.makeText(MainActivity.this, "Button 2が押されました", Toast.LENGTH_LONG).show();
            break;
        case id_button_3:
            Toast.makeText(MainActivity.this, "Button 3が押されました", Toast.LENGTH_LONG).show();
            break;
        }
    }
}