수색…


통사론

  • <버튼 ... />
  • 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에서 하나 이상의 뷰에 대해 동일한 클릭 이벤트 사용

레이아웃에서 뷰를 만들면 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 에서 리스너 중 하나를 구현하는 클래스를 만들어야합니다.

예를 들어, 요소를 길게 클릭하면 도움말을 제공합니다.

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);

참고 : 분리 된 클래스의 리스너 정의에는 단점이 있습니다. 클래스 필드에 직접 액세스 할 수 없으므로 속성을 공개하거나 geters를 정의하지 않는 한 생성자를 통해 데이터 (컨텍스트, 뷰)를 전달해야합니다.

사용자 지정 여러 개의 빠른 클릭을 방지하기 위해 Listener를 클릭합니다.

버튼이 짧은 시간 내에 여러 번 발사 되는 것을 방지 하기 위해 (흐름이 제어되지 않으면 심각한 문제를 일으킬 수있는 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는 걸려있는 Button에 연결됩니다.

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