From 926f22cd8ed11d5d6318941ab682a1098bec6f80 Mon Sep 17 00:00:00 2001 From: heonniy Date: Thu, 27 Jun 2024 14:59:48 +0900 Subject: [PATCH 01/15] =?UTF-8?q?1.=20doc=20:=20readme=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/README.md b/README.md index cc0acc5a..647d52d1 100644 --- a/README.md +++ b/README.md @@ -1 +1,25 @@ # android-contacts + +Step1 : 연락처 추가 + +[제시된 기능요구사항] + +[목표] +: 간단한 연락처를 구현한다. +* 연락처를 추가한다. +* 이름과 전화번호는 필수 값이다. + * 입력하지 않으면 토스트 메시지를 보여준다. +* 전화번호 입력은 숫자만 가능하다. +* 더보기를 눌러 입력 폼을 확장할 수 있다. + * 생일, 성별, 메모 입력 폼이 등장한다. + * 성별을 둘 중 하나를 선택할 수 있다. +* 저장 버튼을 누르면 '저장이 완료 되었습니다' 라는 토스트 메시지를 보여준다. +* 취소 버튼을 누르면 '취소 되었습니다' 라는 토스트 메시지를 보여준다. + +[나누어진 커밋 단계] +1. doc : ReadMe 파일 추가 +2. feat : 레이아웃 추가 (UI추가) +3. feat : 이름과 전화번호를 입력하지 않을시 토스트 메시지 보내기 구현 +4. feat :더보기를 누를시, 입력폼 확장 구현 +5. feat : 이름과 전화번호를 누를시, ‘저장완료’ 토스트 메시지 보내기 구현 +6. feat : 취소 버튼을 누를시, ‘취소완료’ 토스트 메시지 보내기 구현 From 0cacff4244cbf409f18296f24616edc90be7ac79 Mon Sep 17 00:00:00 2001 From: heonniy Date: Thu, 27 Jun 2024 15:03:26 +0900 Subject: [PATCH 02/15] =?UTF-8?q?2.=20feat=20:=20=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EC=B6=94=EA=B0=80=20(UI=EC=B6=94=EA=B0=80?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_main.xml | 160 +++++++++++++++++++++- 1 file changed, 153 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 24d17df2..d90afbaf 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,19 +1,165 @@ - + + + + + + + + android:layout_gravity="center" + android:layout_margin="20dp" + android:text = "더보기" + android:textSize="20dp" + android:textColor="@color/black" + + /> + + + + + + + + + + + + + + + + + + + + + - + From 4aa7b8b93900b572f8d04d55d1c4d87c664692c1 Mon Sep 17 00:00:00 2001 From: heonniy Date: Thu, 27 Jun 2024 15:06:15 +0900 Subject: [PATCH 03/15] =?UTF-8?q?3.=20feat=20:=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EA=B3=BC=20=EC=A0=84=ED=99=94=EB=B2=88=ED=98=B8=EB=A5=BC=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=84?= =?UTF-8?q?=EC=8B=9C=20=ED=86=A0=EC=8A=A4=ED=8A=B8=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=EB=B3=B4=EB=82=B4=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/kakao/contacts/MainActivity.kt | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 7aae79fe..89234f88 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -1,11 +1,45 @@ package campus.tech.kakao.contacts import android.os.Bundle +import android.view.View +import android.widget.EditText +import android.widget.LinearLayout +import android.widget.TextView +import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.LinearLayoutCompat +import org.w3c.dom.Text +import java.util.jar.Attributes.Name class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + var NameEdit : EditText = findViewById(R.id.NameEdit) + var PhoneNumberEdit : EditText = findViewById(R.id.PhoneNumberEdit) + var MoreText : TextView = findViewById(R.id.MoreText) + var BirthEdit : EditText = findViewById(R.id.BirthEdit) + var MemoEdit : EditText = findViewById(R.id.MemoEdit) + var GenderArea : LinearLayoutCompat = findViewById(R.id.GenderArea) + var SaveText : TextView = findViewById(R.id.SaveText) + var CancleText : TextView = findViewById(R.id.CancleText) + + + SaveText.setOnClickListener { + if (NameEdit.text.toString().trim().isEmpty()){ + Toast + .makeText(this@MainActivity,"이름은 필수값입니다.",Toast.LENGTH_SHORT) + .show() + } + if (PhoneNumberEdit.text.toString().trim().isEmpty()){ + Toast + .makeText(this@MainActivity,"전화번호는 필수값입니다.",Toast.LENGTH_SHORT) + .show() + } + + + } + } } From 844d341ee80716b2de14b7de597cff042b257548 Mon Sep 17 00:00:00 2001 From: heonniy Date: Thu, 27 Jun 2024 15:06:54 +0900 Subject: [PATCH 04/15] =?UTF-8?q?4.=20feat=20:=EB=8D=94=EB=B3=B4=EA=B8=B0?= =?UTF-8?q?=EB=A5=BC=20=EB=88=84=EB=A5=BC=EC=8B=9C,=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=ED=8F=BC=20=ED=99=95=EC=9E=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/campus/tech/kakao/contacts/MainActivity.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 89234f88..4ee285b0 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -25,6 +25,13 @@ class MainActivity : AppCompatActivity() { var SaveText : TextView = findViewById(R.id.SaveText) var CancleText : TextView = findViewById(R.id.CancleText) + MoreText.setOnClickListener { + MoreText.visibility = View.GONE + BirthEdit.visibility = View.VISIBLE + MemoEdit.visibility = View.VISIBLE + GenderArea.visibility = View.VISIBLE + } + SaveText.setOnClickListener { if (NameEdit.text.toString().trim().isEmpty()){ From 0cd276ec6a19442b0cd347336155d131eece2059 Mon Sep 17 00:00:00 2001 From: heonniy Date: Thu, 27 Jun 2024 15:07:26 +0900 Subject: [PATCH 05/15] =?UTF-8?q?5.=20feat=20:=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EA=B3=BC=20=EC=A0=84=ED=99=94=EB=B2=88=ED=98=B8=EB=A5=BC=20?= =?UTF-8?q?=EB=88=84=EB=A5=BC=EC=8B=9C,=20=E2=80=98=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=EC=99=84=EB=A3=8C=E2=80=99=20=ED=86=A0=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=B3=B4=EB=82=B4=EA=B8=B0=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/campus/tech/kakao/contacts/MainActivity.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 4ee285b0..50962478 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -45,6 +45,13 @@ class MainActivity : AppCompatActivity() { .show() } + else + { + Toast + .makeText(this@MainActivity,"저장되었습니다.",Toast.LENGTH_SHORT) + .show() + } + } From 12423559e05a382c56c3bce412308dcc792d9675 Mon Sep 17 00:00:00 2001 From: heonniy Date: Thu, 27 Jun 2024 15:08:24 +0900 Subject: [PATCH 06/15] =?UTF-8?q?6.=20feat=20:=20=EC=B7=A8=EC=86=8C=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=EC=9D=84=20=EB=88=84=EB=A5=BC=EC=8B=9C,=20?= =?UTF-8?q?=E2=80=98=EC=B7=A8=EC=86=8C=EC=99=84=EB=A3=8C=E2=80=99=20?= =?UTF-8?q?=ED=86=A0=EC=8A=A4=ED=8A=B8=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EB=B3=B4=EB=82=B4=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/campus/tech/kakao/contacts/MainActivity.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 50962478..655f06bd 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -25,14 +25,14 @@ class MainActivity : AppCompatActivity() { var SaveText : TextView = findViewById(R.id.SaveText) var CancleText : TextView = findViewById(R.id.CancleText) - MoreText.setOnClickListener { + MoreText.setOnClickListener { MoreText.visibility = View.GONE BirthEdit.visibility = View.VISIBLE MemoEdit.visibility = View.VISIBLE GenderArea.visibility = View.VISIBLE } - + SaveText.setOnClickListener { if (NameEdit.text.toString().trim().isEmpty()){ Toast @@ -51,9 +51,12 @@ class MainActivity : AppCompatActivity() { .makeText(this@MainActivity,"저장되었습니다.",Toast.LENGTH_SHORT) .show() } - - } + CancleText.setOnClickListener{ + Toast + .makeText(this@MainActivity,"취소되었습니다.",Toast.LENGTH_SHORT) + .show() + } } } From f594f3916a0c7531ab8739af627b4e6bc247fcf5 Mon Sep 17 00:00:00 2001 From: heonniy Date: Thu, 27 Jun 2024 15:34:46 +0900 Subject: [PATCH 07/15] =?UTF-8?q?+=20feat=20:=20UI=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EB=90=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=86=8C=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/baseline_cruelty_free_24.xml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/src/main/res/drawable/baseline_cruelty_free_24.xml diff --git a/app/src/main/res/drawable/baseline_cruelty_free_24.xml b/app/src/main/res/drawable/baseline_cruelty_free_24.xml new file mode 100644 index 00000000..b683bda0 --- /dev/null +++ b/app/src/main/res/drawable/baseline_cruelty_free_24.xml @@ -0,0 +1,5 @@ + + + + + From d4650512b5fb84bf495e0fa802f9a926ae8fa505 Mon Sep 17 00:00:00 2001 From: heonniy Date: Fri, 28 Jun 2024 16:17:27 +0900 Subject: [PATCH 08/15] =?UTF-8?q?feat:=20step2=20resource=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20+=20manifest=20=EB=B3=80=EA=B2=BD=EC=82=AC=ED=95=AD?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 11 ++++++++++- app/src/main/res/drawable/circle.png | Bin 0 -> 15961 bytes app/src/main/res/drawable/list_bar.png | Bin 0 -> 6925 bytes app/src/main/res/drawable/yellow_rectengle.png | Bin 0 -> 5440 bytes 4 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/circle.png create mode 100644 app/src/main/res/drawable/list_bar.png create mode 100644 app/src/main/res/drawable/yellow_rectengle.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 89dc9d8b..0fc86934 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,8 +12,17 @@ android:supportsRtl="true" android:theme="@style/Theme.Contacts" tools:targetApi="31"> + + + @@ -23,4 +32,4 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/circle.png b/app/src/main/res/drawable/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..ea512db8eb7229e2d5d8af4d5fbc6bd24384cb11 GIT binary patch literal 15961 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 Date: Fri, 28 Jun 2024 16:17:58 +0900 Subject: [PATCH 09/15] =?UTF-8?q?1.=20doc=20:=20step2=20readme=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 647d52d1..3862fd5a 100644 --- a/README.md +++ b/README.md @@ -23,3 +23,22 @@ Step1 : 연락처 추가 4. feat :더보기를 누를시, 입력폼 확장 구현 5. feat : 이름과 전화번호를 누를시, ‘저장완료’ 토스트 메시지 보내기 구현 6. feat : 취소 버튼을 누를시, ‘취소완료’ 토스트 메시지 보내기 구현 + + +Step2 : 연락처 목록 + +[제시된 기능 요구 사항] +목표 : 간단한 연락처를 구현한다. + +연락처 등록 화면을 구현한다. +연락처를 저장하면 목록에 추가된다. +저장된 연락처가 많을 경우 목록은 스크롤 되어야 한다. +추가된 연락처를 선택하여 상세 화면을 볼 수 있다. +연락처 작성 중 뒤로가기 버튼을 누르면 확인 팝업이 나타난다. +추가된 연락처는 앱을 다시 실행하면 유지되지 않는다. + +1. 연락처 등록 화면 구현 +2. 연락처 저장시, 목록에 추가 기능 구현 +3. 목록 화면 구현 +4. 연락처 목록에서 상세페이지 화면 구현 +5. 상세페이지 보기 기능 구현 \ No newline at end of file From faef3098b0dd2879b84525f9e72bfc7c0997a38c Mon Sep 17 00:00:00 2001 From: heonniy Date: Fri, 28 Jun 2024 16:19:40 +0900 Subject: [PATCH 10/15] =?UTF-8?q?2.=20feat=20:=20=EC=97=B0=EB=9D=BD?= =?UTF-8?q?=EC=B2=98=20=EB=93=B1=EB=A1=9D=20=ED=99=94=EB=A9=B4=20UI=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/plus_screen.xml | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 app/src/main/res/layout/plus_screen.xml diff --git a/app/src/main/res/layout/plus_screen.xml b/app/src/main/res/layout/plus_screen.xml new file mode 100644 index 00000000..ea58fc58 --- /dev/null +++ b/app/src/main/res/layout/plus_screen.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file From 3b3e7f4ddc8466a0523604ca0a8e73e9753ddefb Mon Sep 17 00:00:00 2001 From: heonniy Date: Fri, 28 Jun 2024 16:21:14 +0900 Subject: [PATCH 11/15] =?UTF-8?q?3.=20feat=20:=20=EC=97=B0=EB=9D=BD?= =?UTF-8?q?=EC=B2=98=20=EC=A0=80=EC=9E=A5=EC=8B=9C,=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=EC=97=90=20=EC=B6=94=EA=B0=80=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/kakao/contacts/ContactViewModel.kt | 17 ++++++ .../tech/kakao/contacts/ListActivity.kt | 57 +++++++++++++++++++ .../tech/kakao/contacts/ListViewAdapter.kt | 48 ++++++++++++++++ .../campus/tech/kakao/contacts/contact.kt | 9 +++ 4 files changed, 131 insertions(+) create mode 100644 app/src/main/java/campus/tech/kakao/contacts/ContactViewModel.kt create mode 100644 app/src/main/java/campus/tech/kakao/contacts/ListActivity.kt create mode 100644 app/src/main/java/campus/tech/kakao/contacts/ListViewAdapter.kt create mode 100644 app/src/main/java/campus/tech/kakao/contacts/contact.kt diff --git a/app/src/main/java/campus/tech/kakao/contacts/ContactViewModel.kt b/app/src/main/java/campus/tech/kakao/contacts/ContactViewModel.kt new file mode 100644 index 00000000..ea26088d --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/ContactViewModel.kt @@ -0,0 +1,17 @@ +package campus.tech.kakao.contacts + +import android.util.Log +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class ContactViewModel : ViewModel() { + val contactListLiveData = MutableLiveData>().apply { + value = ContactList + } + + fun addContact(contact: contact) { + ContactList.add(contact) + contactListLiveData.value = ContactList + Log.d("ContactViewModel", "Contact added: ${contact.name}, total contacts: ${ContactList.size}") + } +} diff --git a/app/src/main/java/campus/tech/kakao/contacts/ListActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/ListActivity.kt new file mode 100644 index 00000000..6bee25a6 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/ListActivity.kt @@ -0,0 +1,57 @@ +package campus.tech.kakao.contacts + +import android.content.Intent +import android.os.Bundle +import android.util.Log +import android.widget.ImageButton +import androidx.activity.viewModels +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.DataBindingUtil +import campus.tech.kakao.contacts.databinding.ActivityListBinding + +class ListActivity : AppCompatActivity() { + private lateinit var binding: ActivityListBinding + private val contactViewModel: ContactViewModel by viewModels() + private lateinit var adapter: ListViewAdapter + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = DataBindingUtil.setContentView(this, R.layout.activity_list) + val plusButton: ImageButton = findViewById(R.id.PlusButton) + + initListView() + + plusButton.setOnClickListener { + val intent = Intent(this, MainActivity::class.java) + startActivity(intent) + } + } + + override fun onResume() { + super.onResume() + handleIncomingIntent() + } + + private fun initListView() { + adapter = ListViewAdapter() + binding.listView.adapter = adapter + + contactViewModel.contactListLiveData.observe(this) { contactList -> + adapter.notifyDataSetChanged() + } + } + + private fun handleIncomingIntent() { + val name = intent.getStringExtra("name") ?: "" + val phoneNumber = intent.getStringExtra("phoneNumber") ?: "" + + if (name.isNotEmpty() && phoneNumber.isNotEmpty()) { + Log.d("ListActivity", "New contact: $name, $phoneNumber") + contactViewModel.addContact(contact(name, name[0].toString(), phoneNumber)) + // Intent 데이터를 초기화하여 중복 추가 방지 + intent.removeExtra("name") + intent.removeExtra("phoneNumber") + } + } +} diff --git a/app/src/main/java/campus/tech/kakao/contacts/ListViewAdapter.kt b/app/src/main/java/campus/tech/kakao/contacts/ListViewAdapter.kt new file mode 100644 index 00000000..380be2fd --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/ListViewAdapter.kt @@ -0,0 +1,48 @@ +package campus.tech.kakao.contacts + +import android.content.Intent +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.BaseAdapter +import campus.tech.kakao.contacts.databinding.ContactListBarBinding + +class ListViewAdapter : BaseAdapter() { + + override fun getCount(): Int = ContactList.size + + override fun getItem(position: Int): contact = ContactList[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val binding: ContactListBarBinding + val view: View + + if (convertView == null) { + binding = ContactListBarBinding.inflate(LayoutInflater.from(parent.context), parent, false) + view = binding.root + view.tag = binding + } else { + binding = convertView.tag as ContactListBarBinding + view = convertView + } + + val contact = getItem(position) + binding.NameSpace.text = contact.name + binding.OneNameSpace.text = contact.oneName + binding.TeleSpace.text = contact.phone_number + + // 아이템 클릭 리스너 설정 + view.setOnClickListener { + val context = parent.context + val intent = Intent(context, DetailContact::class.java).apply { + putExtra("name", contact.name) + putExtra("phoneNumber", contact.phone_number) + } + context.startActivity(intent) + } + + return view + } +} diff --git a/app/src/main/java/campus/tech/kakao/contacts/contact.kt b/app/src/main/java/campus/tech/kakao/contacts/contact.kt new file mode 100644 index 00000000..48548913 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/contact.kt @@ -0,0 +1,9 @@ +package campus.tech.kakao.contacts + +var ContactList: MutableList = mutableListOf() + +data class contact( + val name: String, + val oneName: String, + val phone_number: String +) From 91850c4a0be8a0cb5c222989e38c66ab8c8407a4 Mon Sep 17 00:00:00 2001 From: heonniy Date: Fri, 28 Jun 2024 16:22:45 +0900 Subject: [PATCH 12/15] =?UTF-8?q?+)=20feat=20:=20step1=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=9C,=20=EC=97=B0=EB=9D=BD=EC=B2=98?= =?UTF-8?q?=20=EB=93=B1=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= =?UTF-8?q?,gradle=20=EC=88=98=EC=A0=95,=20=EC=97=B0=EB=9D=BD=EC=B2=98?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 18 ++++- .../tech/kakao/contacts/MainActivity.kt | 74 +++++++++---------- .../tech/kakao/contacts/PlusActivity.kt | 22 ++++++ 3 files changed, 73 insertions(+), 41 deletions(-) create mode 100644 app/src/main/java/campus/tech/kakao/contacts/PlusActivity.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c5add08f..ede4a462 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.storage.CacheResetOnProcessCanceled.enabled + plugins { id("com.android.application") id("org.jetbrains.kotlin.android") @@ -22,7 +24,7 @@ android { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", + "proguard-rules.pro" ) } } @@ -33,15 +35,27 @@ android { kotlinOptions { jvmTarget = "17" } + + buildFeatures { + viewBinding = true + dataBinding = true + } } dependencies { - implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.android.material:material:1.11.0") implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation("androidx.activity:activity:1.8.0") + implementation("androidx.databinding:databinding-runtime:8.5.0") + + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1") + implementation("androidx.fragment:fragment-ktx:1.6.1") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + + + } diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 655f06bd..a4356f80 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -1,62 +1,58 @@ package campus.tech.kakao.contacts +import android.content.Intent import android.os.Bundle import android.view.View import android.widget.EditText -import android.widget.LinearLayout import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.LinearLayoutCompat -import org.w3c.dom.Text -import java.util.jar.Attributes.Name class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - var NameEdit : EditText = findViewById(R.id.NameEdit) - var PhoneNumberEdit : EditText = findViewById(R.id.PhoneNumberEdit) - var MoreText : TextView = findViewById(R.id.MoreText) - var BirthEdit : EditText = findViewById(R.id.BirthEdit) - var MemoEdit : EditText = findViewById(R.id.MemoEdit) - var GenderArea : LinearLayoutCompat = findViewById(R.id.GenderArea) - var SaveText : TextView = findViewById(R.id.SaveText) - var CancleText : TextView = findViewById(R.id.CancleText) - - MoreText.setOnClickListener { - MoreText.visibility = View.GONE - BirthEdit.visibility = View.VISIBLE - MemoEdit.visibility = View.VISIBLE - GenderArea.visibility = View.VISIBLE + val nameEdit: EditText = findViewById(R.id.NameEdit) + val phoneNumberEdit: EditText = findViewById(R.id.PhoneNumberEdit) + val moreText: TextView = findViewById(R.id.MoreText) + val birthEdit: EditText = findViewById(R.id.BirthEdit) + val memoEdit: EditText = findViewById(R.id.MemoEdit) + val genderArea: LinearLayoutCompat = findViewById(R.id.GenderArea) + val saveText: TextView = findViewById(R.id.SaveText) + val cancelText: TextView = findViewById(R.id.CancleText) + + moreText.setOnClickListener { + moreText.visibility = View.GONE + birthEdit.visibility = View.VISIBLE + memoEdit.visibility = View.VISIBLE + genderArea.visibility = View.VISIBLE } - - SaveText.setOnClickListener { - if (NameEdit.text.toString().trim().isEmpty()){ - Toast - .makeText(this@MainActivity,"이름은 필수값입니다.",Toast.LENGTH_SHORT) - .show() - } - if (PhoneNumberEdit.text.toString().trim().isEmpty()){ - Toast - .makeText(this@MainActivity,"전화번호는 필수값입니다.",Toast.LENGTH_SHORT) - .show() - } - - else - { - Toast - .makeText(this@MainActivity,"저장되었습니다.",Toast.LENGTH_SHORT) - .show() + saveText.setOnClickListener { + val name = nameEdit.text.toString().trim() + val phoneNumber = phoneNumberEdit.text.toString().trim() + + if (name.isEmpty()) { + Toast.makeText(this@MainActivity, "이름은 필수값입니다.", Toast.LENGTH_SHORT).show() + } else if (phoneNumber.isEmpty()) { + Toast.makeText(this@MainActivity, "전화번호는 필수값입니다.", Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(this@MainActivity, "저장되었습니다.", Toast.LENGTH_SHORT).show() + + val intent = Intent(this, ListActivity::class.java).apply { + putExtra("name", name) + putExtra("phoneNumber", phoneNumber) + } + startActivity(intent) + finish() // MainActivity를 종료하여 ListActivity로 돌아감 } } - CancleText.setOnClickListener{ - Toast - .makeText(this@MainActivity,"취소되었습니다.",Toast.LENGTH_SHORT) - .show() + cancelText.setOnClickListener { + Toast.makeText(this@MainActivity, "취소되었습니다.", Toast.LENGTH_SHORT).show() + finish() // MainActivity를 종료하여 ListActivity로 돌아감 } } } diff --git a/app/src/main/java/campus/tech/kakao/contacts/PlusActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/PlusActivity.kt new file mode 100644 index 00000000..b43a1bed --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/PlusActivity.kt @@ -0,0 +1,22 @@ +package campus.tech.kakao.contacts + +import android.content.Intent +import android.os.Bundle +import android.widget.ImageButton +import androidx.appcompat.app.AppCompatActivity + + class PlusActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.plus_screen) + + var PlusButton : ImageButton = findViewById(R.id.PlusButton) + + val intent = Intent(this,MainActivity::class.java) + PlusButton.setOnClickListener{ + startActivity(intent) + } + + } + } \ No newline at end of file From 1a09a6b93c9549d4ee8b8044c94ff2ca88161b78 Mon Sep 17 00:00:00 2001 From: heonniy Date: Fri, 28 Jun 2024 16:23:44 +0900 Subject: [PATCH 13/15] =?UTF-8?q?=204.=20=EC=97=B0=EB=9D=BD=EC=B2=98=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=EC=97=90=EC=84=9C=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=99=94=EB=A9=B4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84,=20=EC=B6=94=EA=B0=80=20=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83=EB=93=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/layout/activity_detail_contact.xml | 78 +++++++++++++++++++ app/src/main/res/layout/activity_list.xml | 36 +++++++++ app/src/main/res/layout/contact_list_bar.xml | 56 +++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 app/src/main/res/layout/activity_detail_contact.xml create mode 100644 app/src/main/res/layout/activity_list.xml create mode 100644 app/src/main/res/layout/contact_list_bar.xml diff --git a/app/src/main/res/layout/activity_detail_contact.xml b/app/src/main/res/layout/activity_detail_contact.xml new file mode 100644 index 00000000..3a08ac21 --- /dev/null +++ b/app/src/main/res/layout/activity_detail_contact.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_list.xml b/app/src/main/res/layout/activity_list.xml new file mode 100644 index 00000000..280e62ea --- /dev/null +++ b/app/src/main/res/layout/activity_list.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/contact_list_bar.xml b/app/src/main/res/layout/contact_list_bar.xml new file mode 100644 index 00000000..d7b24ad3 --- /dev/null +++ b/app/src/main/res/layout/contact_list_bar.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + From 0345d82637c6377856ef30c809b82e55e2d7119a Mon Sep 17 00:00:00 2001 From: heonniy Date: Fri, 28 Jun 2024 16:24:46 +0900 Subject: [PATCH 14/15] =?UTF-8?q?5.=20feat=20:=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B3=B4=EA=B8=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/kakao/contacts/DetailContact.kt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 app/src/main/java/campus/tech/kakao/contacts/DetailContact.kt diff --git a/app/src/main/java/campus/tech/kakao/contacts/DetailContact.kt b/app/src/main/java/campus/tech/kakao/contacts/DetailContact.kt new file mode 100644 index 00000000..bed8fda3 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/DetailContact.kt @@ -0,0 +1,22 @@ +package campus.tech.kakao.contacts + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import campus.tech.kakao.contacts.databinding.ActivityDetailContactBinding + +class DetailContact : AppCompatActivity() { + private lateinit var binding: ActivityDetailContactBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityDetailContactBinding.inflate(layoutInflater) + setContentView(binding.root) + + // Intent로부터 데이터를 받아와서 UI에 설정 + val name = intent.getStringExtra("name") + val phoneNumber = intent.getStringExtra("phoneNumber") + + binding.Name.text = name + binding.TelePhone.text = phoneNumber + } +} From a0842d5a640e194b7377aade8b4999c1c3c3b167 Mon Sep 17 00:00:00 2001 From: heonniy Date: Fri, 28 Jun 2024 16:48:00 +0900 Subject: [PATCH 15/15] =?UTF-8?q?6.=20feat=20:=20=EC=97=B0=EB=9D=BD?= =?UTF-8?q?=EC=B2=98=20=EC=9E=91=EC=84=B1=20=EC=A4=91=20=EB=92=A4=EB=A1=9C?= =?UTF-8?q?=EA=B0=80=EA=B8=B0=20=EB=B2=84=ED=8A=BC=EC=9D=84=20=EB=88=84?= =?UTF-8?q?=EB=A5=B4=EB=A9=B4=20=ED=99=95=EC=9D=B8=20=ED=8C=9D=EC=97=85?= =?UTF-8?q?=EC=9D=B4=20=EB=82=98=ED=83=80=EB=82=98=EA=B8=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus/tech/kakao/contacts/MainActivity.kt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index a4356f80..1b56f362 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -1,11 +1,13 @@ package campus.tech.kakao.contacts +import android.content.DialogInterface import android.content.Intent import android.os.Bundle import android.view.View import android.widget.EditText import android.widget.TextView import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.LinearLayoutCompat @@ -46,13 +48,24 @@ class MainActivity : AppCompatActivity() { putExtra("phoneNumber", phoneNumber) } startActivity(intent) - finish() // MainActivity를 종료하여 ListActivity로 돌아감 + finish() } } cancelText.setOnClickListener { Toast.makeText(this@MainActivity, "취소되었습니다.", Toast.LENGTH_SHORT).show() - finish() // MainActivity를 종료하여 ListActivity로 돌아감 + finish() } } + + override fun onBackPressed() { + // 확인 다이얼로그 표시 + AlertDialog.Builder(this) + .setMessage("작성을 취소하시겠습니까?") + .setPositiveButton("예") { dialog, which -> + super.onBackPressed() + } + .setNegativeButton("아니오", null) + .show() + } }