2017-11-25 8 views
-2

ボタンを押すとすぐにアプリケーションがクラッシュし、firebase経由でメッセージが送信されます。私はこのエラーを修正する方法を知らない。私はたくさん試しましたが、クラッシュを止めることはありません。発生原因:java.lang.RuntimeException:レイアウトをnullにすることはできません。 setLayoutを呼び出します。

私は2つのレイアウトファイルを持っており、それらはlist_item2.xmlとlistitem_chatbox.xmlです。

私はプロジェクトの提出今夜を持っているので、任意のヘルプは本当すぐに高く評価されます、Thnkyou

public class MainActivityChat extends AppCompatActivity{ 


private static int SIGN_IN_REQUEST_CODE=1; 



Query query = FirebaseDatabase.getInstance() 
     .getReference() 
     .child("chats") 
     .limitToLast(50); 

FirebaseRecyclerOptions<ChatMessage> options = 
     new FirebaseRecyclerOptions.Builder<ChatMessage>() 
       .setQuery(query, ChatMessage.class) 
       .build(); 



private FirebaseListAdapter<ChatMessage> adapter; 
RelativeLayout listitem_chatbox; 
FloatingActionButton fab; 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if(item.getItemId() == R.id.nav_logout) 
    { 
     AuthUI.getInstance().signOut(this).addOnCompleteListener(new OnCompleteListener<Void>() { 
      @Override 
      public void onComplete(@NonNull Task<Void> task) { 
      Snackbar.make(listitem_chatbox, "YOU HAVE BEEN LOGGED OUT", Snackbar.LENGTH_SHORT).show(); 
      finish(); 
      } 
     }); 
    } 

    return true; 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if(resultCode == SIGN_IN_REQUEST_CODE) 
    { 
     Snackbar.make(listitem_chatbox, "SUCCESSFULLY SIGNED IN, WELCOME!", Snackbar.LENGTH_SHORT).show(); 
     displayChatMessage(); 
    } 

    else 
    { 
     Snackbar.make(listitem_chatbox, "SIGN IN FAILED, TRY LATER!!", Snackbar.LENGTH_SHORT).show(); 
     finish(); 
    } 
} 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.listitem_chatbox); 

    listitem_chatbox = (RelativeLayout)findViewById(R.id.listitem_chatbox); 
    fab= (FloatingActionButton)findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      EditText input= (EditText)findViewById(R.id.input); 
      FirebaseDatabase.getInstance().getReference().push().setValue(new ChatMessage(input.getText().toString(), 
        FirebaseAuth.getInstance().getCurrentUser().getEmail())); 

      input.setText(" "); 
     } 
    }); 


    if(FirebaseAuth.getInstance().getCurrentUser()==null) 
    { 
     startActivityForResult(AuthUI.getInstance().createSignInIntentBuilder().build(), SIGN_IN_REQUEST_CODE); 
    } 
    else 
    { 
     Snackbar.make(listitem_chatbox, "WELCOME" + FirebaseAuth.getInstance().getCurrentUser().getEmail(), Snackbar.LENGTH_SHORT).show(); 

     //display content 
     displayChatMessage(); 

    } 


} 

private void displayChatMessage() { 


     RecyclerView RV = (RecyclerView) findViewById(R.id.rv_numbers); 
     LinearLayoutManager LLM = new LinearLayoutManager(this); 
     RV.setLayoutManager(LLM); 
     RV.setHasFixedSize(true); 

    class ChatHolder extends RecyclerView.ViewHolder 
       { 

     TextView messageText, messageUser, messageTime; 

     public ChatHolder(View itemView) { 
      super(itemView); 


      messageText = (TextView) findViewById(R.id.message_text); 
      messageUser = (TextView) findViewById(R.id.message_user); 
      messageTime = (TextView) findViewById(R.id.message_time); 


     } 


    } 
    FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<ChatMessage, ChatHolder>(options) { 


     @Override 
     public ChatHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      // Create a new instance of the ViewHolder, in this case we are using a custom 
      // layout called R.layout.message for each item 
      View view = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.list_item2, parent, false); 

      return new ChatHolder(view); 
     } 

     @Override 
     protected void onBindViewHolder(ChatHolder holder, int position, ChatMessage model) { 
      // Bind the Chat object to the ChatHolder 
      // ... 
      holder.messageText.setText(model.getMessageText()); 
      holder.messageUser.setText(model.getMessageUser()); 
      holder.messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)", model.getMessageTime())); 
     } 

     @Override 
     public int getItemCount() { 
      return super.getItemCount(); 
     } 


    }; 
    RV.setAdapter(adapter); 
} 

}

+0

それを修正する方法? @セルビン、私はそれを感謝します、ありがとう –

+0

正しいパラメータをコンストラクタに渡す...どちらが正しいですか?それはドキュメントのすべてです – Selvin

+0

私は正しいと思うパラメータを渡していますが、実際にはそうではないので、私はコードで少し助けが必要だと思います。私もパラメータを再配置しようとしましたが、それは仕事をしませんでした。 –

答えて

1

あなたのコードは、構文を使用している間あなたは、FirebaseUI 3.xを使用しているように見えますFirebaseUI 2.x以下の場合3.xでは、アダプタのコンストラクタが、別々のパラメータの代わりにFirebaseRecyclerOptions引数を取るように変更されました。 readme on github

最初に、FirebaseRecyclerOptionsをビルドしてアダプタを構成します。この場合、チャットの例を続けます:

FirebaseRecyclerOptions<Chat> options = 
      new FirebaseRecyclerOptions.Builder<Chat>() 
        .setQuery(query, Chat.class) 
        .build(); 

次に、FirebaseRecyclerAdapterオブジェクトを作成します。各項目を表示するためのサブクラスはすでにViewHolderです。このケースでは、カスタムChatHolderクラスを使用します。

adapter = new FirebaseRecyclerAdapter<Chat, ChatHolder>(options) { 
+0

ありがとうございました。それは助けになり、私のエラーは取り除かれました。しかし、メッセージの送信ボタンを押すとすぐに私のアプリがクラッシュするようになりました。 原因:java.lang.RuntimeException:レイアウトをnullにすることはできません。 setLayoutを呼び出す –

+0

最初の問題が解消されたことを聞いてよかったです。それは別の問題のように思えますが、これは助けになるはずです(https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it)。それを修正できない場合は、その問題を切り分けて、別の質問をすることをお勧めします。あなたが[MCVEを作成する](http://stackoverflow.com/help/mcve)時間を過ごすなら、あなたは助けを受ける可能性が高く、ダウン投票になる可能性はずっと少なくなります。 –

関連する問題