diff --git a/README.md b/README.md index 58578cd..564233d 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,21 @@ This repository is a part of AscendMoney's Basic Android Development Course. It is published for people who are interested to learn basic Android development. ## Preparation -Please fork this repository and download any required programs before starting the workshop. -Optional : Also prepare your Android device or Android Emulator for running the application. +Please fork this repository and download any required programs before starting the workshop. +Optional: Also prepare your Android device or Android Emulator for running the application. ### Checklist - [Android Studio](https://developer.android.com/studio) : Development Tool - Install Android SDK (Should be automatically downloaded when setup the Android Studio) -- [Create an Android Emulator](https://developer.android.com/studio/run/managing-avds) : For running the application without the real device -- [Connect with an Android Device](https://developer.android.com/studio/debug/dev-options) : If you have an Android Device +- [Create an Android Emulator](https://developer.android.com/studio/run/managing-avds): For running the application without the real device +- [Connect with an Android Device](https://developer.android.com/studio/debug/dev-options): If you have an Android Device + +### Branch +- [main](https://github.com/mikkipastel/android-basic): empty Android Application. +- [activity-lifecycle](https://github.com/mikkipastel/android-basic/tree/activity-lifecycle): application for learning about Android Lifecycle. +- [activity-workshop](https://github.com/mikkipastel/android-basic/tree/activity-workshop): workshop to learn for add activity. +- [fragment-workshop](https://github.com/mikkipastel/android-basic/tree/fragment-workshop): workshop to learn to add fragments. +- [recycler-workshop](https://github.com/mikkipastel/android-basic/tree/recycler-workshop): workshop to learn about RecyclerView and calling with API. ## Content -blog : https://developers.ascendcorp.com/basic-android-development-introduction-with-android-project-fbf754bb4d3a +blog introduction: https://developers.ascendcorp.com/basic-android-development-introduction-with-android-project-fbf754bb4d3a \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5fe1253..0985555 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,9 @@ android:supportsRtl="true" android:theme="@style/Theme.Androidbasic" tools:targetApi="31"> - + <activity + android:name=".SecondActivity" + android:exported="false" /> <activity android:name=".MainActivity" android:exported="true"> @@ -23,7 +25,6 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> - </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/com/ascedncorp/androidbasic/Constant.kt b/app/src/main/java/com/ascedncorp/androidbasic/Constant.kt new file mode 100644 index 0000000..b2e7fb9 --- /dev/null +++ b/app/src/main/java/com/ascedncorp/androidbasic/Constant.kt @@ -0,0 +1,5 @@ +package com.ascedncorp.androidbasic + +object Constant { + const val GLOBAL_INPUT_CACHE_KEY = BuildConfig.APPLICATION_ID + ".input" +} diff --git a/app/src/main/java/com/ascedncorp/androidbasic/MainActivity.kt b/app/src/main/java/com/ascedncorp/androidbasic/MainActivity.kt index a3f208e..7b74014 100644 --- a/app/src/main/java/com/ascedncorp/androidbasic/MainActivity.kt +++ b/app/src/main/java/com/ascedncorp/androidbasic/MainActivity.kt @@ -20,4 +20,8 @@ class MainActivity: AppCompatActivity() { .commit() } } + + companion object { + const val INPUT_TEXT_KEY = "com.ascedncorp.androidbasic.MainActivity.input_text_key" + } } \ No newline at end of file diff --git a/app/src/main/java/com/ascedncorp/androidbasic/MainFragment.kt b/app/src/main/java/com/ascedncorp/androidbasic/MainFragment.kt index 167ccf8..9d55774 100644 --- a/app/src/main/java/com/ascedncorp/androidbasic/MainFragment.kt +++ b/app/src/main/java/com/ascedncorp/androidbasic/MainFragment.kt @@ -1,5 +1,7 @@ package com.ascedncorp.androidbasic +import android.content.Context +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -26,12 +28,33 @@ class MainFragment: Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - + // Get a preferences file of this activity + val preferences = activity?.getPreferences(Context.MODE_PRIVATE) + val sharedPreferences = activity?.getSharedPreferences( + BuildConfig.APPLICATION_ID, + Context.MODE_PRIVATE + ) + // Get last input value + binding.edittext.setText(preferences?.getString(MainActivity.INPUT_TEXT_KEY, null)) + // Set buttons' actions binding.button.setOnClickListener { + // Save the value when this button was clicked + preferences?.edit()?.apply { + putString(MainActivity.INPUT_TEXT_KEY, binding.edittext.text?.toString() ?: "") + apply() + } + sharedPreferences?.edit()?.apply { + putString(Constant.GLOBAL_INPUT_CACHE_KEY, binding.edittext.text?.toString() ?: "") + apply() + } + // Open SecondFragment requireActivity().supportFragmentManager.beginTransaction() .add(R.id.container, SecondFragment.newInstance(binding.edittext.text.toString())) .addToBackStack(null) .commit() } + binding.buttonSecondActivity.setOnClickListener { + startActivity(Intent(requireActivity(), SecondActivity::class.java)) + } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/ascedncorp/androidbasic/SecondActivity.kt b/app/src/main/java/com/ascedncorp/androidbasic/SecondActivity.kt new file mode 100644 index 0000000..a2edbbc --- /dev/null +++ b/app/src/main/java/com/ascedncorp/androidbasic/SecondActivity.kt @@ -0,0 +1,39 @@ +package com.ascedncorp.androidbasic + +import android.content.Context +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.ascedncorp.androidbasic.databinding.ActivitySecondBinding + +class SecondActivity : AppCompatActivity() { + + private val binding: ActivitySecondBinding by lazy { + ActivitySecondBinding.inflate(layoutInflater) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(binding.root) + // The Preferences won't be shared between activities. + val preferencesInput = getPreferences(Context.MODE_PRIVATE).getString( + MainActivity.INPUT_TEXT_KEY, + getString(R.string.second_activity_text) + ) + binding.tvPreferences.text = String.format( + getString(R.string.second_activity_preferences), + preferencesInput + ) + // The SharedPreferences will be shared to the whole application. + val sharedPreferencesInput = getSharedPreferences( + BuildConfig.APPLICATION_ID, + Context.MODE_PRIVATE + ).getString( + Constant.GLOBAL_INPUT_CACHE_KEY, + getString(R.string.second_activity_text) + ) + binding.tvSharedPreferences.text = String.format( + getString(R.string.second_activity_sharedpreferences), + sharedPreferencesInput + ) + } +} diff --git a/app/src/main/res/layout/activity_second.xml b/app/src/main/res/layout/activity_second.xml new file mode 100644 index 0000000..292b23f --- /dev/null +++ b/app/src/main/res/layout/activity_second.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".SecondActivity"> + + <TextView + android:id="@+id/tvPreferences" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginHorizontal="24dp" + android:text="@string/second_activity_text" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toTopOf="@id/tvSharedPreferences" /> + + <TextView + android:id="@+id/tvSharedPreferences" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginHorizontal="24dp" + android:text="@string/second_activity_text" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@id/tvPreferences" + app:layout_constraintBottom_toBottomOf="parent" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 1fd54be..c4cd5ed 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -31,4 +31,14 @@ app:layout_constraintStart_toStartOf="@id/edittext" app:layout_constraintEnd_toEndOf="@id/edittext" /> + <Button + android:id="@+id/buttonSecondActivity" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:text="@string/main_activity_open_second_activity" + app:layout_constraintTop_toBottomOf="@+id/button" + app:layout_constraintStart_toStartOf="@id/edittext" + app:layout_constraintEnd_toEndOf="@id/edittext" /> + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 697000f..8ce0c3e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,7 @@ <resources> <string name="app_name">android-basic</string> + <string name="second_activity_text">Nothing saved</string> + <string name="main_activity_open_second_activity">Second Activity</string> + <string name="second_activity_preferences">Preferences: %s</string> + <string name="second_activity_sharedpreferences">SharedPreferences: %s</string> </resources> \ No newline at end of file