Замена значения onClick у кнопки при нажатии
Нужно, чтобы при нажатии кнопки значение onClick менялось на другое, т. е. значение onClick сначала sound_on, а после нажатия sound_off, если ещё раз нажать то снова sound_on.
activity.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".supply_system">
<ImageButton
android:id="@+id/onoff"
android:layout_width="109dp"
android:layout_height="98dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_marginTop="90dp"
android:layout_marginRight="20dp"
android:onClick="sound_on"
android:scaleType="center"
android:src="@drawable/loader"
tools:layout_editor_absoluteX="57dp"
tools:layout_editor_absoluteY="31dp" />
</RelativeLayout>
supply_system:
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
public class supply_system extends AppCompatActivity {
private ImageButton btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_supply_system);
}
public void sound_on(View view){
final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.on);
mediaPlayer.start();
btn = (ImageButton) findViewById(R.id.onoff);
///btn.код для смены
}
public void sound_off(View view){
final MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.off);
mediaPlayer.start();
btn = (ImageButton) findViewById(R.id.onoff);
///btn.код для смены
}
}
Ответы (2 шт):
Просто используйте флаг. Если true — то выполнить sound_off(), если false — то sound_on(). В качестве флага можно использовать как состояние isPlay(), так и обычную переменную типа boolean.
Задавать onClick через атрибут android:onClick в XML-разметке — не очень хорошая практика, это может неправильно работать на некоторых устройствах.
Заведите поле isOn, которое будет отвечать за состояние кнопки и задайте setOnClickListener в коде, а не через XML-разметку:
<ImageButton
android:id="@+id/onoff"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
public class MainActivity extends AppCompatActivity {
private ImageButton button;
private boolean isOn = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.onoff);
updateButtonState();
button.setOnClickListener(v -> {
isOn = !isOn;
updateButtonState();
if (isOn) {
// проиграть звук включения
} else {
// проиграть звук выключения
}
});
}
private void updateButtonState() {
button.setImageResource(isOn ? R.drawable.ic_on : R.drawable.ic_off);
}
...
}
Не забудьте сохранить состояние активити, чтобы не потерять стейт при пересоздании активити:
public class MainActivity extends AppCompatActivity {
...
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("com.example.is_button_on", isOn);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
isOn = savedInstanceState.getBoolean("com.example.is_button_on");
updateButtonState();
}
}