Как изменить изображение при нажатии кнопки?
Поэтому я пытаюсь изменить изображение при нажатии кнопки под ним. Я пытаюсь переключить телефон из обычного режима в бесшумный и изменить изображение в соответствии с состоянием телефона.
Я слежу за книгой и не знаю, что не так (я не копирую, потому что это создает проблемы). Хорошие новости, хотя. Хотя изображение не меняется, когда телефон переключается в бесшумный режим, при повторном открытии приложения с уже включенным бесшумным режимом изображение меняется на то, что должно быть, когда он находится в беззвучном режиме. И когда я переключаю его обратно в нормальный режим, он работает, но не меняет свой образ, пока я не закрою и снова не открою приложение, и система не прочитает состояние телефона. Я понятия не имею, что не так, но вот мой код:
private AudioManager mAudioManager;
private boolean mPhoneIsSilent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.linear);
mAudioManager= (AudioManager)getSystemService (AUDIO_SERVICE);
checkIfPhoneIsSilent();
setButtonClickListener();
toggleUi();
}
private void setButtonClickListener(){
Button toggleButton=(Button) findViewById(R.id.toggleButton);
toggleButton.setOnClickListener(
new View.OnClickListener(){
public void onClick(View v){
if (mPhoneIsSilent){
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
mPhoneIsSilent=false;
}
else{
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
mPhoneIsSilent=true;
}
}
}
);
}
private void toggleUi() {
ImageView imageView=(ImageView)findViewById(R.id.phone_icon);
Drawable newPhoneImage;
if(mPhoneIsSilent)
newPhoneImage=getResources().getDrawable(R.drawable.mute);
else
newPhoneImage=getResources().getDrawable(R.drawable.unmute);
imageView.setImageDrawable(newPhoneImage);
setContentView(R.layout.linear);
}
private void checkIfPhoneIsSilent()
{
int ringerMode=mAudioManager.getRingerMode();
if(ringerMode==AudioManager.RINGER_MODE_SILENT)
mPhoneIsSilent=true;
else mPhoneIsSilent=false;
}
и вот XML, чтобы согласиться с этим:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/phone_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@drawable/unmute" />
<Button
android:id="@+id/toggleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Toggle Silent Mode"/>
</LinearLayout>
3 ответа
Вот простой ответ
ImageView imageView;
private void toggleUi() {
imageView=(ImageView)findViewById(R.id.phone_icon);
Drawable newPhoneImage;
if(mPhoneIsSilent)
imageView.setImageResource(R.drawable.mute);
else
imageView.setImageResource(R.drawable.unmute);
}
и ваше событие клика будет
private void setButtonClickListener(){
Button toggleButton=(Button) findViewById(R.id.toggleButton);
toggleButton.setOnClickListener(
new View.OnClickListener(){
public void onClick(View v){
if (mPhoneIsSilent){
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
mPhoneIsSilent=false;
}
else{
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
mPhoneIsSilent=true;
}
toggleUi();
}
}
);
}
Вы не звоните toggleUi()
в вашем OnClickListener, после изменения состояния телефона. При этом кнопка не обновляется.
Добавить звонок в toggleUi()
как последняя строка onClick(View view)
метод вашего OnClickListener
, Это должно помочь. И используйте упрощенный метод Динеш Шармы тоже.
в вашем коде есть две ошибки
1. это setButtonClickListener();
вызывается один раз в вашей деятельности, т.е. в onCreate()
! так что вы кнопка г OnClickListener()
будет работать один раз!
2. внутри toggleUi()
не использовать setContentView(R.layout.linear);
Решение для 1.
используйте следующий код в вашем onCreate()
Button toggleButton = (Button) findViewById(R.id.toggleButton);
toggleButton.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
if (mPhoneIsSilent) {
mAudioManager
.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
mPhoneIsSilent = false;
toggleUi();
} else {
mAudioManager
.setRingerMode(AudioManager.RINGER_MODE_SILENT);
mPhoneIsSilent = true;
toggleUi();
}
}
});
и удалите эти две строки кода из onCreat()
setButtonClickListener();
toggleUi();
также удалите свой private void setButtonClickListener()
полностью!
Решение для 2.
ваш toggleUi()
должно быть:
private void toggleUi() {
ImageView imageView = (ImageView) findViewById(R.id.phone_icon);
Drawable newPhoneImage;
if (mPhoneIsSilent)
newPhoneImage = getResources().getDrawable(R.drawable.edit_btn);
else
newPhoneImage = getResources().getDrawable(R.drawable.ic_launcher);
imageView.setImageDrawable(newPhoneImage);
}