35,200원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
댓글 오류 관련해 질문드립니다.
안녕하세요 선생님, 우선 강의 내용과 직접적으로 관련된 질문이 아니라 죄송합니다. 댓글 관련 오류가 몇 가지 발생해 여쭤봅니다.BoardReadActivity.kt 생략 // 댓글 목록 정보 가져옴 fun getCommentListData(key: String) { 생략 // 댓글 헤더에 댓글 개수 출력 binding.commentCountText.text = commentKeyList.count().toString() 생략 }기존 댓글 2개가 있는 상황에서 새 댓글을 1개 입력하면 댓글 개수가 3이 되어야 하는데요,2(기존) + 3(기존2업뎃1) = 5(누적)로 출력이 됩니다.또한 방금 막 작성한 댓글 a의 수정 페이지로 넘어가면추가된 댓글이 즉시 반영되지 않아 맨 위 댓글인 user1이 불러와지며댓글 a가 아닌 맨 위 댓글이 수정됩니다.마찬가지로 a를 삭제하려해도 user-1이 불러와지며삭제되는 댓글도 a가 아닌 user-1입니다.수정과 삭제를 반복하면 댓글 카운트는 계속 늘어나고, 이 과정에서 앱이 죽기도 합니다.게시글을 한 번 나갔다 들어와야 댓글 수가 제대로 카운트 돼서 어떻게 해야 할지 도움 요청드립니다. 코드 전체는 깃허브에 업로드 해 놓았습니다. https://github.com/shinyelee/my-solo-life
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
auth 오류
auth 부분이 자꾸 에러가 나는데 어떻게 해결해야 될까요? ㅠㅠ
- 해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
댓글 수정 및 삭제 구현 관련해 질문드립니다
안녕하세요 선생님, [초급편] 안드로이드 커뮤니티 앱 만들기를 완강한 수강생입니다. 게시글 수정/삭제 파트와 아래 두 질문을 참고해가며 현재 댓글 수정/삭제를 구현하기 위해 애쓰는 중인데, 잘 되지 않아 질문드립니다.https://www.inflearn.com/questions/411607https://www.inflearn.com/questions/619233게시글 설정과 마찬가지로 내가 쓴 댓글에만 보이는 설정 버튼을 클릭하면다이얼로그를 통해 수정/삭제로 진입하게끔 만드는 데 까지는 성공했습니다.첫 번째 질문입니다.우선 수정 기능의 경우 아래 ????? 부분에 어떤 값을 넣어야 할지 감이 안 옵니다. BoardReadActivity.kt // 댓글 클릭하면 -> 대화상자 뜸 // 파이어베이스의 댓글 키를 기반으로 댓글 데이터(=본문+uid+시간) 받아옴 cLV.setOnItemClickListener { parent, view, position, id -> // 명시적 인텐트 -> 다른 액티비티 호출 val intent = Intent(baseContext, CommentEditActivity::class.java) // 댓글수정 액티비티로 댓글의 키 값 전달 intent.putExtra("?????", ?????) // 댓글수정 액티비티 시작 startActivity(intent) }"key", key를 넣으면 댓글이 아닌 게시글의 키 값이 되어 댓글이 수정되지 않고,"commentKey", commentKey를 넣으면 앱이 죽습니다. 게시판 프래그먼트에서 리스트뷰 아이템을 클릭하면 게시글로 이동하듯댓글 리스트뷰 아이템을 클릭하면 수정 액티비티로 넘어가는 것도 시도해봤는데요, 빨간색이 게시글의 키, 파란색이 댓글의 키일 때 다행히 댓글의 키는 잘 받아오는데 댓글의 키'만' 알다보니 파이어베이스로부터 기존 댓글 내용을 받아올 수도, 수정한 내용을 업데이트 할 수도 없습니다.BoardReadActivity.kt // 댓글 클릭하면 -> 대화상자 뜸 // 파이어베이스의 댓글 키를 기반으로 댓글 데이터(=본문+uid+시간) 받아옴 cLV.setOnItemClickListener { parent, view, position, id -> // 명시적 인텐트 -> 다른 액티비티 호출 val intent = Intent(baseContext, CommentEditActivity::class.java) // 댓글수정 액티비티로 댓글의 키 값 전달 intent.putExtra("commentKey", commentKeyList[position]) // 댓글수정 액티비티 시작 startActivity(intent) }다이얼로그에서 댓글수정 액티비티로 넘길 때와 마찬가지로 ????? 부분에 어떤 값을 넣어야 할지 모르겠습니다.CommentEditActivity.kt // 댓글을 수정 private fun editCommentData(commentKey: String) { // 수정한 값으로 업데이트 FBRef.commentRef.?????.child(commentKey).setValue(CommentModel( // 제목 및 본문은 직접 수정한 내용으로, binding.commentMainArea.text.toString(), // uid와 시간은 자동 설정됨 FBAuth.getUid(), FBAuth.getTime() )) // 수정 확인 메시지 Toast.makeText(this, "댓글이 수정되었습니다", Toast.LENGTH_SHORT).show() // 댓글수정 액티비티 종료 finish() }혼자 해결하려니 너무 맨 땅에 헤딩이라ㅠㅠ 질문 올립니다.
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
파이어베이스 realtime datatbase 데이터에 안뜹니다.
안녕하세요. firebase 데이터 추가 강의 듣고 있습니다. 실행에 오류는 없는데 눌러도 데이터에 변화가 없습니다. class ContentListActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_content_list) // Write a message to the database val database = Firebase.database val myRef = database.getReference("contents") myRef.push().setValue( ContentModel("title1", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblYPPY%2Fbtq66v0S4wu%2FRmuhpkXUO4FOcrlOmVG4G1%2Fimg.png", "https://philosopher-chan.tistory.com/1235?category=941578") ) myRef.push().setValue( ContentModel("title2", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FznKK4%2Fbtq665AUWem%2FRUawPn5Wwb4cQ8BetEwN40%2Fimg.png", "https://philosopher-chan.tistory.com/1236?category=941578") ) myRef.push().setValue( ContentModel("title3", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtig9C%2Fbtq65UGxyWI%2FPRBIGUKJ4rjMkI7KTGrxtK%2Fimg.png", "https://philosopher-chan.tistory.com/1237?category=941578") ) val rv : RecyclerView = findViewById(R.id.rv) //리사이클 뷰 생성 // 데이터 삽입 val items = ArrayList<ContentModel>() items.add(ContentModel("title1", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblYPPY%2Fbtq66v0S4wu%2FRmuhpkXUO4FOcrlOmVG4G1%2Fimg.png", "https://philosopher-chan.tistory.com/1235?category=941578")) items.add(ContentModel("title2", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FznKK4%2Fbtq665AUWem%2FRUawPn5Wwb4cQ8BetEwN40%2Fimg.png", "https://philosopher-chan.tistory.com/1236?category=941578")) items.add(ContentModel("title3", "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtig9C%2Fbtq65UGxyWI%2FPRBIGUKJ4rjMkI7KTGrxtK%2Fimg.png", "https://philosopher-chan.tistory.com/1237?category=941578")) val rvAdapter = ContentRVAdapter(baseContext, items) //어뎁터 생성 rv.adapter = rvAdapter rv.layoutManager = GridLayoutManager(this, 2) rvAdapter.itemClick = object : ContentRVAdapter.ItemClick{ override fun onClick(view: View, position: Int) { Toast.makeText(baseContext, items[position].title, Toast.LENGTH_LONG).show() val intent = Intent(this@ContentListActivity, ContentShowActivity::class.java) //url 넘겨주기 intent.putExtra("url", items[position].webUrl) startActivity(intent) } } } }
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
Unresolved reference: item
안녕하세요. 컨텐츠 리스트 만들기 - RecyclerView 2 강의의 7:17를 듣고 있습니다. 강의 똑같이 따라 치고 있는데 Unresolved reference: item 라고 오류가 나는데 왜 그러는 걸까요? package com.example.mysololife.contentsList import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.example.mysololife.R class ContentRVAdapter (val items : ArrayList<ContentModel>) : RecyclerView.Adapter<ContentRVAdapter.Viewholder>() { //아이템 하나 하나 가져와 하나의 레이아웃 만들기 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContentRVAdapter.Viewholder { val v = LayoutInflater.from(parent.context).inflate(R.layout.content_rv_item, parent, false) return Viewholder(v) } override fun onBindViewHolder(holder: Viewholder, position: Int) { holder.bindItems(items[position]) } //전체 아이템의 갯수가 몇 개 override fun getItemCount(): Int { return items.size } // 아이템의 내용물을 넣을 수 있도록 연결 inner class Viewholder(itemView: View): RecyclerView.ViewHolder(itemView){ fun bindItems(items : ContentModel){ val contetTitle = itemView.findViewById<TextView>(R.id.textArea) contetTitle.text = item.title } } }
- 해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
댓글 출력 관련해 질문드립니다
안녕하세요 선생님, 현재 [초급편] 안드로이드 커뮤니티 앱 만들기 수강 중 섹션 8. 게시판 댓글 만들기의 댓글 불러오기까지 진행한 상태입니다. 댓글 리스트뷰를 강의와 조금 다르게 출력하고 싶은데, 난관에 부딪혀 질문드립니다. 현재 강의에서처럼 리스트뷰에 height를 dp 단위로 지정하면 height를 충분하게 설정했을 때엔 여백이 많이 생기고,height가 부족하면 댓글이 잘리는 문제가 생기더라고요. 저는 위 캡쳐처럼 여백이 없고, 댓글란이 잘리지 않고, 이중스크롤이 필요없는 댓글 영역을 만들고 싶습니다. 여러 방법을 알아봤는데 캡쳐처럼 아이템 1개 height 내에서 댓글란만 따로 스크롤을 가능하게 하거나, 화면을 2분할해 본문만 스크롤/ 댓글만 스크롤 이런 식으로 처리하는 게 차선책이더라고요. 여태까지 https://stackoverflow.com/questions/6210895/listview-inside-scrollview-is-not-scrolling-on-android/11554684#11554684 https://trivedihardik.wordpress.com/2011/09/19/scrollview-inside-scrollview-scrolling-problem/ https://hoonkim1126.tistory.com/5 https://itstudentstudy.tistory.com/49 정도를 시도해봤는데 대부분 오래되고 자바로 쓰인 코드라 제대로 작동하지 않아 선생님께 도움을 요청드립니다. 댓글을 리사이클러뷰로 아예 갈아엎는 건 최후의 보루로 남겨놓고 있습니다ㅠㅠ
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
Authentication에 추가는 되는데요
W/System: Ignoring header X-Firebase-Locale because its value was null. 일단 가입 버튼을 누르면 위 오류가 나오면서 토스트메세지는 No는 잘뜨면서 ok는 안뜨고 한 10분뒤에 새로고침 하면 Authentication에 다는아닌데 어떤건 추가는 되어있더라구요 근데 안될때도 있고. 와이파이연결, 비밀번호 6자리 전부 해보았지만 로그에 계속 저렇게 찍히네요 혹시 다른원인 알고계신게 있으실까요?
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
앱 실행 방법
제 컴퓨터에서 강의 자료에 들어있는 앱을 실행해보고 싶은데 자꾸 오류가 뜨네요 어떤걸 바꿔야지 실행 가능할까요?? 일단 파이어베이스에 앱 등록은 마친 상태입니다. 오류 코드 밑에 첨부하겠습니다! Execution failed for task ':app:processDebugGoogleServices'.> File google-services.json is missing. The Google Services Plugin cannot function without it. Searched Location: C:\inflearn\project_data10\MySoleLife\app\src\debug\google-services.json C:\inflearn\project_data10\MySoleLife\app\src\google-services.json C:\inflearn\project_data10\MySoleLife\app\google-services.json * Try:Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Exception is:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDebugGoogleServices'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:200) at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:198) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:179) at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195) at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75) at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62) at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76) at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)Caused by: org.gradle.api.GradleException: File google-services.json is missing. The Google Services Plugin cannot function without it. Searched Location: C:\inflearn\project_data10\MySoleLife\app\src\debug\google-services.jsonC:\inflearn\project_data10\MySoleLife\app\src\google-services.jsonC:\inflearn\project_data10\MySoleLife\app\google-services.json at com.google.gms.googleservices.GoogleServicesTask.action(GoogleServicesTask.java:119) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:555) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75) at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56) at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71) at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45) at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:540) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:523) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:271) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:260) at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:34) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:34) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26) at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67) at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34) at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43) at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73) at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54) at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44) at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54) at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38) at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:42) at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159) at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72) at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33) at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38) at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24) at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92) at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26) at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94) at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49) at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79) at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39) at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40) at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28) at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:187) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:179) at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195) at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75) at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62) at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76) at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
Activity가 아니라 Fragment로 연결하는 이유
안녕하세요. 다름이 아니라 왜 하단바 navigation 연결 할 때 Activity 가 아닌 Fragment들을 연결하는 지 궁금해서 질문 남기게 되었습니다. 또, Activity 로 연결하면 발생하는 문제점들이 궁금해요! 답변해주시면 감사하겠습니다.
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
Layout파일에 있는 View들의 ID가 겹쳐도 되나요?
안녕하세요. 강의를 듣던 중 생겼던 의문입니다. 같은 Layout XML파일에서는 View ID가 겹치면 오류가 발생하지만, 다른 xml파일끼리는 겹쳐도 문제가 없더라구요.. 가령 activity_main,xml에서 @+id/btn_ok를 사용해도, activity_favorite,xml에서 @+id/btn_ok를 그대로 사용할 수 있었습니다. Q1. 이렇게 겹치도록 ID를 구성해도 문제가 없을까요? Q2. ID겹치는 것에 대비해서 어떤 layout에서 사용하는지 이름에 표기하는 방법이 있던데(btn_main_ok와 같이), 이렇게까지 해서 겹치는걸 막아야하나요..?
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
java.lang.NullPointerException: inflate(inflater, R.layo…t_home, container, false) must not be null 같은 오류가 발생합니다.
homefragment부분에서 알 수 없는 오류가 발생하고 있는것 같습니다. 먼저 homegrament의 코드입니다. package fragmentimport android.content.Intentimport android.os.Bundleimport android.util.Logimport androidx.fragment.app.Fragmentimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport androidx.databinding.DataBindingUtilimport androidx.navigation.findNavControllerimport androidx.recyclerview.widget.GridLayoutManagerimport androidx.recyclerview.widget.RecyclerViewimport com.AllAboutKorea.allaboutkorea.*import com.AllAboutKorea.allaboutkorea.contentslist.BookmarkRVAdapterimport com.AllAboutKorea.allaboutkorea.contentslist.HistoryActivityimport com.AllAboutKorea.allaboutkorea.contentslist.contentmodelimport com.AllAboutKorea.allaboutkorea.databinding.FragmentHomeBindingimport com.AllAboutKorea.allaboutkorea.utils.FBAuthimport com.AllAboutKorea.allaboutkorea.utils.FBRefimport com.google.firebase.database.DataSnapshotimport com.google.firebase.database.DatabaseErrorimport com.google.firebase.database.ValueEventListenerclass HomeFragment : Fragment() { private lateinit var binding : FragmentHomeBinding //북마크 리스트의 중복 업로드를 막는 코드이다. var twiceupoad = false private val TAG = HomeFragment::class.java.simpleName val bookmarkIdList = mutableListOf<String>() val items = ArrayList<contentmodel>() val itemKeyList = ArrayList<String>() lateinit var rvAdapter : BookmarkRVAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { Log.d("HomeFragment", "onCreateView") binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false) getbookmarkdata() //상단 아이콘을 클릭을 하면, 그 아이콘으로 이동하는 코드를 작성하자. binding.fragmentHomeHistory.setOnClickListener { val intent = Intent(context,HistoryActivity::class.java) startActivity(intent) } binding.fragmentHomeFood.setOnClickListener { val intent = Intent(context, FoodActivity::class.java) startActivity(intent) } binding.fragmentHomeKpop.setOnClickListener { val intent = Intent(context, KpopActivity::class.java) startActivity(intent) } binding.fragmentHomeKdrama.setOnClickListener { val intent = Intent(context, KdramaActivity::class.java) startActivity(intent) } binding.fragmentHomeKorean.setOnClickListener { val intent = Intent(context, KoreanActivity::class.java) startActivity(intent) } binding.fragmentHomeTravel.setOnClickListener { val intent = Intent(context, TravelActivity2::class.java) startActivity(intent) } binding.fragmentHomeFunfacts.setOnClickListener { val intent = Intent(context, FunfactsActivity::class.java) startActivity(intent) } binding.fragmentHomeEconomy.setOnClickListener { val intent = Intent(context, EconomyActivity::class.java) startActivity(intent) } binding.fragmentHomeKbeauty.setOnClickListener { val intent = Intent(context, KbeautyActivity::class.java) startActivity(intent) } //하단 아이콘을 클릭을 하면, 그 아이콘으로 이동하는 코드를 작성하자. binding.tipTap.setOnClickListener { Log.d("HomeFragment", "tipTap") it.findNavController().navigate(R.id.action_homeFragment_to_tipFragment) } binding.bookmarkTap.setOnClickListener { it.findNavController().navigate(R.id.action_homeFragment_to_bookmarkFragment) } binding.storeTap.setOnClickListener { it.findNavController().navigate(R.id.action_homeFragment_to_storeFragment) } rvAdapter = BookmarkRVAdapter(requireContext(), items, itemKeyList, bookmarkIdList) val rv : RecyclerView = binding.mainRV rv.adapter = rvAdapter rv.layoutManager = GridLayoutManager(requireContext(), 2) getCategoryData() return binding.root } private fun getCategoryData(){ val postListener = object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { for (dataModel in dataSnapshot.children) { val item = dataModel.getValue(contentmodel::class.java) items.add(item!!) itemKeyList.add(dataModel.key.toString()) } rvAdapter.notifyDataSetChanged() } override fun onCancelled(databaseError: DatabaseError) { // Getting Post failed, log a message Log.w("ContentListActivity", "loadPost:onCancelled", databaseError.toException()) } } FBRef.category_history.addValueEventListener(postListener) FBRef.category_food.addValueEventListener(postListener) FBRef.category_k_pop.addValueEventListener(postListener) FBRef.category_k_drama.addValueEventListener(postListener) FBRef.category_korean.addValueEventListener(postListener) FBRef.category_travel.addValueEventListener(postListener) FBRef.category_funfacts.addValueEventListener(postListener) FBRef.category_economy.addValueEventListener(postListener) FBRef.category_k_beauty.addValueEventListener(postListener) } private fun getbookmarkdata(){ val postListener = object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { //북마크를 동적으로 삭제하기 위한 코드. bookmarkIdList.clear() //데이터를 더하는 불러오는 역활. for(dataModel in dataSnapshot.children){ Log.e(TAG,dataModel.toString()) bookmarkIdList.add(dataModel.key.toString()) } //1.전체 카테고리에 있는 컨텐츠 데이터들을 다 가져온다. //자세한 코드는 여기 안에 있다. if(twiceupoad==false) { twiceupoad=true getCategoryData() } //이렇게 코드를 실행하면, getCategoryData는 getbookmarkdata //의 정보를 잘 알기 때문에, 북마크가 아닌 것을 잘 거를 수 있다. } override fun onCancelled(databaseError: DatabaseError) { // Getting Post failed, log a message Log.w(TAG, "loadPost:onCancelled", databaseError.toException()) } } //북마크 데이터를 불러오는 코드이다. FBRef.bookmarkref.child(FBAuth.getUid()).addValueEventListener(postListener) }}그 다음은 xml 파일입니다. <?xml version="1.0" encoding="utf-8"?><layout 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"> <!-- TODO: Update blank fragment layout --> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" tools:layout_editor_absoluteX="0dp" tools:layout_editor_absoluteY="53dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="5dp" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="100dp"> <ImageView android:id="@+id/fragment_home_history" android:layout_width="90dp" android:layout_height="90dp" android:layout_weight="1" android:src="@drawable/icon_history" /> <ImageView android:id="@+id/fragment_home_food" android:layout_width="90dp" android:layout_height="90dp" android:layout_weight="1" android:src="@drawable/icon_food" /> <ImageView android:id="@+id/fragment_home_kpop" android:layout_width="90dp" android:layout_height="90dp" android:layout_weight="1" android:src="@drawable/icon_kpop" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="100dp"> <ImageView android:id="@+id/fragment_home_kdrama" android:layout_width="90dp" android:layout_height="90dp" android:layout_weight="1" android:src="@drawable/icon_kdrama" /> <ImageView android:id="@+id/fragment_home_korean" android:layout_width="90dp" android:layout_height="90dp" android:layout_weight="1" android:src="@drawable/icon_korean" /> <ImageView android:id="@+id/fragment_home_travel" android:layout_width="90dp" android:layout_height="90dp" android:layout_weight="1" android:src="@drawable/icon_travel" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="100dp"> <ImageView android:id="@+id/fragment_home_funfacts" android:layout_width="90dp" android:layout_height="90dp" android:layout_weight="1" android:src="@drawable/icon_funfacts" /> <ImageView android:id="@+id/fragment_home_economy" android:layout_width="90dp" android:layout_height="90dp" android:layout_weight="1" android:src="@drawable/icon_economy" /> <ImageView android:id="@+id/fragment_home_kbeauty" android:layout_width="90dp" android:layout_height="90dp" android:layout_weight="1" android:src="@drawable/icon_kbeauty" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Site list" android:textSize="20dp" android:font="@font/happygoheung" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/mainRV" android:layout_width="match_parent" android:layout_height="600dp" /> </LinearLayout> </ScrollView> <LinearLayout android:layout_width="match_parent" android:layout_height="3dp" app:layout_constraintBottom_toTopOf="@+id/linearLayout"> <LinearLayout android:background="@color/mainColor" android:layout_width="match_parent" android:layout_weight="1" android:layout_height="match_parent"/> <LinearLayout android:layout_width="match_parent" android:layout_weight="1" android:layout_height="match_parent"/> <LinearLayout android:layout_width="match_parent" android:layout_weight="1" android:layout_height="match_parent"/> <LinearLayout android:layout_width="match_parent" android:layout_weight="1" android:layout_height="match_parent"/> </LinearLayout> <LinearLayout android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="60dp" android:background="@color/white" android:weightSum="4" app:layout_constraintBottom_toBottomOf="parent"> <ImageView android:id="@+id/homeTap" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:src="@drawable/hometaps" /> <ImageView android:id="@+id/tipTap" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:src="@drawable/tiptaps" /> <ImageView android:id="@+id/bookmarkTap" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:src="@drawable/bookmarks" /> <ImageView android:id="@+id/storeTap" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:src="@drawable/koreanet" /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout></layout> 오류는 이렇습니다.E/AndroidRuntime: FATAL EXCEPTION: main Process: com.allaboutkorea.allaboutkorea, PID: 11378 java.lang.NullPointerException: inflate(inflater, R.layo…t_home, container, false) must not be null at fragment.HomeFragment.onCreateView(HomeFragment.kt:55) at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128) at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3065) at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128) at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072) at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251) at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502) at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1435) at android.app.Activity.performStart(Activity.java:8024) at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3475) at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221) at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)이런 오류가 뜨고, 앱을 켜고 들어가려는 순간 앱이 꺼집니다.도움을 주신다면 대단히 감사드리겠습니다.감사합니다!
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
자동완성
Arctic Fox 버전으로 바꾸니 자동완성이 안되어서 질문드립니다! Gradle에 id 'kotlin-android-extensions' 도 추가해봤고 구글링 통해서 파워 세이브 모드 체크도 해제해 봤고 C:\Users\사용자이름\.AndroidStudio3.6\system 경로에서 caches 폴더 지우라는 내용도 봤는데 해당 경로로 파일이 없더라구요.. 찾아봐도 계속 안되는데 혹시 방법 아시나요??
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
댓글의 키값을 구하려면 어떻게 해야하나요?
게시글에 댓글을 남기고 firebase를 확인해보면 위 사진처럼 -게시글의 키값 - 댓글의 키값 - 댓글 내용 이런식으로 나오는데 댓글 데이터 구해오는 부분(getCommentData)에서 dataModel.key 이런식으로 해도 게시글 키값만 나오고 댓글 키값은 안 나오더라고요 댓글의 키값을 구하려면 어떻게 해야하나요?
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
badge에 관하여 질문드립니다.
양질의 강의에 감사드립니다. 다름이 아니라 새로운 글이 올라오면 badge를 달고 싶은데 새로운 글이 올라오는지를 어떤식으로 check 할 수 있나요? 지금 생각나는 아이디어는 파이어베이스에서 posting의 size를 담아두고 있다가 게시글 작성 button이 눌리면 posting의 사이즈가 달라질테고 달라진 사이즈만큼 최신 순으로 N버튼을 달고 싶다가도 그러면 글이 작성될때마다 새로 받아야하는데 서버에 무리가 가려나 싶기도하고 아니면 단순하게 그냥 글 작성할때 뱃지를 달아놓고 일정시간?이 지나면 뱃지를 사라지게 하면 될까 싶은데 그게 가능한가요? 실제로 뱃지를 달때는 어떤식으로 로직을 짜는지 궁금합니다.
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
Fragment 에서 Binding 사용
안녕하세요 학습하는 도중에 질문이 있어서 올려봅니다. 강의 내용 중에 Fragment에서 binding 사용하는 부분에서 FragmentHomeBinding과 같은 binding class가 자동으로 생성이 되지 않을 때는 어떻게 해야하나요? clean Project, invalidate caches, fragment 지웠다가 다시 생성해보기 모두 다 해봤는데 전부 안됩니다ㅜㅜ 혹시나 해서 다른 곳에서 사용하는 것 과 같이 fragment_home.xml에서 Fragment를 layout에 감싸니까 생성되서 binding이 진행되는데 이게 맞는건가요??
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
회원가입 구현시 emailArea붉은색
안녕하세요. Firebase회원가입 구현 강의의 8:00 따라 하고 있습니다. activity_join.xml에서 아이디 다 추가주었는데 이렇게 뜨네요 Unresolved reference: passwordArea2 private lateinit var auth: FirebaseAuth private lateinit var binding: ActivityIntroBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) auth = Firebase.auth //setContentView(R.layout.activity_join) binding = DataBindingUtil.setContentView(this, R.layout.activity_join) binding.joinBtn.setOnClickListener { val email = binding.emailArea.text.toString() val password1 = binding.passwordArea1.text.toString() val password2 = binding.passwordArea2.text.toString() // 저기 값이 비어있는지 확인 if (email.isEmpty()){ Toast.makeText(this, "이메일을 입력해주세요", Toast.LENGTH_LONG).show() } if(password1.isEmpty()){ Toast.makeText(this, "password1을 입력해주세요", Toast.LENGTH_LONG).show() } if(password2.isEmpty()){ Toast.makeText(this, "password2을 입력해주세요", Toast.LENGTH_LONG).show() } if (!password1.equals(password2)){ Toast.makeText(this, "비밀번호을 똑같이 입력해주세요", Toast.LENGTH_LONG).show() } } }
- 해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
리스트 뷰 실습 도중 에러가납니다.
아래와 같은 오류가 나는데 view = LayoutInflater.from(parent?.context).inflate(R.layout.board_list_item,parent,false) 요 부분에서 납니다. 아래는 제 소스입니다. package com.example.mytoproject.board import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import com.example.mytoproject.R import kotlinx.coroutines.NonDisposableHandle.parent class BoardListLVAdapter(val boardList:MutableList<BoardModel>): BaseAdapter() { override fun getCount(): Int { return boardList.size } override fun getItem(p0: Int): Any { return boardList[p0] } override fun getItemId(p0: Int): Long { return p0.toLong() } override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View { var view = p1 if (view ==null) { view = LayoutInflater.from(parent?.context).inflate(R.layout.board_list_item,parent,false) } return view!! } }
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
오류질문
저번 문제는 말씀해주신대로 해서 해결했습니다! 감사합니다 그런데 수정페이지에서 다른문제가 생겼는데, 강의랑 똑같이 따라했는데 수정하고나면 수정완료가 되긴하는데 수정후에 내용부분에 작성한 내용이 아니라 파이어베이스의 키값을 받아오는거같습니다. 또한 이후에 writerUid도 변경되는지 수정하고나면 같은 아이디에서 작성한글도 내가쓴글이 아니게 되는데 혹시 원인이 무엇일까요?
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
회원가입 오류
회원가입 코드를 똑같이 작성했을 때 [실패] 라고 뜹니다. 첨부 사진은 위에 다른 질문들에 답변주신 코드를 복사하여 나온 로그입니다. 어떻게해야 오류가 수정될까요??
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
오류질문
강의를 따라하던중 main_nav.xml에 이런 오류가 뜹니다. TalkFragment와 BookFragment파일에는 아무런 이상이 없는거같은데 이유가 무엇일까요?