前提
Android kotlinでFirebaseのReal Time Databaseを使用して、簡易的なチャットアプリを作ってます。
実現したいこと
ユーザー間でのメッセージ送信
発生している問題・エラーメッセージ
原因としては、以下のChatLogActivityのuserがnullになっているためです。
ChatLogActivity
1val user = intent.getParcelableExtra<User>(NewMessageActivity.USER_KEY) 2val toId = user?.uid
NewMessageActivityのfetchUsersメソッドにintentを実装し、オブジェクトを渡していますが、これが上手くいってないみたいで、これ以上の原因が分からずです。
NewMessageActivity
1intent.putExtra(USER_KEY, holder.msgList.text)
以下はエラーメッセージです。
Log
1java.lang.NullPointerException 2 at com.ChatApp.ChatLogActivity.performSendMessage(ChatLogActivity.kt:64) 3 at com.ChatApp.ChatLogActivity.onCreate$lambda-0(ChatLogActivity.kt:44)
該当のソースコード
ChatLogActivity
1package com.ChatApp 2 3import androidx.appcompat.app.AppCompatActivity 4import android.os.Bundle 5import android.util.Log 6import android.widget.Button 7import android.widget.EditText 8import androidx.appcompat.widget.Toolbar 9import androidx.recyclerview.widget.LinearLayoutManager 10import androidx.recyclerview.widget.RecyclerView 11import com.google.firebase.auth.FirebaseAuth 12import com.google.firebase.database.FirebaseDatabase 13import java.sql.Timestamp 14 15class ChatLogActivity : AppCompatActivity() { 16 private lateinit var recyclerView: RecyclerView 17 18 override fun onCreate(savedInstanceState: Bundle?) { 19 super.onCreate(savedInstanceState) 20 setContentView(R.layout.activity_chat_log) 21 22 val toolbar = findViewById<Toolbar>(R.id.toolbar_chat_log) 23 val user = intent.getParcelableExtra<User>(NewMessageActivity.USER_KEY) 24 println("user1: $user") 25 26 setSupportActionBar(toolbar) 27 getSupportActionBar()?.setTitle(user?.uid) 28 getSupportActionBar()?.setDisplayHomeAsUpEnabled(true) 29 30 val textList = listOf( 31 "Hello", 32 "Hello", 33 "Hello", 34 "Hello" 35 ) 36 37 recyclerView = findViewById(R.id.chat_log_list) 38 recyclerView.adapter = ChatFromRecyclerAdapter(textList) 39 recyclerView.adapter = ChatToRecyclerAdapter(textList) 40 recyclerView.layoutManager = LinearLayoutManager(this) 41 42 findViewById<Button>(R.id.sendButton).setOnClickListener { 43 Log.d("ChatLogActivity", "Send message...") 44 performSendMessage() 45 } 46 } 47 48 class ChatLog(val id: String, val text: String, val fromId: String, val toId: String, timestamp: Long) 49 50 private fun performSendMessage() { 51 val text = findViewById<EditText>(R.id.editSendText).text.toString() 52 val fromId = FirebaseAuth.getInstance().uid 53 val user = intent.getParcelableExtra<User>(NewMessageActivity.USER_KEY) 54 val toId = user?.uid 55 56 println("fromId: $fromId") 57 println("toId: $toId") 58 println("user2: $user") 59 60 if (fromId == null) return 61 62 val ref = FirebaseDatabase.getInstance().getReference("/messages").push() 63 64 val chatMessage = ChatLog(ref.key!!, text, fromId, toId!!, System.currentTimeMillis() / 1000) 65 66 ref.setValue(chatMessage) 67 .addOnSuccessListener { 68 Log.d("ChatLogActivity", "Saved our chatMessage: ${ref.key}") 69 } 70 } 71}
NewMessageActivity
1package com.ChatApp 2 3import android.content.Intent 4import android.os.Bundle 5import android.util.Log 6import android.view.MenuItem 7import androidx.appcompat.app.AppCompatActivity 8import androidx.appcompat.widget.Toolbar 9import androidx.recyclerview.widget.LinearLayoutManager 10import androidx.recyclerview.widget.RecyclerView 11import com.google.firebase.database.* 12 13 14class NewMessageActivity : AppCompatActivity() { 15 16 private lateinit var database: DatabaseReference 17 private lateinit var recyclerView: RecyclerView 18 var nameList = mutableListOf<String>( 19 "テスト太郎" 20 ) 21 var adapter = NewMessageRecyclerAdapter(nameList) 22 23 override fun onCreate(savedInstanceState: Bundle?) { 24 super.onCreate(savedInstanceState) 25 setContentView(R.layout.activity_new_message) 26 27 val databaseRef: DatabaseReference = FirebaseDatabase.getInstance().reference 28 29 val toolbar = findViewById<Toolbar>(R.id.toolbar_new_message) 30 setSupportActionBar(toolbar) 31 getSupportActionBar()?.setTitle("友達リスト") 32 getSupportActionBar()?.setDisplayHomeAsUpEnabled(true) 33 34 fetchUsers() 35 } 36 37 companion object { 38 const val USER_KEY = "USER_KEY" 39 } 40 41 private fun fetchUsers(){ 42 val ref = FirebaseDatabase.getInstance().getReference("/users") 43 ref.addListenerForSingleValueEvent(object: ValueEventListener { 44 45 override fun onDataChange(snapshot: DataSnapshot) { 46 47 for(i in snapshot.children){ 48 Log.d("NewMessageActivity",i.toString()) 49 50 val userName = i.child("username").value 51 52 if (userName != null){ 53 nameList.add(userName as String) 54 } 55 } 56 57 recyclerView = findViewById(R.id.new_message_list) 58 recyclerView.layoutManager = LinearLayoutManager(this@NewMessageActivity) 59 recyclerView.adapter = adapter 60 61 adapter.itemClickListener = object: NewMessageRecyclerAdapter.OnItemClickListener { 62 override fun onItemClick(holder: NewMessageViewHolderList) { 63 val intent = Intent(this@NewMessageActivity, ChatLogActivity::class.java) 64 intent.putExtra(USER_KEY, holder.msgList.text) 65 startActivity(intent) 66 } 67 } 68 69 } 70 71 override fun onCancelled(p0: DatabaseError) { 72 73 } 74 }) 75 println("fetchUsers called") 76 } 77 78 79 //オプションメニュー用 80 //override fun onCreateOptionsMenu(menu: Menu?): Boolean {} 81 82 override fun onOptionsItemSelected(item: MenuItem): Boolean { 83 84 //戻るボタンの処理 85 if (item.itemId == android.R.id.home) { 86 finish() 87 } 88 89 if (item.itemId == R.id.action_new_message) { 90 //toolbarのアイコンがタップされた時の処理 91 } 92 return super.onOptionsItemSelected(item) 93 } 94 95 96}
回答1件