The Java code is from Big Nerd Ranch Android Programing Chapter 2. I will walk you through how to enable and use kotlin in the main activity
If you would like to see entire code I will post it on my Github
package com.givechuckajob.geoquiz;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class QuizActivity extends AppCompatActivity {
private Button mTrueButton;
private Button mFalseButton;
private Button mNextButton;
private TextView mQuestionTextView;
private Question[] mQuestionBank = new Question[]
{
new Question(R.string.question_australia,true),
new Question(R.string.question_oceans,true),
new Question(R.string.question_mideast,false),
new Question(R.string.question_africa,false),
new Question(R.string.question_americas,true),
new Question(R.string.question_asia,true),
};
private int mCurrentIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
mQuestionTextView = findViewById(R.id.question_text_view);
mNextButton = findViewById(R.id.next_button);
mNextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCurrentIndex = (mCurrentIndex +1) % mQuestionBank.length;
updateQuestion();
}
});
mTrueButton = findViewById(R.id.true_button);
mTrueButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
checkAnswer(true); }
});
mFalseButton =findViewById(R.id.false_button);
mFalseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
checkAnswer(false); }
});
updateQuestion();
}
private void updateQuestion() {
int question = mQuestionBank[mCurrentIndex].getTextResId();
mQuestionTextView.setText(question);
}
private void checkAnswer(boolean userPressedTrue){
boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();
int messageResId = 0;
if(userPressedTrue == answerIsTrue) {
messageResId = R.string.correct_toast;
}
else {
messageResId = R.string.incorrect_toast;
}
Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show();
}
}
package com.givechuckajob.geoquiz
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
class QuizActivity : AppCompatActivity() {
private var mTrueButton: Button? = null
private var mFalseButton: Button? = null
private var mNextButton: Button? = null
private var mQuestionTextView: TextView? = null
private val mQuestionBank = arrayOf(Question(R.string.question_australia, true), Question(R.string.question_oceans, true), Question(R.string.question_mideast, false), Question(R.string.question_africa, false), Question(R.string.question_americas, true), Question(R.string.question_asia, true))
private var mCurrentIndex = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_quiz)
mQuestionTextView = findViewById(R.id.question_text_view)
mNextButton = findViewById(R.id.next_button)
mNextButton!!.setOnClickListener {
mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.size
updateQuestion()
}
mTrueButton = findViewById(R.id.true_button)
mTrueButton!!.setOnClickListener { checkAnswer(true) }
mFalseButton = findViewById(R.id.false_button)
mFalseButton!!.setOnClickListener { checkAnswer(false) }
updateQuestion()
}
private fun updateQuestion() {
val question = mQuestionBank[mCurrentIndex].textResId
mQuestionTextView!!.setText(question)
}
private fun checkAnswer(userPressedTrue: Boolean) {
val answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue
var messageResId = 0
if (userPressedTrue == answerIsTrue) {
messageResId = R.string.correct_toast
} else {
messageResId = R.string.incorrect_toast
}
Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show()
}
}
AAAA what happened to my semi colons hehe. It looks good but we can improve it more. Notice how we are have properties like mTruebutton up top being declared null let's see if we can fix that.
package com.givechuckajob.geoquiz
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
class QuizActivity : AppCompatActivity() {
lateinit private var mQuestionTextView:TextView
lateinit private var mNextButton:Button
lateinit private var mTrueButton:Button
lateinit private var mFalseButton:Button
private val mQuestionBank = arrayOf(Question(R.string.question_australia, true), Question(R.string.question_oceans, true), Question(R.string.question_mideast, false), Question(R.string.question_africa, false), Question(R.string.question_americas, true), Question(R.string.question_asia, true))
private var mCurrentIndex = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_quiz)
mQuestionTextView = findViewById(R.id.question_text_view)
mNextButton = findViewById(R.id.next_button)
mTrueButton = findViewById(R.id.true_button)
mFalseButton = findViewById(R.id.false_button)
mNextButton.setOnClickListener {
mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.size
updateQuestion()
}
mTrueButton.setOnClickListener { checkAnswer(true) }
mFalseButton.setOnClickListener { checkAnswer(false) }
updateQuestion()
}
private fun updateQuestion() {
val question = mQuestionBank[mCurrentIndex].textResId
mQuestionTextView.setText(question)
}
private fun checkAnswer(userPressedTrue: Boolean) {
val answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue
var messageResId = 0;
if (userPressedTrue == answerIsTrue) {
messageResId = R.string.correct_toast
}
else {
messageResId = R.string.incorrect_toast
}
Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show()
}
}
I could do variable inits inline but decided to keep them up top because some are used in other classes. I was faced with how not to declare them null up top but found lateinit on google example. More info can be found at Kotlin Lateinit
Ever get annoyed by the constant findviewbyid, I have a fix for you -- Kotlin Extensions
Look at code below to see how your code will change
package com.givechuckajob.geoquiz
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_quiz.*
class QuizActivity : AppCompatActivity() {
private val mQuestionBank = arrayOf(Question(R.string.question_australia, true), Question(R.string.question_oceans, true), Question(R.string.question_mideast, false), Question(R.string.question_africa, false), Question(R.string.question_americas, true), Question(R.string.question_asia, true))
private var mCurrentIndex = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_quiz)
next_button.setOnClickListener {
mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.size
updateQuestion()
}
true_button.setOnClickListener { checkAnswer(true) }
false_button.setOnClickListener { checkAnswer(false) }
updateQuestion()
}
private fun updateQuestion() {
val question = mQuestionBank[mCurrentIndex].textResId
question_text_view.setText(question)
}
private fun checkAnswer(userPressedTrue: Boolean) {
val answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue
var messageResId = 0
if (userPressedTrue == answerIsTrue) {
messageResId = R.string.correct_toast
}
else {
messageResId = R.string.incorrect_toast
}
Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show()
}
}
One import statement then no more declaring view variables, they can just be assigned on the fly