Converting your iOS App to Android Using Kotlin
In this tutorial, you’ll see first-hand how similar these languages are and how simple it is to convert Swift to Kotlin by porting an iOS app to Android. By Lisa Luo.
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Contents
Converting your iOS App to Android Using Kotlin
25 mins
Implementing the BearActivity
Open app ▸ java ▸ com.raywenderlich.pokethebear ▸ BearActivity.kt — your soon-to-be Kotlin version of BearViewController.swift. You'll start modifying this Activity by implementing the helper functions, bearAttack
and reset
. You’ll see in the Swift file that bearAttack
is responsible for setting the UI state, hiding the Poke button for five seconds, and then resetting the screen:
private func bearAttack() {
self.bearImageView.image = imageLiteral(resourceName: "bear5")
self.view.backgroundColor = .red
self.pokeButton.isHidden = true
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(5),
execute: { self.reset() })
}
Copy the function from the iOS project, paste it into the body of the bearAttack
function in the Android project, and then make some minor syntax changes. Make the remaining changes so the body of the Kotlin bearAttack
function looks like this:
private fun bearAttack() {
this.bear_image_view.setImageDrawable(getDrawable(R.drawable.bear5))
this.bear_container.setBackgroundColor(getColor(R.color.red))
this.poke_button.visibility = View.INVISIBLE
this.bear_container.postDelayed({ reset() }, TimeUnit.SECONDS.toMillis(5))
}
The changes you made include:
- Call the
setImageDrawable
function to set the image resource for thebear_image_view
to the bear5.png drawable resource, which is already included in the project in the app ▸ res ▸ drawable folder. - Then call the
setBackgroundColor
function to set thebear_container
view’s background to your predefined color resource,R.color.red
. - Change the
isHidden
property to bevisibility
instead to toggle your button’s visibility toView.INVISIBLE
. - Perhaps the least intuitive change to the code you made is re-writing the
DispatchQueue
action, but have no fear! Android’s sister toasyncAfter
is a simplepostDelayed
action that you set on the viewbear_container
.
Getting close! There is another function to translate from Swift to Kotlin. Repeat the conversion process by copying the body of the Swift reset
function and pasting it into the Android project's BearActivity
class reset
:
self.tapCount = 0
self.bearImageView.image = imageLiteral(resourceName: "bear1")
self.view.backgroundColor = .white
self.pokeButton.isHidden = false
Then make similar changes resulting in:
this.tapCount = 0
this.bear_image_view.setImageDrawable(getDrawable(R.drawable.bear1))
this.bear_container.setBackgroundColor(getColor(R.color.white))
this.poke_button.visibility = View.VISIBLE
The last step to is to copy the body of the pokeButtonTapped
function from the iOS project and paste it into the Android project. This if/else
statement will require very little Android-specific changes, thanks to the similarities between Swift and Kotlin. Make sure the body of your Kotlin pokeButtonClicked
looks like this:
this.tapCount = this.tapCount + 1
if (this.tapCount == 3) {
this.bear_image_view.setImageDrawable(getDrawable(R.drawable.bear2))
} else if (this.tapCount == 7) {
this.bear_image_view.setImageDrawable(getDrawable(R.drawable.bear3))
} else if (this.tapCount == 12) {
this.bear_image_view.setImageDrawable(getDrawable(R.drawable.bear4))
} else if (this.tapCount == 20) {
this.bearAttack()
}
Bonus: This if/else ladder can easily be replaced with more expressive control-flow statements, like a switch
, or when
in Kotlin.
Try it out if you'd like to simplify the logic.
Bonus: This if/else ladder can easily be replaced with more expressive control-flow statements, like a switch
, or when
in Kotlin.
Try it out if you'd like to simplify the logic.
Now all the functions have been ported from the iOS app and translated from Swift to Kotlin. Build and Run the app on a device or in the emulator to give it a go and you can now visit your furry friend behind the Login screen.
Congratulations — you have translated an iOS app into a brand new Android app by converting Swift to Kotlin. You’ve crossed platforms by moving Swift code from an iOS project in Xcode into an Android app in Android Studio, changing Swift to Kotlin! Not many people and developers can say that and that’s pretty neat. :]
Where to Go From Here
Download the fully finished projects using the Download materials button at the top or bottom of this tutorial to see how it went.
If you’re a Swift developer or new to Kotlin in Android, check out the official Kotlin docs to go more in depth with the languages. You already know how to run the Kotlin playground to try out snippets, and there are runnable code widgets written right into the docs. If you are already a Kotlin developer, try writing an app in Swift.
If you enjoyed the side-by-side comparisons of Swift and Kotlin, check out more of them in this article. Your faithful author also gave a quick talk about Swift and Kotlin with an iOS colleague at UIConf, which you can watch here. :]
We hope that you have enjoyed this tutorial on how to convert your iOS app written in Swift to Kotlin creating a whole new Android app. We also hope you continue to explore both languages and both platforms. If you have any questions or comments, please join us the forum discussion below!