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

У меня есть цепочка из 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 голосов
/ 13 февраля 2019

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

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

вы можете сделать что-то подобное в 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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...