質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

931閲覧

intentでオブジェクトを渡したい

eotw

総合スコア48

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2022/06/16 04:24

前提

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/06/16 08:37

Android OS の建前上、各 Activity は独立したメモリ空間で動くように作ることになっているため、Intent (とういか Bundle) の内容はシリアライズされるので、生きたオブジェクトは渡せません。 Intent では id などを渡して、それに基づいてオブジェクトを取得し直す必要があるかと。
jimbe

2022/06/16 17:38 編集

関係無いですが、 > recyclerView = findViewById(R.id.chat_log_list) > recyclerView.adapter = ChatFromRecyclerAdapter(textList) > recyclerView.adapter = ChatToRecyclerAdapter(textList) このようなことをしても RecyclerView が2つ表示される訳ではありません。 指定できるアダプタは1つだけで、この場合は後から指定した To のほうが表示されるでしょう。
eotw

2022/06/17 06:41

hoshi-takanori さん ありがとうございます。 今回の場合だとどのように書けば良いのかイメージがつかず。。
guest

回答1

0

ベストアンサー

過去のご質問 から holder である NewMessageViewHolderList を探しますと、 msgList は TextView です。
従いまして、 NewMessageActivity の以下のコードの msgList.text は CharSequence です。

kotlin

1 val intent = Intent(this@NewMessageActivity, ChatLogActivity::class.java) 2 intent.putExtra(USER_KEY, holder.msgList.text) 3 startActivity(intent)

一方、ChatLogActivity では USER_KEY で入っているデータを User オブジェクトとして取り出そうとしています。

kotlin

1 val user = intent.getParcelableExtra<User>(NewMessageActivity.USER_KEY)

型が合っていませんので null が返されているものと思います。

投稿2022/06/17 11:25

jimbe

総合スコア12545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問