引起:java.lang.RuntimeException:布局不能为空。致电setLayout

问题描述:

只要按按钮通过Firebase发送消息,应用程序就会崩溃。我不知道如何解决这个错误。我尝试了很多,但不会停止崩溃。引起:java.lang.RuntimeException:布局不能为空。致电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

如何纠正呢? @Selvin,我很感激它,谢谢 –

+0

将正确的参数传递给构造函数...哪些是正确的?它全部在文档 – Selvin

+0

我传递了我认为正确的参数,但实际上并不是这样,所以我想我需要对代码的一点帮助。我试过重新安排参数,但它没有奏效。 –

你似乎使用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

Thankyou,以及帮助和我的错误被删除。但是,只要我按下发送消息按钮,我的应用就会崩溃。 引起:java.lang.RuntimeException:布局不能为空。致电setLayout –

+0

很高兴听到最初的问题消失了。这似乎是一个不同的问题,并且[这应该有所帮助](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it)。如果您无法解决问题,我建议隔离该问题并单独询问相关问题。如果你花时间[创建一个MCVE](http://stackoverflow.com/help/mcve),你更有可能获得帮助,并且不太可能得到低估。 –