Как мне вызвать более одной функции для каждого случая при использовании оператора «когда» в Котлине?

У меня есть цепочка из 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()
    }

}
2
0
503
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

вы можете сделать что-то подобное в 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 );

Ява или Котлин? buttons.forEach { it.setBackgroundColor(Color.RED) } и val buttons = listOf(recipeOneButton, recipeTwoFragment, ...)

Erwin Bolwidt 12.02.2019 08:28

@ErwinBolwidt Я только что продемонстрировал способ. Я не думаю, что java или kotlin будут иметь такое большое значение. Он также может легко преобразоваться в kotlin

Tejas Pandya 12.02.2019 08:36

Да, изменить его на kotlin было не так уж сложно. Спасибо!

Tsabary 13.02.2019 09:10

По сути, вам нужно сопоставить идентификаторы кнопок с фрагментами.

Чтобы избежать избыточности в ваших функциях 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()
}

Другие вопросы по теме