У меня есть цепочка из 8 кнопок, которые я позиционирую как боковое меню, где справа от них находится контейнер фрагментов. При нажатии на каждую кнопку открывается отдельный фрагмент.
Это делается с помощью прослушивателя onClick и оператора when.
Что я хочу сделать, так это то, что, кроме изменения фрагмента в поле, я хочу, чтобы фон для каждой кнопки менялся при нажатии и возвращался к умолчанию при нажатии другого. Каков наилучший способ сделать это?
Могу ли я вызвать несколько действий для каждого случая в операторе when? Нужно ли для каждой нажатой кнопки устанавливать свой фон и фон для остальных 7? Кажется, слишком много кода.
class MainActivity : AppCompatActivity(), View.OnClickListener {
override fun onClick(v: View?) {
when (v?.id){
R.id.recipeOneButton -> createRecipeOne()
R.id.recipeTwoButton -> createRecipeTwo()
R.id.recipeThreeButton -> createRecipeThree()
R.id.recipeFourButton -> createRecipeFour()
R.id.recipeFiveButton -> createRecipeFive()
R.id.recipeSixButton -> createRecipeSix()
R.id.recipeSevenButton -> createRecipeSeven()
R.id.recipeEightButton -> createRecipeEight()
}
}
private val manager = this.supportFragmentManager!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
createRecipeOne()
val recipeOneButton : Button = findViewById(R.id.recipeOneButton)
val recipeTwoFragment : Button = findViewById(R.id.recipeTwoButton)
val recipeThreeButton : Button = findViewById(R.id.recipeThreeButton)
val recipeFourButton : Button = findViewById(R.id.recipeFourButton)
val recipeFiveButton : Button = findViewById(R.id.recipeFiveButton)
val recipeSixButton : Button = findViewById(R.id.recipeSixButton)
val recipeSevenButton: Button = findViewById(R.id.recipeSevenButton)
val recipeEightButton : Button = findViewById(R.id.recipeEightButton)
recipeOneButton.setOnClickListener(this)
recipeTwoFragment.setOnClickListener(this)
recipeThreeButton.setOnClickListener(this)
recipeFourButton.setOnClickListener(this)
recipeFiveButton.setOnClickListener(this)
recipeSixButton.setOnClickListener(this)
recipeSevenButton.setOnClickListener(this)
recipeEightButton.setOnClickListener(this)
}
fun createRecipeOne(){
val transaction = manager.beginTransaction()
val fragment = RecipeOne()
transaction.replace(R.id.fragmentHolder, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createRecipeTwo(){
val transaction = manager.beginTransaction()
val fragment = RecipeTwo()
transaction.replace(R.id.fragmentHolder, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createRecipeThree(){
val transaction = manager.beginTransaction()
val fragment = RecipeThree()
transaction.replace(R.id.fragmentHolder, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createRecipeFour(){
val transaction = manager.beginTransaction()
val fragment = RecipeFour()
transaction.replace(R.id.fragmentHolder, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createRecipeFive(){
val transaction = manager.beginTransaction()
val fragment = RecipeFive()
transaction.replace(R.id.fragmentHolder, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createRecipeSix(){
val transaction = manager.beginTransaction()
val fragment = RecipeSix()
transaction.replace(R.id.fragmentHolder, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createRecipeSeven(){
val transaction = manager.beginTransaction()
val fragment = RecipeSeven()
transaction.replace(R.id.fragmentHolder, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
fun createRecipeEight(){
val transaction = manager.beginTransaction()
val fragment = RecipeEight()
transaction.replace(R.id.fragmentHolder, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
}
вы можете сделать что-то подобное в when, чтобы изменить фон этой кнопки
when (v?.id){
R.id.recipeOneButton -> {
createRecipeOne()
changebackground(id)
}
R.id.recipeTwoButton -> {
createRecipeTwo()
changebackground(id)
}
}
в changebackground(id) передайте идентификатор этой кнопки, для которой вы хотите изменить фон.
Для изменения фона других кнопок. если вы хотите уменьшить код. вы должны сделать что-то вроде этого.
private void changeColor(Button[] buttons){
for(int x=0; x < buttons.length; x++){
buttons[x].setBackgroundColor(Color.RED);
}
}
но для этого вам нужно инициализировать кнопку, как это
btns[0] = (Button) findViewById(R.id.recipeOneButton );
btns[1] = (Button) findViewById(R.id.recipeTwoButton );
@ErwinBolwidt Я только что продемонстрировал способ. Я не думаю, что java или kotlin будут иметь такое большое значение. Он также может легко преобразоваться в kotlin
Да, изменить его на kotlin было не так уж сложно. Спасибо!
По сути, вам нужно сопоставить идентификаторы кнопок с фрагментами.
Чтобы избежать избыточности в ваших функциях createRecipeX, вы должны позволить своему выражению when возвращать правильный фрагмент, а не вызывать функцию:
override fun onClick(v: View) {
val fragment = when (v.id) {
R.id.recipeOneButton -> RecipeOne()
R.id.recipeTwoButton -> RecipeTwo()
// ...
else -> throw IllegalStateException()
}
val transaction = manager.beginTransaction()
transaction.replace(R.id.fragmentHolder, fragment)
transaction.addToBackStack(null)
transaction.commit()
// change button background
}
Затем вы можете переместить весь код, который у них есть, под выражением when.
Если фон кнопки уникален для каждой кнопки, вы должны сделать это следующим образом:
val fragment = when (v.id) {
R.id.recipeOneButton -> {
// change button background to specific color 1
RecipeOne()
}
R.id.recipeTwoButton -> {
// change button background to specific color 2
RecipeTwo()
}
// ...
else -> throw IllegalStateException()
}
Ява или Котлин?
buttons.forEach { it.setBackgroundColor(Color.RED) }иval buttons = listOf(recipeOneButton, recipeTwoFragment, ...)