├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── values │ │ │ │ ├── strings.xml │ │ │ │ ├── colors.xml │ │ │ │ └── themes.xml │ │ │ ├── anim │ │ │ │ ├── slide_in_left.xml │ │ │ │ └── slide_out_right.xml │ │ │ ├── layout │ │ │ │ ├── item_answer.xml │ │ │ │ ├── activity_result.xml │ │ │ │ ├── activity_main.xml │ │ │ │ └── fragment_question.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── drawable │ │ │ │ ├── circle_shape.xml │ │ │ │ ├── circle_progress_foreground.xml │ │ │ │ ├── bg_button.xml │ │ │ │ └── ic_launcher_background.xml │ │ │ ├── values-night │ │ │ │ └── themes.xml │ │ │ └── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── cursokotlin │ │ │ │ └── quizapp │ │ │ │ ├── OnQuestionActionListener.kt │ │ │ │ ├── QuestionData.kt │ │ │ │ ├── CircularAnimation.kt │ │ │ │ ├── ui │ │ │ │ ├── answer │ │ │ │ │ ├── AnswerViewHolder.kt │ │ │ │ │ └── AnswerAdapter.kt │ │ │ │ └── ResultActivity.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── QuestionProvider.kt │ │ │ │ └── QuestionFragment.kt │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── cursokotlin │ │ │ └── quizapp │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── com │ │ └── cursokotlin │ │ └── quizapp │ │ └── ExampleInstrumentedTest.kt ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── .idea ├── .gitignore ├── codeStyles │ ├── codeStyleConfig.xml │ └── Project.xml ├── compiler.xml ├── vcs.xml ├── misc.xml ├── gradle.xml └── jarRepositories.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── gradle.properties ├── gradlew.bat └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | rootProject.name = "QuizApp" -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArisGuimera/EasyQuiz/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArisGuimera/EasyQuiz/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArisGuimera/EasyQuiz/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArisGuimera/EasyQuiz/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArisGuimera/EasyQuiz/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArisGuimera/EasyQuiz/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArisGuimera/EasyQuiz/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArisGuimera/EasyQuiz/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArisGuimera/EasyQuiz/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArisGuimera/EasyQuiz/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArisGuimera/EasyQuiz/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /app/src/main/java/com/cursokotlin/quizapp/OnQuestionActionListener.kt: -------------------------------------------------------------------------------- 1 | package com.cursokotlin.quizapp 2 | 3 | interface OnQuestionActionListener { 4 | fun onAnswerClicked(answer:AnswerData) 5 | } -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | QuizApp 3 | 4 | Hello blank fragment 5 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_left.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_right.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Jan 02 18:22:42 CET 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_answer.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/cursokotlin/quizapp/QuestionData.kt: -------------------------------------------------------------------------------- 1 | package com.cursokotlin.quizapp 2 | 3 | import java.io.Serializable 4 | 5 | data class QuestionData(val header:String, val title:String, val answers:List):Serializable 6 | data class AnswerData(val title:String, val isCorrect:Boolean):Serializable -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_shape.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_progress_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/test/java/com/cursokotlin/quizapp/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.cursokotlin.quizapp 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/cursokotlin/quizapp/CircularAnimation.kt: -------------------------------------------------------------------------------- 1 | package com.cursokotlin.quizapp 2 | 3 | import android.view.animation.Animation 4 | import android.view.animation.Transformation 5 | import android.widget.ProgressBar 6 | 7 | 8 | class CircularAnimation( 9 | private val progressBar: ProgressBar, 10 | private val from: Int = 0, 11 | private val to: Int 12 | ) : Animation() { 13 | 14 | override fun applyTransformation( 15 | interpolatedTime: Float, 16 | t: Transformation? 17 | ) { 18 | super.applyTransformation(interpolatedTime, t) 19 | val value = from + (to - from) * interpolatedTime 20 | progressBar.progress = value.toInt() 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cursokotlin/quizapp/ui/answer/AnswerViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.cursokotlin.quizapp.ui.answer 2 | 3 | import android.view.View 4 | import android.widget.Button 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.cursokotlin.quizapp.AnswerData 7 | import com.cursokotlin.quizapp.R 8 | 9 | class AnswerViewHolder(view:View) : RecyclerView.ViewHolder(view) { 10 | 11 | val btnAnswer: Button = view.findViewById(R.id.btnAnswer) 12 | 13 | fun render( 14 | answerData: AnswerData, 15 | onAnswerSelected: (AnswerData, Int) -> Unit 16 | ){ 17 | btnAnswer.text = answerData.title 18 | btnAnswer.setOnClickListener { 19 | onAnswerSelected(answerData, adapterPosition) 20 | } 21 | 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/com/cursokotlin/quizapp/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.cursokotlin.quizapp 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.cursokotlin.quizapp", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 14 | 16 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/cursokotlin/quizapp/ui/answer/AnswerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cursokotlin.quizapp.ui.answer 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.cursokotlin.quizapp.AnswerData 7 | import com.cursokotlin.quizapp.R 8 | 9 | class AnswerAdapter( 10 | val answer: List, 11 | val onAnswerSelected: (AnswerData, Int) -> Unit 12 | ): RecyclerView.Adapter(){ 13 | 14 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnswerViewHolder { 15 | val layoutInflater = LayoutInflater.from(parent.context) 16 | return AnswerViewHolder(layoutInflater.inflate(R.layout.item_answer, parent, false)) 17 | } 18 | 19 | override fun getItemCount(): Int = answer.size 20 | 21 | override fun onBindViewHolder(holder: AnswerViewHolder, position: Int) { 22 | val item = answer[position] 23 | holder.render(item, onAnswerSelected) 24 | } 25 | 26 | fun disableOptions(){ 27 | 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | #00FF05 11 | #FF0000 12 | #fa8c0c 13 | #6976e1 14 | 15 | #393939 16 | #636363 17 | #131313 18 | #f98909 19 | #ffba47 20 | #c05b00 21 | #ffffff 22 | #000000 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | id 'kotlin-android' 4 | } 5 | 6 | android { 7 | compileSdkVersion 29 8 | buildToolsVersion "29.0.3" 9 | 10 | defaultConfig { 11 | applicationId "com.cursokotlin.quizapp" 12 | minSdkVersion 21 13 | targetSdkVersion 29 14 | versionCode 1 15 | versionName "1.0" 16 | 17 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 18 | } 19 | 20 | buildTypes { 21 | release { 22 | minifyEnabled false 23 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 24 | } 25 | } 26 | compileOptions { 27 | sourceCompatibility JavaVersion.VERSION_1_8 28 | targetCompatibility JavaVersion.VERSION_1_8 29 | } 30 | kotlinOptions { 31 | jvmTarget = '1.8' 32 | } 33 | 34 | buildFeatures{ 35 | viewBinding = true 36 | } 37 | } 38 | 39 | dependencies { 40 | 41 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 42 | implementation 'androidx.core:core-ktx:1.3.2' 43 | implementation 'androidx.appcompat:appcompat:1.2.0' 44 | implementation 'com.google.android.material:material:1.2.1' 45 | implementation 'androidx.constraintlayout:constraintlayout:2.0.4' 46 | implementation 'com.github.bumptech.glide:glide:4.11.0' 47 | implementation 'androidx.legacy:legacy-support-v4:1.0.0' 48 | annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' 49 | testImplementation 'junit:junit:4.+' 50 | androidTestImplementation 'androidx.test.ext:junit:1.1.2' 51 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 52 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_result.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 21 | 22 | 33 | 34 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | 16 | 26 | 27 | 37 | 38 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/cursokotlin/quizapp/ui/ResultActivity.kt: -------------------------------------------------------------------------------- 1 | package com.cursokotlin.quizapp.ui 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.os.Bundle 6 | import androidx.appcompat.app.AppCompatActivity 7 | import com.cursokotlin.quizapp.CircularAnimation 8 | import com.cursokotlin.quizapp.MainActivity 9 | import com.cursokotlin.quizapp.databinding.ActivityResultBinding 10 | 11 | class ResultActivity : AppCompatActivity() { 12 | 13 | companion object { 14 | private const val RESULT_DATA = "result_data" 15 | private const val SIZE_DATA = "size_data" 16 | 17 | fun create(context: Context, result: Int, size: Int): Intent { 18 | return Intent(context, ResultActivity::class.java).apply { 19 | putExtra(RESULT_DATA, result) 20 | putExtra(SIZE_DATA, size) 21 | } 22 | } 23 | } 24 | 25 | private val count by lazy { intent.getIntExtra(RESULT_DATA, 0) } 26 | private val size by lazy { intent.getIntExtra(SIZE_DATA, 0) } 27 | private lateinit var binding: ActivityResultBinding 28 | 29 | override fun onCreate(savedInstanceState: Bundle?) { 30 | super.onCreate(savedInstanceState) 31 | binding = ActivityResultBinding.inflate(layoutInflater) 32 | setContentView(binding.root) 33 | initUI() 34 | } 35 | 36 | private fun initUI() { 37 | initListeners() 38 | showResult() 39 | } 40 | 41 | private fun showResult() { 42 | binding.tvResult.text = getTextFromResult(count) 43 | animateProgressResult(count) 44 | } 45 | 46 | private fun initListeners() { 47 | binding.btnBack.setOnClickListener { resetTest() } 48 | } 49 | 50 | private fun animateProgressResult(count:Int){ 51 | val result = (count*100)/size 52 | val anim = CircularAnimation( progressBar = binding.pbLvl, to = result) 53 | anim.duration = 1000 54 | binding.pbLvl.startAnimation(anim) 55 | } 56 | 57 | private fun getTextFromResult(count: Int): String { 58 | return when (count) { 59 | in 0..3 -> "JUNIOR" 60 | in 4..5 -> "MID" 61 | in 6..Int.MAX_VALUE -> "SENIOR DE MANUAL" 62 | else -> "" 63 | } 64 | } 65 | 66 | private fun resetTest(){ 67 | startActivity(MainActivity.create(this)) 68 | } 69 | 70 | override fun onBackPressed() { 71 | resetTest() 72 | } 73 | } -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 18 | 29 | 30 | 42 | 43 | 50 | 51 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_question.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 20 | 21 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 70 | 71 | -------------------------------------------------------------------------------- /app/src/main/java/com/cursokotlin/quizapp/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.cursokotlin.quizapp 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import androidx.appcompat.app.AppCompatActivity 6 | import android.os.Bundle 7 | import android.os.Handler 8 | 9 | import com.cursokotlin.quizapp.databinding.ActivityMainBinding 10 | import com.cursokotlin.quizapp.ui.ResultActivity 11 | 12 | class MainActivity : AppCompatActivity(), OnQuestionActionListener { 13 | 14 | //Color respuesta correcta/incorrecta 15 | //boton volver??? 16 | //PUBLICIDAD 17 | //ICONO 18 | //TRADUCCIONES 19 | //NOMBRE APP 20 | 21 | companion object { 22 | fun create(context: Context): Intent { 23 | return Intent(context, MainActivity::class.java).apply { 24 | flags = Intent.FLAG_ACTIVITY_CLEAR_TOP 25 | } 26 | } 27 | } 28 | 29 | private lateinit var binding: ActivityMainBinding 30 | private val questions = QuestionProvider.getQuestions() 31 | private var count:Int = 0 32 | private var questionPosition = 0 33 | 34 | override fun onCreate(savedInstanceState: Bundle?) { 35 | super.onCreate(savedInstanceState) 36 | binding = ActivityMainBinding.inflate(layoutInflater) 37 | setContentView(binding.root) 38 | initUI() 39 | } 40 | 41 | private fun initUI() { 42 | initToolbar() 43 | showNewQuestion(questions.first()) 44 | binding.tvPoints.text = "$count puntos" 45 | updateSteps() 46 | } 47 | 48 | private fun initToolbar() { 49 | setSupportActionBar(binding.toolbar) 50 | supportActionBar?.title = "Kotlin test" 51 | } 52 | 53 | private fun updateSteps() { 54 | binding.tvSteps.text = " ${questionPosition+1} de ${questions.size}" 55 | } 56 | 57 | private fun setPoints() { 58 | count += 1 59 | binding.tvPoints.text = "$count puntos" 60 | } 61 | 62 | private fun nextQuestion() { 63 | questionPosition += 1 64 | if(questions.size <= questionPosition){ 65 | goToResult() 66 | }else{ 67 | showNewQuestion(questions[questionPosition]) 68 | } 69 | } 70 | 71 | private fun goToResult() { 72 | startActivity(ResultActivity.create(this, count, questions.size)) 73 | } 74 | 75 | private fun showNewQuestion(questionData: QuestionData) { 76 | updateSteps() 77 | val fragmentTransaction = supportFragmentManager.beginTransaction() 78 | fragmentTransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right) 79 | fragmentTransaction.replace(R.id.container, QuestionFragment.newInstance(questionData)) 80 | fragmentTransaction.commit() 81 | } 82 | 83 | override fun onAnswerClicked(answer:AnswerData) { 84 | Handler().postDelayed( 85 | { 86 | updateView(answer) 87 | }, 88 | 400 // value in milliseconds 89 | ) 90 | } 91 | 92 | private fun updateView(answer: AnswerData) { 93 | if(answer.isCorrect){ 94 | setPoints() 95 | } 96 | nextQuestion() 97 | } 98 | 99 | 100 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cursokotlin/quizapp/QuestionProvider.kt: -------------------------------------------------------------------------------- 1 | package com.cursokotlin.quizapp 2 | 3 | class QuestionProvider { 4 | companion object { 5 | fun getQuestions(): List { 6 | 7 | return listOf( 8 | QuestionData( 9 | header = "https://hipertextual.com/files/2019/06/hipertextual-kotlin-lenguaje-oficial-android-que-quiere-comerse-java-2019922347.jpg", 10 | title = "Usamos la palabra reservada var para...", 11 | answers = listOf( 12 | AnswerData(title = "Variable", isCorrect = true), 13 | AnswerData(title = "Valor constante", isCorrect = false) 14 | ) 15 | ), 16 | QuestionData( 17 | header = "https://i.pinimg.com/564x/e1/7e/13/e17e13c695f6c35d4756d7da29b6bf7f.jpg", 18 | title = "Esto es una prueba", 19 | answers = listOf( 20 | AnswerData(title = "Variable", isCorrect = true), 21 | AnswerData(title = "Valor constante", isCorrect = false), 22 | AnswerData(title = "Compilar la app", isCorrect = false) 23 | ) 24 | ), 25 | QuestionData( 26 | header = "https://i2.wp.com/thehappening.com/wp-content/uploads/2018/12/sombreros-perritos-7.jpg?fit=1024%2C694&ssl=1", 27 | title = "Esto es una prueba", 28 | answers = listOf( 29 | AnswerData(title = "adw", isCorrect = true), 30 | AnswerData(title = "adwd constante", isCorrect = false), 31 | AnswerData(title = "Compilar dawd app", isCorrect = false) 32 | ) 33 | ), 34 | QuestionData( 35 | header = "https://cursokotlin.com/wp-content/uploads/2020/09/Webp.net-compress-image.jpg", 36 | title = "adw...", 37 | answers = listOf( 38 | AnswerData(title = "Variable", isCorrect = true), 39 | AnswerData(title = "Valor constante", isCorrect = false), 40 | AnswerData(title = "Crear una función", isCorrect = false), 41 | AnswerData(title = "Compilar la app", isCorrect = false) 42 | ) 43 | ), 44 | QuestionData( 45 | header = "https://i.pinimg.com/564x/e1/7e/13/e17e13c695f6c35d4756d7da29b6bf7f.jpg", 46 | title = "Esto es dqwdba", 47 | answers = listOf( 48 | AnswerData(title = "Variable", isCorrect = true), 49 | AnswerData(title = "Valor constante", isCorrect = false), 50 | AnswerData(title = "Crear una función", isCorrect = false), 51 | AnswerData(title = "Compilar la app", isCorrect = false) 52 | ) 53 | ), 54 | QuestionData( 55 | header = "https://i2.wp.com/thehappening.com/wp-content/uploads/2018/12/sombreros-perritos-7.jpg?fit=1024%2C694&ssl=1", 56 | title = "Esto es unqwdeueba", 57 | answers = listOf( 58 | AnswerData(title = "adw", isCorrect = true), 59 | AnswerData(title = "adwd constante", isCorrect = false), 60 | AnswerData(title = "dwad una función", isCorrect = false), 61 | AnswerData(title = "Compilar dawd app", isCorrect = false) 62 | ) 63 | ) 64 | ) 65 | } 66 | } 67 | } -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 119 | 120 | 122 | 123 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/java/com/cursokotlin/quizapp/QuestionFragment.kt: -------------------------------------------------------------------------------- 1 | package com.cursokotlin.quizapp 2 | 3 | import android.content.Context 4 | import android.graphics.Color 5 | import android.os.Bundle 6 | import android.text.Spannable 7 | import android.text.SpannableString 8 | import android.text.style.BackgroundColorSpan 9 | import android.text.style.ForegroundColorSpan 10 | import android.text.style.StyleSpan 11 | import android.view.LayoutInflater 12 | import android.view.View 13 | import android.view.ViewGroup 14 | import android.widget.Button 15 | import androidx.core.content.ContextCompat 16 | import androidx.fragment.app.Fragment 17 | import androidx.recyclerview.widget.LinearLayoutManager 18 | import com.bumptech.glide.Glide 19 | import com.cursokotlin.quizapp.databinding.FragmentQuestionBinding 20 | import com.cursokotlin.quizapp.ui.answer.AnswerAdapter 21 | import com.cursokotlin.quizapp.ui.answer.AnswerViewHolder 22 | 23 | 24 | class QuestionFragment : Fragment() { 25 | 26 | private var _binding:FragmentQuestionBinding? = null 27 | private val binding get() = _binding!! 28 | 29 | private var listener: OnQuestionActionListener? = null 30 | 31 | lateinit var adapter:AnswerAdapter 32 | 33 | lateinit var question:QuestionData 34 | 35 | override fun onCreate(savedInstanceState: Bundle?) { 36 | super.onCreate(savedInstanceState) 37 | arguments?.let { 38 | question = it.getSerializable(INTENT_QUESTION) as QuestionData 39 | } 40 | } 41 | 42 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 43 | super.onViewCreated(view, savedInstanceState) 44 | initQuestion(question) 45 | } 46 | 47 | override fun onCreateView( 48 | inflater: LayoutInflater, container: ViewGroup?, 49 | savedInstanceState: Bundle? 50 | ): View? { 51 | _binding = FragmentQuestionBinding.inflate(inflater, container, false) 52 | return binding.root 53 | } 54 | 55 | // private fun disableAnswer(){ 56 | // 57 | // fo 58 | // adapter.itemCount 59 | // } 60 | 61 | private fun initTitleQuestion(title: String) { 62 | binding.tvQuestion.text = title 63 | } 64 | 65 | private fun initImageQuestion(header: String) { 66 | if (header.isNotEmpty()) { 67 | Glide.with(this).load(header).into(binding.ivHeader) 68 | } 69 | } 70 | 71 | private fun checkIsCorrect(answer:AnswerData, button: Button){ 72 | if(answer.isCorrect){ 73 | button.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.green)) 74 | }else{ 75 | button.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.red)) 76 | } 77 | // disableAnswer() 78 | } 79 | 80 | 81 | private fun initQuestion(questions: QuestionData) { 82 | initImageQuestion(questions.header) 83 | // initTitleQuestion(questions.title) 84 | formatQuestion(questions.title) 85 | initAnswerQuestion(questions.answers) 86 | } 87 | 88 | private fun initAnswerQuestion(answers: List) { 89 | binding.rvAnswer.layoutManager = LinearLayoutManager(requireContext()) 90 | adapter = AnswerAdapter(answers) { answerData, position -> onAnswerSelected(answerData, position)} 91 | binding.rvAnswer.adapter = adapter 92 | 93 | // if (answers.size == 4) { 94 | // binding.btn1.text = answers[0].title 95 | // binding.btn2.text = answers[1].title 96 | // binding.btn3.text = answers[2].title 97 | // binding.btn4.text = answers[3].title 98 | // 99 | // 100 | // binding.btn1.setOnClickListener { 101 | // checkIsCorrect(answers[0], binding.btn1) 102 | // } 103 | // binding.btn2.setOnClickListener { 104 | // checkIsCorrect(answers[1], binding.btn2) 105 | // } 106 | // binding.btn3.setOnClickListener { 107 | // checkIsCorrect(answers[2], binding.btn3) 108 | // } 109 | // binding.btn4.setOnClickListener { 110 | // checkIsCorrect(answers[3], binding.btn4) 111 | // } 112 | // } 113 | } 114 | 115 | private fun onAnswerSelected(result: AnswerData, position: Int) { 116 | val viewHolder = binding.rvAnswer.findViewHolderForAdapterPosition(position) 117 | checkIsCorrect(result, (viewHolder as AnswerViewHolder).btnAnswer) 118 | 119 | 120 | 121 | 122 | listener?.onAnswerClicked(result) 123 | } 124 | 125 | 126 | override fun onAttach(context: Context) { 127 | super.onAttach(context) 128 | if (context is OnQuestionActionListener) { 129 | listener = context 130 | } 131 | } 132 | 133 | override fun onDetach() { 134 | super.onDetach() 135 | listener = null 136 | } 137 | 138 | fun formatQuestion(question:String){ 139 | // Usamos la palabra reservada var para... 140 | val parts = question.split("") 141 | if(parts.size == 1){ 142 | // return SpannableString(parts[0]) 143 | }else if(parts.size == 3){ 144 | val spannable = SpannableString("${parts[0]} ${parts[1]} ${parts[2]}") 145 | 146 | spannable.setSpan( 147 | ForegroundColorSpan(ContextCompat.getColor(activity as Context, R.color.orange)), 148 | parts[0].length +1, parts[0].length + parts[1].length +1, 149 | Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) 150 | 151 | spannable.setSpan( 152 | BackgroundColorSpan(ContextCompat.getColor(activity as Context, R.color.primaryDarkColor)), 153 | parts[0].length +1, parts[0].length + parts[1].length +1, 154 | Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) 155 | 156 | spannable.setSpan( 157 | StyleSpan(android.graphics.Typeface.NORMAL), 158 | parts[0].length +1, parts[0].length + parts[1].length +1, 159 | Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) 160 | 161 | // spannable.setSpan( 162 | // ForegroundColorSpan(Color.RED), 163 | // 0, 2, 164 | // Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) 165 | // 166 | binding.tvQuestion.text = spannable 167 | } 168 | } 169 | 170 | 171 | companion object { 172 | 173 | const val INTENT_QUESTION = "intent_question" 174 | 175 | @JvmStatic 176 | fun newInstance(question: QuestionData) = 177 | QuestionFragment().apply { 178 | arguments = Bundle().apply { 179 | putSerializable(INTENT_QUESTION, question) 180 | } 181 | } 182 | } 183 | } --------------------------------------------------------------------------------