Android
ボタン
サーチ…
構文
- <ボタン... />
- android:onClick = "methodname"
- button.setOnClickListener(新しいOnClickListener(){...});
- パブリッククラスclassnameはView.OnLongClickListenerを実装します
インラインonClickListener
ボタンがあるとします(プログラムで作成することも、findViewbyId()などを使用してビューからバインドすることもできます)
Button btnOK = (...)
今度は、匿名クラスを作成し、インラインに設定します。
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do stuff here...
}
});
レイアウトを使用してクリックアクションを定義する
レイアウトでボタンを作成するときは、 android:onClick
属性を使用して、コード内のメソッドを参照してクリックを処理できます。
ボタン
<Button
android:width="120dp"
android:height="wrap_content"
android:text="Click me"
android:onClick="handleClick" />
次に、あなたのアクティビティで、 handleClick
メソッドを作成します。
public void handleClick(View v) {
// Do whatever.
}
XMLの1つ以上のビューに対して同じクリックイベントを使用する
レイアウトでViewを作成するときは、android:onClick属性を使用して、関連するアクティビティまたはフラグメントのメソッドを参照して、クリックイベントを処理できます。
XMLレイアウト
<Button android:id="@+id/button"
...
// onClick should reference the method in your activity or fragment
android:onClick="doSomething" />
// Note that this works with any class which is a subclass of View, not just Button
<ImageView android:id="@+id/image"
...
android:onClick="doSomething" />
アクティビティ/フラグメントコード
コードで 、名前を付けたメソッドを作成します。ここでvはタッチされたビューになり、このメソッドを呼び出すビューごとに何かを行います。
public void doSomething(View v) {
switch(v.getId()) {
case R.id.button:
// Button was clicked, do something.
break;
case R.id.image:
// Image was clicked, do something else.
break;
}
}
必要に応じて、ビューごとに異なるメソッドを使用することもできます(この場合、IDを確認する必要はありません)。
長いクリックイベントを聞く
長いクリックを捕まえて使用するには、ボタンに適切なリスナーを提供する必要があります。
View.OnLongClickListener listener = new View.OnLongClickListener() {
public boolean onLongClick(View v) {
Button clickedButton = (Button) v;
String buttonText = clickedButton.getText().toString();
Log.v(TAG, "button long pressed --> " + buttonText);
return true;
}
};
button.setOnLongClickListener(listener);
外部リスナーの定義
それをいつ使うべきですか?
- インラインリスナー内のコードが大きすぎてメソッド/クラスが醜く読みにくい
- あなたは、あなたのアプリのさまざまな要素(ビュー)で同じアクションを実行したい
これを実現するには、 View APIでリスナーの1つを実装するクラスを作成する必要があります 。
たとえば、任意の要素を長くクリックするとヘルプが表示されます。
public class HelpLongClickListener implements View.OnLongClickListener
{
public HelpLongClickListener() {
}
@Override
public void onLongClick(View v) {
// show help toast or popup
}
}
次に、それを使用するには、 Activity
に属性または変数が必要です。
HelpLongClickListener helpListener = new HelpLongClickListener(...);
button1.setOnClickListener(helpListener);
button2.setOnClickListener(helpListener);
label.setOnClickListener(helpListener);
button1.setOnClickListener(helpListener);
注:分離されたクラスのリスナーを定義することには欠点が1つあります。クラスフィールドに直接アクセスすることはできないため、属性を公開したりゲッターを定義しない限り、コンストラクタを介してデータ(コンテキスト、ビュー)を渡す必要があります。
カスタムクリックリスナーを使用して複数の高速クリックを防止
ボタンが短時間に複数回発射されないように (1秒間に2回クリックすると、フローが制御されないと重大な問題が発生する可能性があります)、カスタムSingleClickListenerを実装できます。
このClickListenerは、特定の時間間隔をしきい値(たとえば、1000ms)として設定します。
ボタンをクリックすると、定義した過去の時間内にトリガーが実行されたかどうかを確認するチェックが実行され、トリガーされていない場合はトリガーされます。
public class SingleClickListener implements View.OnClickListener {
protected int defaultInterval;
private long lastTimeClicked = 0;
public SingleClickListener() {
this(1000);
}
public SingleClickListener(int minInterval) {
this.defaultInterval = minInterval;
}
@Override
public void onClick(View v) {
if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
return;
}
lastTimeClicked = SystemClock.elapsedRealtime();
performClick(v);
}
public abstract void performClick(View v);
}
クラス内では、SingleClickListenerはボタンに関連付けられています
myButton = (Button) findViewById(R.id.my_button);
myButton.setOnClickListener(new SingleClickListener() {
@Override
public void performClick(View view) {
// do stuff
}
});
ボタンスタイルのカスタマイズ
ボタンの外観をカスタマイズする方法はたくさんあります。この例では、いくつかのオプションを示します。
オプション0:ThemeOverlayを使用する(現在最も簡単な方法です)
スタイルファイルに新しいスタイルを作成する:
styles.xml
<resources>
<style name=“mybutton” parent=”ThemeOverlay.AppCompat.Ligth”>
<!-- customize colorButtonNormal for the disable color -->
<item name="colorButtonNormal">@color/colorbuttonnormal</item>
<!-- customize colorAccent for the enabled color -->
<item name="colorButtonNormal">@color/coloraccent</item>
</style>
</resources>
次に、ボタンを配置するレイアウト(MainActivityなど):
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:orientation="vertical"
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=".MainActivity">
<Button
android:id="@+id/mybutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello"
android:theme="@style/mybutton"
style="@style/Widget.AppCompat.Button.Colored"/>
</LinearLayout>
オプション1:独自のボタンスタイルを作成する
values / styles.xmlで、ボタンの新しいスタイルを作成します。
styles.xml
<resources>
<style name="mybuttonstyle" parent="@android:style/Widget.Button">
<item name="android:gravity">center_vertical|center_horizontal</item>
<item name="android:textColor">#FFFFFFFF</item>
<item name="android:shadowColor">#FF000000</item>
<item name="android:shadowDx">0</item>
<item name="android:shadowDy">-1</item>
<item name="android:shadowRadius">0.2</item>
<item name="android:textSize">16dip</item>
<item name="android:textStyle">bold</item>
<item name="android:background">@drawable/button</item>
</style>
</resources>
次に、ボタンを配置するレイアウト(MainActivityなど):
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:orientation="vertical"
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=".MainActivity">
<Button
android:id="@+id/mybutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello"
android:theme="@style/mybuttonstyle"/>
</LinearLayout>
オプション2:ボタンの状態ごとにドロアブルを割り当てる
「mybuttondrawable.xml」というドロウアブル・フォルダーにxmlファイルを作成して、各ボタン状態のドロウアブル・リソースを定義します。
drawable / mybutton.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_enabled="false"
android:drawable="@drawable/mybutton_disabled" />
<item
android:state_pressed="true"
android:state_enabled="true"
android:drawable="@drawable/mybutton_pressed" />
<item
android:state_focused="true"
android:state_enabled="true"
android:drawable="@drawable/mybutton_focused" />
<item
android:state_enabled="true"
android:drawable="@drawable/mybutton_enabled" />
</selector>
これらのドロウアブルのそれぞれは、あなたが定義し、ドロウアブルフォルダに保存されたイメージ(例えば、mybutton_disabled.png)またはxmlファイルです。例えば:
drawable / mybutton_disabled.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient
android:startColor="#F2F2F2"
android:centerColor="#A4A4A4"
android:endColor="#F2F2F2"
android:angle="90"/>
<padding android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp" />
<stroke
android:width="2dip"
android:color="#FFFFFF" />
<corners android:radius= "8dp" />
</shape>
次に、ボタンを配置するレイアウト(MainActivityなど):
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:orientation="vertical"
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=".MainActivity">
<Button
android:id="@+id/mybutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello"
android:background="@drawable/mybuttondrawable"/>
</LinearLayout>
オプション3:ボタンスタイルをアプリケーションテーマに追加する
あなたのアプリケーションテーマの定義(values / styles.xml内)でデフォルトのアンドロイドボタンスタイルを上書きすることができます。
styles.xml
<resources>
<style name="AppTheme" parent="android:Theme">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:button">@style/mybutton</item>
</style>
<style name="mybutton" parent="android:style/Widget.Button">
<item name="android:gravity">center_vertical|center_horizontal</item>
<item name="android:textColor">#FFFFFFFF</item>
<item name="android:shadowColor">#FF000000</item>
<item name="android:shadowDx">0</item>
<item name="android:shadowDy">-1</item>
<item name="android:shadowRadius">0.2</item>
<item name="android:textSize">16dip</item>
<item name="android:textStyle">bold</item>
<item name="android:background">@drawable/anydrawable</item>
</style>
</resources>
オプション4:プログラムでデフォルトのボタンスタイルに色を重ねる
アクティビティのボタンを見つけ、カラーフィルタを適用するだけです:
Button mybutton = (Button) findViewById(R.id.mybutton);
mybutton.getBackground().setColorFilter(anycolor, PorterDuff.Mode.MULTIPLY)