안드로이드의위젯.스위치 켜기/끄기 이벤트 수신기?
스위치 버튼 안드로이드를 구현하고 싶습니다.위젯.스위치(API v.14에서 사용 가능).
<Switch
android:id="@+id/switch1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Switch" />
그런데 버튼에 이벤트 수신자를 추가하는 방법을 잘 모르겠습니다.'onClick' 청취자여야 하나요?"켜짐"으로 전환되는지 여부를 어떻게 알 수 있습니까?
스위치 상속CompoundButton
의 속성이므로 OnCheckedChangeListener를 추천합니다.
mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// do something, the isChecked will be
// true if the switch is in the On position
}
});
다음 토막글을 사용하여 XML을 통해 스위치를 레이아웃에 추가합니다.
<Switch
android:id="@+id/on_off_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="OFF"
android:textOn="ON"/>
그런 다음 Activity's on Create 메서드에서 스위치에 대한 참조를 가져와 OnCheckedChangeListener를 설정합니다.
Switch onOffSwitch = (Switch) findViewById(R.id.on_off_switch);
onOffSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.v("Switch State=", ""+isChecked);
}
});
Kotlin을 사용하는 사용자의 경우 스위치에 대한 수신기를 설정할 수 있습니다(이 경우 ID는mySwitch
) 다음과 같습니다.
mySwitch.setOnCheckedChangeListener { _, isChecked ->
// do whatever you need to do when the switch is toggled here
}
isChecked
스위치가 현재 선택되어 있으면 true이고(ON), 그렇지 않으면 false입니다.
XML 레이아웃을 정의합니다.
<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"
tools:context="com.neoecosystem.samplex.SwitchActivity">
<Switch
android:id="@+id/myswitch"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
</RelativeLayout>
그런 다음 활동을 만듭니다.
public class SwitchActivity extends ActionBarActivity implements CompoundButton.OnCheckedChangeListener {
Switch mySwitch = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_switch);
mySwitch = (Switch) findViewById(R.id.myswitch);
mySwitch.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// do something when check is selected
} else {
//do something when unchecked
}
}
****
}
======== 아래 API 14의 경우 SwitchCompat =========를 사용합니다.
XML
<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"
tools:context="com.neoecosystem.samplex.SwitchActivity">
<android.support.v7.widget.SwitchCompat
android:id="@+id/myswitch"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
</RelativeLayout>
활동
public class SwitchActivity extends ActionBarActivity implements CompoundButton.OnCheckedChangeListener {
SwitchCompat mySwitch = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_switch);
mySwitch = (SwitchCompat) findViewById(R.id.myswitch);
mySwitch.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// do something when checked is selected
} else {
//do something when unchecked
}
}
*****
}
코틀린에서:
switch_button.setOnCheckedChangeListener { buttonView, isChecked ->
if (isChecked) {
// The switch enabled
text_view.text = "Switch on"
} else {
// The switch disabled
text_view.text = "Switch off"
}
}
스위치 위젯의 레이아웃은 다음과 같습니다.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:gravity="right"
android:text="All"
android:textStyle="bold"
android:textColor="@color/black"
android:textSize="20dp"
android:id="@+id/list_toggle" />
</LinearLayout>
Activity 클래스에서는 두 가지 방법으로 코딩할 수 있습니다.코딩할 수 있는 용도에 따라 다릅니다.
퍼스트 웨이
public class ActivityClass extends Activity implements CompoundButton.OnCheckedChangeListener {
Switch list_toggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.return_vehicle);
list_toggle=(Switch)findViewById(R.id.list_toggle);
list_toggle.setOnCheckedChangeListener(this);
}
}
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
if(isChecked) {
list_toggle.setText("Only Today's"); //To change the text near to switch
Log.d("You are :", "Checked");
}
else {
list_toggle.setText("All List"); //To change the text near to switch
Log.d("You are :", " Not Checked");
}
}
세컨드 웨이
public class ActivityClass extends Activity {
Switch list_toggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.return_vehicle);
list_toggle=(Switch)findViewById(R.id.list_toggle);
list_toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked) {
list_toggle.setText("Only Today's"); //To change the text near to switch
Log.d("You are :", "Checked");
}
else {
list_toggle.setText("All List"); //To change the text near to switch
Log.d("You are :", " Not Checked");
}
}
});
}
}
2020년 9월 - 프로그래밍 방식으로 답변
스위치 위젯 및 재료 설계에 대해 프로그래밍 방식으로 수행할 수 있습니다.
Switch yourSwitchButton = findViewById(R.id.switch_id);
yourSwitchButton.setChecked(true); // true is open, false is close.
yourSwitchButton.setOnCheckedChangeListener((compoundButton, b) -> {
if (b){
//open job.
}
else {
//close job.
}
});
Switch Checked Change 이벤트에 DataBinding 및 ViewModel을 사용할 수 있습니다.
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="com.example.ui.ViewModel" />
</data>
<Switch
android:id="@+id/on_off_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onCheckedChanged="@{(button, on) -> viewModel.onCheckedChange(on)}"
/>
나의 해결책은 a를 사용하는 것입니다.SwitchCompat
그리고 코틀린.제 상황에서는 사용자가 UI를 통해 트리거하는 경우에만 변경에 대응해야 했습니다.사실, 내 스위치는 A에 반응합니다.LiveData
, 그리고 이것이 둘 다를 만들었습니다.setOnClickListener
그리고.setOnCheckedChangeListener
사용할 수 없는setOnClickListener
실제로 사용자 상호 작용에 올바르게 반응하지만 사용자가 엄지손가락을 스위치에 걸쳐 끌면 트리거되지 않습니다.setOnCheckedChangeListener
스위치가 프로그래밍 방식으로 토글되는 경우(예를 들어 관찰자에 의해) 다른 쪽에서도 트리거됩니다.제 경우에는 스위치가 두 개의 조각 위에 존재했고, 복원 등이 있었습니다.InstanceState는 경우에 따라 이전 값으로 스위치를 트리거하여 올바른 값을 덮어씁니다.
그래서 저는 SwitchCompat의 코드를 살펴보았고, 클릭과 드래그를 구분하는 동작을 성공적으로 모방할 수 있었고, 그것을 사용하여 원하는 대로 작동하는 맞춤형 터치 청취기를 구축할 수 있었습니다.시작합니다.
/**
* This function calls the lambda function passed with the right value of isChecked
* when the switch is tapped with single click isChecked is relative to the current position so we pass !isChecked
* when the switch is dragged instead, the position of the thumb centre where the user leaves the
* thumb is compared to the middle of the switch, and we assume that left means false, right means true
* (there is no rtl or vertical switch management)
* The behaviour is extrapolated from the SwitchCompat source code
*/
class SwitchCompatTouchListener(private val v: SwitchCompat, private val lambda: (Boolean)->Unit) : View.OnTouchListener {
companion object {
private const val TOUCH_MODE_IDLE = 0
private const val TOUCH_MODE_DOWN = 1
private const val TOUCH_MODE_DRAGGING = 2
}
private val vc = ViewConfiguration.get(v.context)
private val mScaledTouchSlop = vc.scaledTouchSlop
private var mTouchMode = 0
private var mTouchX = 0f
private var mTouchY = 0f
/**
* @return true if (x, y) is within the target area of the switch thumb
* x,y and rect are in view coordinates, 0,0 is top left of the view
*/
private fun hitThumb(x: Float, y: Float): Boolean {
val rect = v.thumbDrawable.bounds
return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom
}
override fun onTouch(view: View, event: MotionEvent): Boolean {
if (view == v) {
when (MotionEventCompat.getActionMasked(event)) {
MotionEvent.ACTION_DOWN -> {
val x = event.x
val y = event.y
if (v.isEnabled && hitThumb(x, y)) {
mTouchMode = TOUCH_MODE_DOWN;
mTouchX = x;
mTouchY = y;
}
}
MotionEvent.ACTION_MOVE -> {
val x = event.x
val y = event.y
if (mTouchMode == TOUCH_MODE_DOWN &&
(abs(x - mTouchX) > mScaledTouchSlop || abs(y - mTouchY) > mScaledTouchSlop)
)
mTouchMode = TOUCH_MODE_DRAGGING;
}
MotionEvent.ACTION_UP,
MotionEvent.ACTION_CANCEL -> {
if (mTouchMode == TOUCH_MODE_DRAGGING) {
val r = v.thumbDrawable.bounds
if (r.left + r.right < v.width) lambda(false)
else lambda(true)
} else lambda(!v.isChecked)
mTouchMode = TOUCH_MODE_IDLE;
}
}
}
return v.onTouchEvent(event)
}
}
사용방법:
실행할 코드와 함께 람다를 받아들이는 실제 터치 청취자:
myswitch.setOnTouchListener(
SwitchCompatTouchListener(myswitch) {
// here goes all the code for your callback, in my case
// i called a service which, when successful, in turn would
// update my liveData
viewModel.sendCommandToMyService(it)
}
)
의 에 대한 합니다.switchstate
(그것이 있다면) 다음과 같이 보였습니다.
switchstate.observe(this, Observer {
myswitch.isChecked = it
})
두가지 방법이 있습니다.
다음과 같이 XML에서 xml을 사용하여 보기 추가 스위치를 클릭합니다.
<Switch android:id="@+id/switch1" android:onClick="toggle"/>
활동 클래스(예:MainActivity.java)에서
Switch toggle; //outside oncreate
toggle =(Switch) findViewById(R.id.switch1); // inside oncreate
public void toggle(View view) //outside oncreate
{
if( toggle.isChecked() ){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
start.setBackgroundColor(getColor(R.color.gold));
stop.setBackgroundColor(getColor(R.color.white));
}
}
else
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
stop.setBackgroundColor(getColor(R.color.gold));
start.setBackgroundColor(getColor(R.color.white));
}
}
}
- 클릭 시 수신기 사용
아래와 같이 XML에 Switch 추가:
활동 클래스(예:MainActivity.java)에서
Switch toggle; // outside oncreate
toggle =(Switch) findViewById(R.id.switch1); // inside oncreate
toggle.setOnClickListener(new View.OnClickListener() { // inside oncreate
@Override
public void onClick(View view) {
if( toggle.isChecked() ){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
start.setBackgroundColor(getColor(R.color.gold));
}
}
else
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
stop.setBackgroundColor(getColor(R.color.gold));
}
}
}
});
언급URL : https://stackoverflow.com/questions/11278507/android-widget-switch-on-off-event-listener
'programing' 카테고리의 다른 글
테이블 행에 테두리-아래쪽 추가 (0) | 2023.09.21 |
---|---|
대소문자를 구분하지 않는 XPath에 ()가 포함되어 있습니까? (0) | 2023.09.21 |
Angular에서 버튼을 비활성화하려면 어떻게 해야 합니까?배열에 요소가 있는 경우 JS? (0) | 2023.09.21 |
Knex.js는 sql injection을 방지합니까? (0) | 2023.09.21 |
Docker 가상 볼륨이 MariaDB 읽기/쓰기 작업에 충분히 빠릅니까? (0) | 2023.09.21 |