Есть ли способ научить java-> kotlin конвертер в Android Studio не использовать оператор `as` при конвертации findViewById? - PullRequest
1 голос
/ 23 октября 2019

Например,

((MyView)view.findViewById(R.id.my_view)).doSomething()

конвертируется в

(view.findViewById(R.id.my_view) as MyView).doSomething()

Пока я хочу, чтобы оно было

view.findViewById<MyView>(R.id.my_view).doSomething()

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

Конвертер Java в Kotlin работает правильно, он выдает эквивалентный код. Ваш Java-код содержит явные приведения, код Kotlin также будет включать их.

Если вы хотите описанное поведение, сначала перейдите к общему синтаксису Android 9 findViewById.

Затем этот код Java

// Old
final TextView view0 = (TextView)activity.findViewById(id);
// New
final View     view1 = activity.findViewById(id);
final TextView view2 = activity.findViewById(id);
// Not useful
final View     view3 = activity.<TextView>findViewById(id);

преобразует в этот код Котлина

val view0 = activity.findViewById<View>(id) as TextView
val view1 = activity.findViewById<View>(id)
val view2 = activity.findViewById<TextView>(id)
val view3 = activity.findViewById<TextView>(id)
0 голосов
/ 23 октября 2019

Вы можете включить предупреждение для кода, подобного этому.

Перейдите в (Настройки -> Редактор -> Проверки -> Kotlin Android -> Приведение можно преобразовать в findViewById с параметром типа) и переключите серьезность напредупреждение.

Я не думаю, что самому организатору можно научить, что этот конкретный состав должен быть преобразован во что-то другое. И на самом деле, я бы сказал, что это ожидаемое поведение.

Обратите внимание, что выше Android SDK 28 вам не нужно это приведение даже в java:

public void hideChildTextView(View parent, @IdRes int id) {
    TextView view = parent.findViewById(id);
    view.setVisibility(View.GONE);
}

Этот код будет переведенto:

fun hideChildTextView(parent: View, @IdRes id: Int) {
    val view = parent.findViewById<TextView>(id)
    view.visibility = View.GONE
}

Это потому, что тип может быть получен из файлового типа, и нет необходимости в приведении (или он фактически приводится в библиотеке).

Итак, давайте проверим другой код в SDKниже 28:

public void hideChildTextView2(View parent, @IdRes int id) {
    TextView view = (TextView) parent.findViewById(id);
    view.setVisibility(View.GONE);
}

Это будет преобразовано в:

fun hideChildTextView2(parent: View, @IdRes id: Int) {
    val view = parent.findViewById(id) as TextView
    view.visibility = View.GONE
}

Итак, почему это так? метод findViewById ниже android 28 возвращает просто View (так что нам нужно привести его к правильному типу), но выше возвращает <T extends View>, так что компилятор может сделать autocast.

Итак, что я бы предложил? Обновите ваш SDK для компиляции / назначения до 28+, очистите код на Java, и тогда он будет работать так, как вы хотите. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...