Как назвать активность с switch-case в Котлине? - PullRequest
1 голос
/ 31 октября 2019

Как назвать активность с коммутатором в Котлине? Я хотел бы использовать конструкцию распределительного шкафа на Cotlin, как на фото ниже. (Java Code)

public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.navigation_home:
                break;
            case R.id.navigation_adminword:
                Intent a = new Intent(activity_callender.this,Words_List.class);
                startActivity(a);
                onStop();
                break;
            case R.id.navigation_myword:
                Intent b = new Intent(activity_callender.this,SaveWords.class);
                startActivity(b);
                onStop();
                break;
            case R.id.navigation_profil:
                Intent c = new Intent(activity_callender.this,UsersActivity.class);
                startActivity(c);
                onStop();
                break;
        }
        return false;
    }

Ответы [ 4 ]

0 голосов
/ 02 ноября 2019
  1. если вы переходите с Java на Kotlin , то вы также найдете некоторые изменения в синтаксической части.
  2. В Java мы используем переключатель , но в Kotlin этот переключатель преобразуется в , когда .
  3. когда также используется для условного представления , но это делает вещи очень умнее и проще .
  4. Всякий раз, когда у вас есть числовозможностей , тогда вы можете использовать когда в вашем коде.

Например, код, который был написан с использованием switch в Java: -

    switch(number) {
    case 1:
      System.out.println("1");
      break;
    case 2:
      System.out.println("2");
      break;
    case 3:
      System.out.println("3");
      break;
    default:
      System.out.println("Number is not between 1 and 3");
      break;
    }

Например, код, написанный с использованием switch , преобразуется во что-то вроде ниже после использования , когда :

when(number) {
    1 -> println("1")
    2 -> println("2")
    3 -> println("3")
    else -> println("Number is not between 1 and 3")
}

Так что для вашего вопроса вы можете написать свой код в Kotlin как: -

override fun onNavigationItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.navigation_home -> {}
            R.id.navigation_adminword -> {
                startActivity(Intent(this, Words_List::class.java))
                onStop()
            }
            R.id.navigation_myword -> {
                startActivity(Intent(this, SaveWords::class.java))
                onStop()
            }
            R.id.navigation_myword -> {
                startActivity(Intent(this,  UsersActivity::class.java))
                onStop()
            }
        }
        return false
    }
0 голосов
/ 31 октября 2019

Когда выражение (ваш вопрос)

Я бы напрямую возвратил результат выражения when (которое возвращает значение каждой ветви). В этом случае ваше веселье превращается в «однострочник», который может использовать синтаксис выражений Kotlin (=, а не {}):

fun onNavigationItemSelected(item: MenuItem) = when (item.getItemId()) {
    R.id.navigation_home -> {
        // Do something
        true
    }
    R.id.navigation_adminword -> menuStartAndFinish(Words_List::class)
    R.id.navigation_myword -> menuStartAndFinish(SaveWords::class)
    R.id.navigation_profil -> menuStartAndFinish(UsersActivity::class)
    else -> false
}

Вспомогательные расширения (повторное использование в проекте)

Я делегировал логику intent и startActivity этим расширениям:

inline fun <reified T : Activity> Context.start(
    cls: KClass<T>, noinline init: (Intent.() -> Unit)? = null
) {
    Intent(this, cls.java).apply {
        init?.invoke(this)
        startActivity(this)
    }
}

inline fun <reified T : Activity> Context.menuStartAndFinish(
    cls: KClass<T>, noinline init: (Intent.() -> Unit)? = null
): Boolean {
    start(cls, init)
    finish()
    return true
}
0 голосов
/ 01 ноября 2019

Я использую Нижний бар по ссылке ниже. Я не мог назвать активность. Я думаю, потому что свойство onNavigationItemSelected не существует. введите описание ссылки здесь

0 голосов
/ 31 октября 2019

Вы не можете, поскольку Java switch недоступна в Kotlin, используйте when или даже if case ...

fun onNavigationItemSelected(item: MenuItem): Boolean {
    when (item.getItemId()) {
        R.id.navigation_home -> // do something...
        R.id.navigation_adminword -> {
            val a = Intent(this@activity_callender, Words_List::class.java)
            startActivity(a)
            onStop() // this method is called automatically, it is no necessary call it manually
        }
        R.id.navigation_myword -> {
            val b = Intent(this@activity_callender, SaveWords::class.java)
            startActivity(b)
            onStop() // this method is called automatically, it is no necessary call it manually
        }
        R.id.navigation_profil -> {
            val c = Intent(this@activity_callender, UsersActivity::class.java)
            startActivity(c)
            onStop() // this method is called automatically, it is no necessary call it manually
        }
        else -> {
            // else case would be the default switch case
        }
    }
    return false
}

на самом деле вы можете делать больше вещей с помощью when, как вернуть значение, а затем присвоить его переменной, и так далее ...

https://kotlinlang.org/docs/reference/control-flow.html#when-expression

...