35,200원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
파이어베이스 사진 여러장 업로드 방법 좀 알려주세요.
당근마켓 같이 상품 올릴때 사진올리잖아요. 그런형태를 원합니다. 그래서 리사이클러뷰 형태로 아이템에 사진이 나오게는 했습니다. private fun imageUpload(key: String) {} saveBtn.setOnClickListener {imageUpload(key) finish()} 강의에서는 1개만 업로드 하셨는데 사진 여러장을 업로드는 어떻게 하나요? 구글링, 유튜브 찾아봤는데 여러장 올리는건 드물고 자바형식에..... 도저히 안되서 질문 드려요.
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
(아이템클릭시->액티비티) 조건문은 어떻게 작성하죠?
위에 1.my.activity 아래 2.add.activity 입니다. 리사이클러뷰형태로 했고 제가 궁금한건 1번에서 2번으로 넘어가는것과 어댑터에 있는 inner viewholder로 아이템클릭시 2번으로 넘어가는 걸로 했는데 조건문을 안넣다보니까 key받아올때 오류가 생깁니다. 그래서 아이템클릭시 2번 말고 다른 액티비티 생성해서 키 받아오니까 되더라고요. 액티비티를 줄이고 싶어서 조건문을 써야겠는데 뭘 써야할까요? (정리하자면 MY->Add, itemclick->Add 안됨 MY->Add, itemclick->Addset으로 하면 됩니다.)
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
listview만들다가 오류
안녕하세요, 좋은 강의 감사합니다. 근데 제가 오류가 나서 질문합니다.. 예제 앱만들기 4에서 listview, adapter이거 연결하는 도중에 아래 전체 소스에서요 lateinit var LVAdapter = ListViewAdapter 윗 부분에서 lateinit과 ListViewAdapter부분에 빨간불이 쫙 그어지는데 option+enter해보면 lateinit에는 Remove 'lateinit' modifier가 나오고요 option+enter해보면 ListViewAdapter부분에는 introduce import alias 또는 Convert property initializer to getter가 나옵니다. 뭐가 문제인걸까요...? package com.example.mysampleappimport android.content.Intentimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.util.Logimport android.widget.Buttonimport android.widget.ListViewimport com.google.firebase.database.DataSnapshotimport com.google.firebase.database.DatabaseErrorimport com.google.firebase.database.ValueEventListenerimport com.google.firebase.database.ktx.databaseimport com.google.firebase.ktx.Firebaseclass BoardListActivity : AppCompatActivity() { lateinit var LVAdapter = ListViewAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_board_list) val writeBtn = findViewById<Button>(R.id.writeBtn) writeBtn.setOnClickListener{ val intent = Intent(this, BoardWriteActivity::class.java) startActivity(intent) } val list = mutableListOf<Model>() list.add(Model("a")) list.add(Model("b")) list.add(Model("c")) LVAdapter = ListViewAdapter(list) val lv = findViewById<ListView>(R.id.lv) lv.adapter = LVAdapter getData() } fun getData(){ val database = Firebase.database val myRef = database.getReference("board") val postListener = object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { // Get Post object and use the values to update the UI Log.d("BoardListActivity", dataSnapshot.toString()) // ... for(dataModel in dataSnapshot.children){ val item = dataModel.getValue(Model::class.java) Log.d("BoardListActivity", item.toString()) } } override fun onCancelled(databaseError: DatabaseError) { // Getting Post failed, log a message Log.w("BoardListActivity", "loadPost:onCancelled", databaseError.toException()) } } myRef.addValueEventListener(postListener) }}
- 해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
10:50초 쯤에 edittext로 하면 빨간 밑줄이 있던데 뭘하면 되죠?
게시판만들기- 각각에 게시글에 대한 정보불러오기 응용해서 하는 중입니다. 10분 50초에 binding.titleArea.text에서 titleArea가 xml파일에서 Text가 아니라 EditText로 해봤는데 이 경우에 빨간 밑줄이 뜨더라고요. 해결법이 있나요?
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
토스트 메시지가 아예 안뜹니다
안녕하세요, 왕초보편부터 달려오고 있는 학습자입니다. 2강에서 uid 불러오는 토스트메시지, 회원가입을 하고 ok 불러오는 토스트메시지가 안뜨는데요. MainActivity도 올려놓으신 전체코드랑 비교해봐도 똑같은것 같은데 이런 경우 어떤 부분에서 주로 문제가 있는걸까요? 자꾸 앱이 꺼지긴합니다... mySample App keeps stopping
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
강의에서 나온 build.gradle(project)와 제 build.gradle 코드가 달라요
// Top-level build file where you can add configuration options common to all sub-projects/modules.plugins { id 'com.android.application' version '7.1.0' apply false id 'com.android.library' version '7.1.0' apply false id 'org.jetbrains.kotlin.android' version '1.5.30' apply false}task clean(type: Delete) { delete rootProject.buildDir } 저는 build.gradle가 이 코드들 밖에 없는데 혹시 이 상태에서는 어떻게 해줘야 하는지 알 수 있을까요?
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
파이어베이스에 글이 정상적으로 입력되었는지 여부를 알 수 있어야
파이어베이스에 글이 정상적으로 입력되었는지 여부를 알 수 있어야 입력완료 메시지를 띄우고 그렇지 않고 글입력 실패일 경우에는 토스트 메시지가 달라질 것 같습니다. 물론 실패할 경우 finish도 실행하지 않게 되겠지요? 파이어베이스로부터 입력 결과를 알아를 확인하는 절차에 관해서도 함께 다루어주세요.
- 해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
RecyclerView Adapter 적용 관련 질문드립니다!
안녕하세요 강의대로 프로젝트 진행 중 한 가지 문의를 드립니다 (팁 페이지 만들기 - 컨텐츠 리스트 만들기(RecyclerView 1) 강의 진행 중입니다) ContentRVAdapter()에 3개의 값을 갖고있는 ArrayList<String> 를 넘겼으나 화면에 3개의 content가 표시되지 않는데 원인이 무엇인지 알 수 있을까요? 아래 관련 소스를 이미지로 첨부하였습니다 확인 한번 해주시면 감사하겠습니다! 0. 콘텐츠 3개가 표시되지 않음 1. ContentRVAdapter -디버깅으로 getItemCount() items.size의 값은 3을 확인 - onCreateViewHolder(), onBindViewHolder() 한 번 씩만 호출되는 것으로 보이는데 놓친 개념이 있는 걸까요? 2. ContentListActivity 3. content_rv_item 4.activity_content_list
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
안녕하세요
공기계에 연결해서 실행버튼을 눌렀는데 Package name must be a '.'-separated identifier list 라는 오류가 뜹니다 ㅠㅠ
- 해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
꿀팁 컨텐츠 데이터 한번에 등록하기
for (i in items){ myRef.push().setValue(i) } 강의보면 하나하나 등록하기 번거로워서 몇 개만 하던데 저는 이렇게 items를 순회하면서 등록했습니다 다른분들 참고하세요~! items가 선언되고 이런저런 모델을 다 add해주고 난 뒷 부분에 붙여넣기 하면 됩니다.
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
오류가 뜹니다.. 똑같이 작성했는데 오류가뜹니다 ㅠㅠ
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
댓글 삭제 기능 구현 질문
안녕하세요 강의를 열심히 듣고있는 수강생입니다! 다름이 아니라 댓글 불러오기 강의를 수강한 이후 게시판 삭제 기능처럼 댓글도 똑같이 자기가 작성한 댓글을 삭제하도록 구현해보고 있는데 난관에 봉착하여 질문드리게 됐습니다.. binding.deleteIcon.setOnClickListener { itemClickListener.onClick(it, position) } val myUid = FBAuth.getUid() val writerUid = items[position].commentUid if(myUid.equals(writerUid)){ binding.deleteIcon.isVisible = true } else{ } } } interface OnItemClickListener { fun onClick(v: View, position: Int) } // (3) 외부에서 클릭 시 이벤트 설정 fun setItemClickListener(onItemClickListener: OnItemClickListener) { this.itemClickListener = onItemClickListener } // (4) setItemClickListener로 설정한 함수 실행 private lateinit var itemClickListener : OnItemClickListener} 우선 commentrvadpater에서 댓글아이템에 내가 작성한 댓글에 uid가 같으면 삭제 아이콘이 보이게끔 하는걸 뷰홀더에 적용시켰고, 성공했습니다. commentAdapter.setItemClickListener(object: CommentRVAdapter.OnItemClickListener{ override fun onClick(v: View, position: Int) { FBRef.commentRef.child(key).removeValue() Toast.makeText(this@BoardInsideActivity,"댓글 삭제 완료", Toast.LENGTH_SHORT).show() }}) 리사이클러뷰 클릭 이벤트를 boardinsideactivity 즉, 게시판 내부를 구현해주는 액티비티에 구현하여 삭제아이콘을 누르면 댓글이 삭제가 완료되고 토스트메시지까지 띄워졌습니다. 하지만 문제가 생겼습니다.. 위에서 삭제 아이콘을 누르면 게시판 내에 댓글이 모두 삭제됩니다. 리얼타임베이스 시점에서 보면 게시판 key값 내에 파란 부분만 삭제하고 싶은데 빨간부분 모두 삭제됩니다 ..ㅠ commentAdapter.setItemClickListener(object: CommentRVAdapter.OnItemClickListener{ override fun onClick(v: View, position: Int) { FBRef.commentRef.child(key).removeValue() Toast.makeText(this@BoardInsideActivity,"댓글 삭제 완료", Toast.LENGTH_SHORT).show() }}) 아마 이 코드에서 child에 있는 key값을 지워주는게 아닌 다른 값을 지워줘야 되는게 문제인거 같은데 child 안에 무슨 값을 넣어줘야될지 잘 모르겠습니다... class BoardInsideActivity : AppCompatActivity() { private lateinit var binding: ActivityBoardInsideBinding private lateinit var key : String private val TAG = BoardInsideActivity::class.java.simpleName private val CommentDataList = mutableListOf<CommentModel>() private lateinit var commentAdapter:CommentRVAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityBoardInsideBinding.inflate(layoutInflater) setContentView(binding.root) binding.boardSettingIcon.setOnClickListener { showDialog() } key = intent.getStringExtra("key").toString() getBoardData(key) getImageData(key) binding.commentBtn.setOnClickListener { insertComment(key) } getCommentData(key) commentAdapter = CommentRVAdapter(this,CommentDataList) binding.commentRV.adapter = commentAdapter binding.commentRV.layoutManager= LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) binding.commentRV.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL)) commentAdapter.setItemClickListener(object: CommentRVAdapter.OnItemClickListener{ override fun onClick(v: View, position: Int) { FBRef.commentRef.child(key).removeValue() Toast.makeText(this@BoardInsideActivity,"댓글 삭제 완료", Toast.LENGTH_SHORT).show() } }) } fun getCommentData(key:String){ val postListener = object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { CommentDataList.clear() for(dataModel in dataSnapshot.children) { Log.d(TAG,dataModel.toString()) dataModel.key val item = dataModel.getValue(CommentModel::class.java) CommentDataList.add(item!!) } commentAdapter.notifyDataSetChanged() } override fun onCancelled(databaseError: DatabaseError) { // Getting Post failed, log a message Log.w(TAG, "loadPost:onCancelled", databaseError.toException()) } } FBRef.commentRef.child(key).addValueEventListener(postListener) } fun insertComment(key :String) { FBRef .commentRef .child(key) .push() .setValue( CommentModel( binding.commentArea.text.toString(), FBAuth.getTime(), FBAuth.getUid() ) ) Toast.makeText(this,"입력 완료", Toast.LENGTH_SHORT).show() binding.commentArea.setText("") } private fun showDialog(){ val mDialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null) val mBuilder = AlertDialog.Builder(this) .setView(mDialogView) .setTitle("게시글 수정/삭제") val alertDialog = mBuilder.show() alertDialog.findViewById<Button>(R.id.editBtn)?.setOnClickListener { val intent = Intent(this, BoardEditActivity::class.java) intent.putExtra("key",key) startActivity(intent) alertDialog.cancel() } alertDialog.findViewById<Button>(R.id.removeBtn)?.setOnClickListener { FBRef.boardRef.child(key).removeValue() Toast.makeText(this,"삭제 완료",Toast.LENGTH_SHORT).show() finish() } } private fun getImageData(key: String){ // Reference to an image file in Cloud Storage val storageReference = Firebase.storage.reference.child(key + ".png") // ImageView in your Activity val imageViewFromFB = binding.getImageArea storageReference.downloadUrl.addOnCompleteListener(OnCompleteListener { task-> if(task.isSuccessful){ Glide.with(this) .load(task.result) .into(imageViewFromFB) } else{ binding.getImageArea.isVisible=false } }) } private fun getBoardData(key: String) { val postListener = object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { try { val dataModel = dataSnapshot.getValue(BoardModel::class.java) dataModel!!.title?.let { Log.d(TAG, it) } binding.titleArea.text = dataModel!!.title binding.textArea.text = dataModel!!.content binding.timeArea.text = dataModel!!.time binding.uidArea.text = dataModel!!.uid val myUid = FBAuth.getUid() val writerUid = dataModel.uid if(myUid.equals(writerUid)){ binding.boardSettingIcon.isVisible = true } else{ } } catch (e:Exception){ Log.d(TAG,"삭제완료") } } override fun onCancelled(databaseError: DatabaseError) { // Getting Post failed, log a message Log.w(TAG, "loadPost:onCancelled", databaseError.toException()) } } FBRef.boardRef.child(key).addValueEventListener(postListener) }} 이건 전체 코드입니다.
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
게시글 등록시 title 빈칸일 경우 등록안됨
게시글 등록시 빈칸일 경우 등록이 안되게 하고 싶은데 잘 안되네요..ㅠ 회원가입때 처럼 binding.write.setonClickListener{ var isWrite = true . . . if (title.isEmpty()){ Toast.makeText(this, "글을입력해주세요", Toas.LENGTH_LONG).show() isWrite = false } } 라고 입력해보았지만 토스트 메시지는 뜨지만 게시글은 작성이 되네요ㅠ도와주세요ㅠㅠ
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
or Intent.FALG...CLEAR_TASK 하면 되긴 하던데 선생님이 알려주신 코드와 차이점이 있을까요?
로그아웃 이후에 뒤로가기 버튼을 눌렀을 경우 다시 로그아웃 화면이 안나오는 코드중에 저는 이런코드로 작성해보았는데 잘되었는데 선생님이 말해주신 코드와 차이점이 있을까요? intent.flags = Intent.FALG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK (TOP x)으로 했는데 잘되서 그런데 뒤에 알려주신 or Intent.FLAG_ACTIVITY_CLEAR_TASK 이거 안 붙여도 되나요?
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
밑에 ::class.java 안된다고 하신분
저도 안돼서 찾아보니 버전이 달라서 생긴 오류입니다. 강사님 소스 그대로 복붙해도 안되더라구요 저같은 경우에는 gradle에서 implementation 'androidx.core:core-ktx:1.7.0' 에서 implementation 'androidx.core:core-ktx:1.3.2' 로 다운그레이드하니깐 잘 됐습니다. ::class.java는 최신버전에서는 아무래도 안 되는 것 같네요. 안되는분들 참고하시면 좋을거같습니다
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
질문드립니다
다름이 아니라 실제 실무에서 앱을 개발할떄 1. sql lite 2. firebase를 앱내부에서 연동한 db 연결 (현재 강의 방법) 3. Web 서버에서 restAPi(oracle,mysql,mssql 등등)과 통신한 데이터를 restapi 통신 하여 데이터들 얻어오는 방법 4. 기타 등등 보통 어떤 경우를 많이 쓰나요 ???
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
북마크부분 오류나서 질문드려요!
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
수정완료 후 화면에 대해서 질문드립니다.
질문이있습니다 . 수정완료 되었습니다 라는 토스트 메세지가 뜨는데 그떄 화면이 리스트가 아니라 상세에서 햄버거 버튼? 을 눌렀을떄 수정,삭제팝업이 뜬 그 페이지로 이동합니다 . 데이터는 파이어 베이스에서 확인을 해보니깐 .정상적으로 수정이 되었는데 말이죠 이러면 어디를 봐야 하나요 ?? 아래는 코드입니다. override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //setContentView(R.layout.activity_board_edit) binding = DataBindingUtil.setContentView(this, R.layout.activity_board_edit) key = intent.getStringExtra("key").toString() getBoardData(key) getImageData(key) binding.editBtn.setOnClickListener { editBoardData(key) }} private fun editBoardData(key: String) { FBRef.boardRef.child(key).setValue( BoardModel( binding.titleArea.text.toString() ,binding.contentArea.text.toString() ,writerUid ,FBAuth.getTime()) ) Toast.makeText(this, "수정완료", Toast.LENGTH_LONG).show() finish()}
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
Firebase 카테고리 분류 중 전체카테고리 읽어오는 법이 궁금합니다
강사님은 contents1, 2로 분류하셔서 database에 입력하셨고 읽어오실 때도 카테고리별로 path를 정하셨는데 전체 불러오기의 방법이 있을까요? 하위 카테고리를 정하고 path를 contents로 지정하면 하위 카테고리를 다시 child로 불러와야 하는데 이걸 카테고리별로 지정하자니 코드가 너무 길어지고 비효율적인 것 같습니다. path contents만으로 하위 카테고리 전체를 읽어오는 방법이 궁금합니다
- 미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
최종 프로젝트 깃헙이나 소스 링크 못찾겠어요 ..
이거 혹시 최종 예제는 어디서 받을수있을까요 ??? 같이 보면서 하고싶은데요 깃헙이나 소스 링크 못찾겠어요 ..