Я создаю очень простое приложение для дел в Android Studio. Когда пользователь добавляет новое задание, я хочу, чтобы он выбрал одну категорию из дома / работы / деятельности. Для этого я добавил PopupWindow
к своему основному макету и добавил внутрь 3 imageButtons
, представляющих категории. Дом выбран по умолчанию, и когда пользователь хочет выбрать другой, houseButton меняет свое изображение на «пустое», а другая кнопка меняет свое изображение на «выбранный»
Из того, что я нашел в интернете, я пытался использовать view.invalidate()
и view.postInvalidate()
на imageButtons
, но ничего не происходит. Я также попытался охватить весь блок в runOnUiThread {}
, но он также ничего не сделал.
Слушатель, который не работает:
fun swapActivity(view: View) {
houseButton.setImageResource(R.drawable.houseempty)
workButton.setImageResource(R.drawable.workempty)
activityButton.setImageResource(R.drawable.activityempty)
when (view) {
houseButton -> {
houseButton.setImageResource(R.drawable.house)
selectedActivity = "house"
}
workButton -> {
workButton.setImageResource(R.drawable.work)
selectedActivity = "work"
}
aActivity -> {
activityButton.setImageResource(R.drawable.activity)
selectedActivity = "activ"
}
}
}
Кнопка в основном макете, которая показывает PopupWindow:
var shown = false
button.setOnClickListener{
if(!shown) {
shown = true
val inflater: LayoutInflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val view = inflater.inflate(R.layout.new_todo, null)
val popupWindow = PopupWindow(
view,
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
)
//imageView inside popup that hides it
val buttonPopup = view.findViewById<ImageView>(R.id.imageCancel)
buttonPopup.setOnClickListener {
popupWindow.dismiss()
shown = false
}
TransitionManager.beginDelayedTransition(mainLayout)
popupWindow.showAtLocation(
mainLayout, // Location to display popup window
Gravity.BOTTOM,
0,
0
)
}
}
Всплывающий файл XML (new_todo
):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:background="#ffffff">">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/cancel"
android:id="@+id/imageCancel"/>
<ImageButton
android:background="@null"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/activity"
android:id="@+id/activityButton"
android:onClick="swapActivity"/>
<ImageButton
android:background="@null"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/workempty"
android:id="@+id/workButton"
android:onClick="swapActivity"/>
<ImageButton
android:layout_width="wrap_content" android:background="@null"
android:layout_height="wrap_content"
app:srcCompat="@drawable/house"
android:id="@+id/houseButton"
android:onClick="swapActivity"/>
</LinearLayout>
Редактировать: Решено. Я удалил всю функцию swapActivity
и добавил следующие строки в прослушиватель основной кнопки:
val houseButton1 = view.findViewById<ImageButton>(R.id.houseButton)
val workButton1 = view.findViewById<ImageButton>(R.id.workButton)
val activityButton1 = view.findViewById<ImageButton>(R.id.activityButton)
houseButton1.setOnClickListener {
houseButton1.setImageResource(R.drawable.house)
workButton1.setImageResource(R.drawable.workempty)
activityButton1.setImageResource(R.drawable.activityempty)
selectedActivity = "house"
}
//repeat for all buttons