0

I'm new at coding so I might be not very good at explaining. I'm trying to build chat app with Firebase.

Here is my code for Main activity:

Mpackage com.example.otto.myfirstapplication;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.text.format.DateFormat;

import com.firebase.ui.auth.AuthUI;
import com.firebase.ui.database.FirebaseListAdapter;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.FirebaseDatabase;


public class MainActivity extends AppCompatActivity {

private static int SIGN_IN_REQUEST_CODE = 1;
private FirebaseListAdapter<ChatClass> adapter;
RelativeLayout activity_main;
FloatingActionButton fab;

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId() == R.id.menu_sign_out)
    {
         AuthUI.getInstance().signOut(this).addOnCompleteListener(new         OnCompleteListener<Void>() {
             @Override
             public void onComplete(@NonNull Task<Void> task) {
                 Snackbar.make(activity_main,"You have been signed out.", Snackbar.LENGTH_SHORT).show();
                 finish();
             }
         });
    }
    return true;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu,menu);
    return true;
}

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

            Snackbar.make(activity_main,"Successfully sighned in.Welcome!", Snackbar.LENGTH_SHORT).show();
            displayChatMessage();

        }
        else{
            Snackbar.make(activity_main,"Error 1", Snackbar.LENGTH_SHORT).show();
            finish();
        }

    }
}

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



    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 ChatClass(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(activity_main,"Welcome " +FirebaseAuth.getInstance().getCurrentUser().getEmail(),Snackbar.LENGTH_SHORT).show();
    }
    displayChatMessage();
}

private void displayChatMessage() {
    ListView listOfMessage = (ListView)findViewById(R.id.list_of_message);
    adapter = new FirebaseListAdapter<ChatClass>(this,ChatClass.class,R.layout.list_item,FirebaseDatabase.getInstance().getReference()) {



        @Override
        protected void populateView(View v, ChatClass model, int position) {
            TextView messageText,messageUser,messageTime;
            messageText = (TextView)findViewById(R.id.message_text);
            messageUser = (TextView)findViewById(R.id.message_user);
            messageTime = (TextView)findViewById(R.id.message_time);

            messageText.setText(model.getMessageText());
            messageUser.setText(model.getMessageUser());
            messageTime.setText(DateFormat.format("dd-mm-yy (HH:mm:ss)",model.getMessageTime()));
        }
    };
    listOfMessage.setAdapter(adapter);
}
}

And code for acitivty_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<android.support.design.widget.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:src="@drawable/c_send"
    android:id="@+id/fab"
    android:tint="@android:color/white"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    app:fabSize="mini"
    />
<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@+id/fab"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true"

    >
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Message..."
    android:id="@+id/input"
        />
</android.support.design.widget.TextInputLayout>
<ListView
    android:id="@+id/list_of_message"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:layout_above="@+id/fab"
    android:dividerHeight="16dp"
    android:divider="@android:color/transparent"
    android:layout_marginBottom="16dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</ListView>

Error code from the logcat while app says that it keeps stopping tells me that problem is in the snackbar:

 Caused by: java.lang.IllegalArgumentException: No suitable parent found from the given view. Please provide a valid view.
    at android.support.design.widget.Snackbar.make(Snackbar.java:181)
    at com.example.otto.myfirstapplication.MainActivity.onCreate(MainActivity.java:97)
    at android.app.Activity.performCreate(Activity.java:7009)
    at android.app.Activity.performCreate(Activity.java:7000)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)

I updated all dependencies to the latest versions. I was thinking maybe I have to downgrade to solve a problem but I'm not sure.

Anyway I'm super stuck and hope you can help me. Thanks in advance.

2
  • RelativeLayout activity_main; you haven't initialized the activity_main, use findviewbyid in onCreate of activity Commented Oct 4, 2018 at 9:43
  • @OtarJibladze did my answer help you? Commented Oct 17, 2018 at 4:25

3 Answers 3

1

Change at all places,

Snackbar.make(activity_main,...

to

Snackbar.make(findViewById(android.R.id.content),...

Cause

You did not initialize activity_main. So it is null when you use it. findViewById(android.R.id.content) gives you root view of current Activity.

Sign up to request clarification or add additional context in comments.

1 Comment

Make global variable View root_view; to not again again using findViewById(android.R.id.content).
0

First of All you have to create coordinator layout to appear your snackbar. so change your main relativelayout to coordinator layout .

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


//YOUR CURRENT CODE

</android.support.design.widget.CoordinatorLayout>

after that in your activity .

 coordinatorLayout = (CoordinatorLayout) findViewById(R.id
                .coordinatorLayout);

and make your Snackbar layout like this

 Snackbar snackbar = Snackbar.make(coordinatorLayout, "Welcome to AndroidHive", Snackbar.LENGTH_LONG);

 snackbar.show();

Comments

0
As in your code, 
RelativeLayout activity_main; 
you haven't initialized the activity_main, use findviewbyid in onCreate of activity
In xml change the below code, add the id in xml.

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container"
    tools:context=".MainActivity">

and in the code fetch the id in onCreate method of Activity:

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

    activity_main=findViewById(R.id.container);
    }

and now use this view(activity_main) in snack bar.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.