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에서 하나 이상의 뷰에 대해 동일한 클릭 이벤트 사용
레이아웃에서 뷰를 만들면 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)
서로 다른 혼합 모드를 확인할 수 있습니다 여기에 좋은 예 여기를 .