Как установить фоновый рисунок кнопки изображения для разных состояний?
Я хочу кнопку с двумя состояниями i) нормальный ii) коснитесь (или нажмите).
Я установил нормальный образ на фоне imagebutton, и я пытаюсь изменить изображение (нажатие) из метода onclick, но это не так. 't изменить.
Я хочу, чтобы, если я нажал кнопку изображения, изображение должно измениться с обычного на нажатое, пока я не нажму другую кнопку, но это не произойдет.
Может ли кто-нибудь предложить мне, как я могу это сделать с помощью селектора или во время выполнения?
Вот мой код изображения.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:gravity="bottom"
android:id="@+id/buttonpanel">
<ImageButton android:id="@+id/buttonhome"
android:layout_width="80dp"
android:layout_height="36dp"
android:focusable="true"
android:background="@drawable/homeselector">
</ImageButton>
<ImageButton android:id="@+id/buttonsearch"
android:layout_height="36dp"
android:layout_width="80dp"
android:background="@drawable/searchselector"
android:focusable="true">
</ImageButton>>
<ImageButton android:id="@+id/buttonreg"
android:layout_height="36dp"
android:layout_width="80dp"
android:background="@drawable/registerselector"
android:focusable="true">
</ImageButton>>
<ImageButton android:id="@+id/buttonlogin"
android:layout_height="36dp"
android:layout_width="80dp"
android:background="@drawable/loginselector"
android:focusable="true">
</ImageButton>
</LinearLayout>
а мой селектор xml -
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--<item android:state_pressed="true" android:drawable="@drawable/homehover"
/> <item android:state_focused="true" android:drawable="@drawable/homehover"
/> <item android:drawable="@drawable/home" /> <item android:state_window_focused="true"
android:drawable="@drawable/homehover" /> -->
<item android:state_enabled="false" android:drawable="@drawable/homehover" />
<item android:state_pressed="true" android:state_enabled="true"
android:drawable="@drawable/homehover" />
<item android:state_focused="true" android:state_enabled="true"
android:drawable="@drawable/homehover" />
<item android:state_enabled="true" android:drawable="@drawable/home" />
</selector>
И я также попытался изменить ресурс изображения в ontouch и onclick-событии, но это не помогает.
Ответы
Ответ 1
Создайте xml файл в своем чертеже следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_enabled="false"
android:drawable="@drawable/btn_sendemail_disable" />
<item
android:state_pressed="true"
android:state_enabled="true"
android:drawable="@drawable/btn_send_email_click" />
<item
android:state_focused="true"
android:state_enabled="true"
android:drawable="@drawable/btn_sendemail_roll" />
<item
android:state_enabled="true"
android:drawable="@drawable/btn_sendemail" />
</selector>
И установите соответствующие изображения, а затем установите этот xml в качестве фона вашего imageButton
.
Ответ 2
Попробуйте это
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
btn.setBackgroundResource(R.drawable.icon);
}
});
Ответ 3
Привет, попробуйте следующий код, который вам будет полезен,
((ImageView)findViewById(R.id.ImageViewButton)).setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN)
((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_over);
if(event.getAction() == MotionEvent.ACTION_UP)
((ImageView) v.findViewById(R.id.ImageViewButton)).setImageResource(R.drawable.image_normal);
return false;
}
});
Ответ 4
MHH. У меня есть другое решение, которое помогло мне, потому что у меня просто два разных состояния:
- элемент не нажат
- или щелкнуть по нему, чтобы он был выделен.
В моем .xml я определяю ImageButton следующим образом:
<ImageButton
android:id="@+id/imageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/selector" />
Соответствующий файл выбора выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ico_100_checked" android:state_selected="true"/>
<item android:drawable="@drawable/ico_100_unchecked"/>
</selector>
И в моем onCreate я вызываю:
final ImageButton ib = (ImageButton) value.findViewById(R.id.imageButton);
OnClickListener ocl =new OnClickListener() {
@Override
public void onClick(View button) {
if (button.isSelected()){
button.setSelected(false);
} else {
ib.setSelected(false);
//put all the other buttons you might want to disable here...
button.setSelected(true);
}
}
};
ib.setOnClickListener(ocl);
//add ocl to all the other buttons
сделано. надеюсь это поможет. Мне потребовалось некоторое время, чтобы понять.
Ответ 5
Я думаю, что проблема не в селекторном файле.
вам нужно добавить
<imagebutton ..
android:clickable="true"
/>
к вашим кнопкам изображения.
по умолчанию onClick обрабатывается на уровне списка (родительский). и imageButtons не получают onClick.
когда вы добавляете вышеуказанный атрибут, кнопка изображения получит событие, и будет использоваться селектор.
проверьте этот POST, который объясняет это для флажка.
Ответ 6
если вы хотите нажать кнопку изображения, то изображение должно быть изменено с обычного на нажатое
Но лучший способ - настроить RadioButton и использовать их в группе. Я вижу пример этого.
Извините, я не помню эту ссылку.
но если вы хотите этого избежать.
Вы должны добавить это в свой selector.xml
После выполнения. Просто добрался до вашего кода и добавьте его
public void onClick ( View v ) {
myImageButton.setSelected ( true ) ;
}
Вы увидите результат. Но вам нужно управлять состояниями, которые недавно нажала кнопка. Чтобы вы могли установить
myOLDImageButton.setSelected ( false ) ;
Я предлагаю вам поставить ссылку на все кнопки в массиве.
Ответ 7
то, что вы пытаетесь сделать, это скорее сегментная кнопка, чем список изображений.
здесь http://blog.bookworm.at/2010/10/segmented-controls-in-android.html - пример того, как это сделать. Основная идея заключается в настройке RadioButton вместо ImageButton, так как RadioButton будет иметь проверенное состояние, которое вам нужно
Ответ 8
Вы пробовали CompoundButton
? CompoundButton имеет проверяемое свойство, которое точно соответствует вашим потребностям. Замените ImageButtons на них.
<CompoundButton android:id="@+id/buttonhome"
android:layout_width="80dp"
android:layout_height="36dp"
android:background="@drawable/homeselector"/>
Измените селектор xml на следующее. Может потребоваться некоторое изменение, но обязательно используйте state_checked
вместо state_pressed
.
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:drawable="@drawable/homehover" />
<item android:state_checked="true" android:state_enabled="true"
android:drawable="@drawable/homehover" />
<item android:state_focused="true" android:state_enabled="true"
android:drawable="@drawable/homehover" />
<item android:state_enabled="true" android:drawable="@drawable/home" />
</selector>
В CompoundButton.OnCheckedChangeListener
вам нужно проверить и снять отметку с другого на основе ваших условий.
mButton1.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged (CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// Uncheck others.
}
}
});
Аналогично устанавливайте a OnCheckedChangeListener
для каждой кнопки, которая отключает другие кнопки, когда она проверяется. Надеюсь, что это поможет.
Ответ 9
Ответ на @ingsaurabh - это путь, если вы используете onClick. Однако, если вы используете событие onTouch, вы можете выбрать разные фоны (по-прежнему такие же, как в примере @ingsaurabh), используя view.setPressed()
.
Для получения дополнительной информации см. следующее: "Нажмите и удерживайте" на Android необходимо изменить состояния (настраиваемый селектор XML) с помощью onTouchListener
Ответ 10
вы можете создать файл селектора в res/drawable
Пример:
Рез/рисуем/selector_button.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_disabled" android:state_enabled="false" />
<item android:drawable="@drawable/btn_enabled" />
</selector>
и в макете, фрагменте или т.д.
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/selector_bg_rectangle_black"/>