ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
Android Studio でボタンの処理を追加する4つの方法 : Android Studio 2.0
日時: 2016/05/10 15:09
名前: lightbox







Button クラスの setOnClickListener メソッドでイベントを登録する
package lightbox.april.android2test;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

	// メッセージ表示用
	private Toast toast;

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

		// ボタンのインスタンスを格納する変数を作成
		Button button;

		// ボタンのインスタンスを作成
		button = (Button) MainActivity.this.findViewById(R.id.button);

		// ボタンのインスタンスにイベントを登録
		button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				// logcat にメッセージを表示
				Log.i("lightbox", "ボタンが押されました");

				// トーストを表示
				toast.show();

			}
		});

		// トーストのインスタンスを作成
		toast = Toast.makeText(MainActivity.this, "ボタンが押されました", Toast.LENGTH_LONG);

	}

}

<?xml version="1.0" encoding="utf-8"?>
<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="lightbox.april.astudio2test.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"/>
</RelativeLayout>
メンテナンス

変数定義を省略した記述 ( No.1 )
日時: 2016/04/16 13:47
名前: lightbox


日時: 2016/04/16 13:47
名前: lightbox



package lightbox.april.android2test;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

		// ボタンのイベントを登録
		MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				// logcat にメッセージを表示
				Log.i("lightbox", "ボタンが押されました");

				// トーストを表示
				Toast.makeText(MainActivity.this, "ボタンが押されました", Toast.LENGTH_LONG).show();

			}
		});

	}

}
findViewById の戻り値が View であって、setOnClickListenerView のメソッドであるので、キャスト無しで続けて記述が可能です

 

このアーティクルの参照用URLをクリップボードにコピー メンテナンス
ボタンのプロパテイにメソッドを登録する ( No.2 )
日時: 2016/04/16 15:59
名前: lightbox
package lightbox.april.android2test;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

	}

	public void myButton(View view) {

		// logcat にメッセージを表示
		Log.i("lightbox", "ボタンが押されました");

		// トーストを表示
		Toast.makeText(MainActivity.this, "ボタンが押されました", Toast.LENGTH_LONG).show();

	}

}

myButton メソッドは、戻り値 void で、引数が View 型になります。タイプするより、CTRL + O で setContentView を @Override 無しで選択して setContentView を myButton に変更すると簡単です。

このアーティクルの参照用URLをクリップボードにコピー メンテナンス
イベント用のプライベートクラスを作ってボタンに登録する ( No.3 )
日時: 2016/04/16 16:48
名前: lightbox
package lightbox.april.android2test;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

		MainActivity.this.findViewById(R.id.button).setOnClickListener(new MyButton());

	}

	private class MyButton implements View.OnClickListener {
		@Override
		public void onClick(View v) {

			// logcat にメッセージを表示
			Log.i("lightbox", "ボタンが押されました");

			// トーストを表示
			Toast.makeText(MainActivity.this, "ボタンが押されました", Toast.LENGTH_LONG).show();
		}
	}
}
元々、new View.OnClickListener() としてイベント登録していたのはインターフェイスです。この場合は同じインターフェイスを持つMyButton という、イベントの処理しか出来ないクラスを作って使用しているだけなので、このままでは大差はありませんが、MyButton に何かオリジナルのメソッドを加えて行けば、標準化の方法として拡張して行く事ができると思います
▼ 複数のボタンでイベント処理を共用する
package lightbox.april.android2test;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

	private MyButton my_button;

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

		my_button = new MyButton();
		MainActivity.this.findViewById(R.id.button).setOnClickListener(my_button);
		MainActivity.this.findViewById(R.id.button2).setOnClickListener(my_button);

		my_button.testMessage(MainActivity.this,"初期処理が終了しました");

	}

	private class MyButton implements View.OnClickListener {
		@Override
		public void onClick(View v) {
			String s = ((Button)v).getText().toString();
			s = String.format("%s : ボタンが押されました",s);
			testMessage(MainActivity.this,s);
		}

		public void testMessage(Context context, String s ) {

			// logcat にメッセージを表示
			Log.i("lightbox", s);

			// トーストを表示
			Toast.makeText(context, s, Toast.LENGTH_LONG).show();

		}
	}
}
ここでは、結果がわかりやすいように、View からボタンの文字列を取得していますが、実際は id を取得してその値によって処理を分けます。
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
MyButton の代わりに MainActivity を使う ( No.4 )
日時: 2016/04/16 16:55
名前: lightbox
package lightbox.april.android2test;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

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

		MainActivity.this.findViewById(R.id.button).setOnClickListener(MainActivity.this);
		MainActivity.this.findViewById(R.id.button2).setOnClickListener(MainActivity.this);

		testMessage(MainActivity.this,"初期処理が終了しました");

	}

	@Override
	public void onClick(View v) {
		String s = ((Button)v).getText().toString();
		s = String.format("%s : ボタンが押されました",s);
		testMessage(MainActivity.this,s);
	}

	public void testMessage(Context context, String s ) {

		// logcat にメッセージを表示
		Log.i("lightbox", s);

		// トーストを表示
		Toast.makeText(context, s, Toast.LENGTH_LONG).show();

	}
}
MainActivity にボタンクリックイベント用のインターフェイスを実装すると、MyButton のコードとほぼ同様になります。
このアーティクルの参照用URLをクリップボードにコピー メンテナンス