サーチ…


構文

  • <ボタン... />
  • 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)

ここではさまざまなブレンドモードを確認できます



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow