Вызов java-класса из активности kotlin

Я работаю над проектом в Android Studio. У меня есть основная активность внутри файла kotlin (MainActivity.kt), и из него я пытаюсь вызвать статический метод (start_netClient ()) изнутри файла java (dists.java) через объект Intent, поместив этого слушателя для моего кнопка внутри onCreate () MainActivity:

        bbutton.setOnClickListener(object: View.OnClickListener {
        override fun onClick(view: View): Unit {
            // Handler code here.
            val intent = Intent(this, Net_Activity::class.java)
            startActivity(intent)
        }
    })

Net_Activity и его содержимое:

class Net_Activity: AppCompatActivity() {

fun main(args: Array<String>) {
    dists.start_netClient()
}
}

Что я получаю для этого кода во время сборки, так это ошибка Intent на MainActivity.kt:

Error:(65, 30) None of the following functions can be called with the arguments supplied:
public constructor Intent(p0: Context!, p1: Class<*>!) defined in android.content.Intent
public constructor Intent(p0: String!, p1: Uri!) defined in android.content.Intent

Я относительно новичок во всем, что касается Android, но что мне не хватает, и как можно связать java-метод и класс kotlin через Intent? Лучше всего использовать два Activity или есть другой подход?

Чего вы пытаетесь достичь в своем Net_Activity? Почему у него есть эта функция main(args: Array<String>)?

Yosi Pramajaya 10.06.2018 02:42

Я пытаюсь вызвать метод start_netClient () из класса dists, который является классом java.

Efthimis_28 10.06.2018 02:46

И ммм, вы уверены, что это все содержимое Net_Activity?

Yosi Pramajaya 10.06.2018 02:50

У меня есть импорт над объявлением Activity, я вставил его в AndroidManifest, но все ясно. Есть ли что-то, что я должен был включить внутри, что соответствует ошибке конструкции Intent?

Efthimis_28 10.06.2018 02:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
3 797
2

Ответы 2

Попробуйте еще раз прочитать основы создания Activity из документации разработчика Android. Прочтите здесь

Kotlin разработан с учетом 100% совместимости с Java. Это означает, что вы можете просто вызвать любой Java-класс или методы из Kotlin, и наоборот. Таким образом, вы даже можете сделать Activity на основе Kotlin вместе с активностью на основе Java, и это будет вам полезно. Хотя я рекомендую вам просто использовать 100% Kotlin, так как его намного проще разрабатывать и читать.

Попробуй это:

  1. Измените ваш Net_Activity на NetActivity. Это намного лучше для глаз. Не забудьте сменить AndroidManifest.xml

  2. Измените свой setOnClickListener на

    bButton.setOnClickListener {
        // Handler code here.
       val intent = Intent(this, NetActivity::class.java)
       startActivity(intent)
    }
    
  3. Есть ли у вас функция main в вашем NetActivity, как в public static void main(String[] args)? Это не то, как вы это делаете. Вы можете переопределить другой метод Activity, такой как onCreate(), onResume() и т. д. Попробуйте прочитать Основы приложений еще раз.

Похоже, что когда вы используете this, вы ссылаетесь на объект слушателя (View.OnClickListener), а не на свою активность. Вы можете исправить это, используя this@Net_Activity, который ссылается на вашу активность, а не на слушателя. Полная строка должна выглядеть так:

val intent = Intent(this@Net_Activity, Net_Activity::class.java)

Когда вы объявляете объект в Kotlin (с помощью ключевого слова object), вы определяете анонимный класс, а затем создаете единственный экземпляр этого класса. Это позволяет вам переопределять методы для таких вещей, как слушатели, но, как вы обнаружили, это означает, что вам нужно дважды проверить свое использование this.

Я добавил строку как: val intent = Intent (this @ MainActivity, Net_Activity :: class.java). Как вы подсказали, я получил неразрешенную ссылку на Net_Activity. (Объявление намерения val находится внутри MainActivity, а не Net_Activity.) Является ли такой способ мышления правильным, поскольку Net_Activity является активностью kotlin, а не классом java?

Efthimis_28 10.06.2018 13:12

Ах, я думал, ваш код находится в Net_Activity - это должно быть правильно.

apetranzilla 10.06.2018 19:14

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