my app crashes when trying to display server message and I think the problem could be with my getView()
. below is the registerActivity
were the crash occurs and my activity_register.xml
import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; import com.fastchat.helper.SQLiteHandler; import com.fastchat.helper.SessionManager; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class RegisterActivity extends Activity { private static final String TAG = RegisterActivity.class.getSimpleName(); private Button btnRegister; private Button btnLinkToLogin; private EditText inputFullName; private EditText inputEmail; private EditText inputPassword; private ProgressDialog pDialog; private SessionManager session; private SQLiteHandler db; private ProgressBar progress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); inputFullName = (EditText) findViewById(R.id.name); inputEmail = (EditText) findViewById(R.id.email); inputPassword = (EditText) findViewById(R.id.password); btnRegister = (Button) findViewById(R.id.btnRegister); btnLinkToLogin = (Button) findViewById(R.id.btnLinkToLoginScreen); // Progress dialog pDialog = new ProgressDialog(this); pDialog.setCancelable(true); /* // Session manager session = new SessionManager(getApplicationContext()); // SQLite database handler db = new SQLiteHandler(getApplicationContext()); // Check if user is already logged in or not if (session.isLoggedIn()) { // User is already logged in. Take him to main activity Intent intent = new Intent(RegisterActivity.this, SearchableActivity.class); startActivity(intent); finish(); } */ // Register Button Click event btnRegister.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { String name = inputFullName.getText().toString(); String email = inputEmail.getText().toString(); String password = inputPassword.getText().toString(); if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) { registerProcess(name, email, password); } else { Toast.makeText(getApplicationContext(), "Please enter your details!", Toast.LENGTH_LONG) .show(); } } }); // Link to Login Screen btnLinkToLogin.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Intent i = new Intent(getApplicationContext(), LoginActivity.class); startActivity(i); finish(); } }); } private void registerProcess(String name,String email,String password){ String tag_string_req = "req_register"; //pDialog = new AlertDialog.Builder(getActivity()); pDialog.setMessage("please wait"); pDialog.show(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constants.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); RequestInterface requestInterface = retrofit.create(RequestInterface.class); User user = new User(); user.setName(name); user.setEmail(email); user.setPassword(password); ServerRequest request = new ServerRequest(); request.setOperation(Constants.REGISTER_OPERATION); request.setUser(user); Call<ServerResponse> response = requestInterface.operation(request); response.enqueue(new Callback<ServerResponse>() { private View view; public View getView() { return view; } @Override public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { ServerResponse resp = response.body(); if(resp !=null)//tried to check if resp is null but its not //crash occurs here Snackbar.make(getView(),resp.getMessage(), Snackbar.LENGTH_LONG).show(); pDialog.dismiss(); } @Override public void onFailure(Call<ServerResponse> call, Throwable t) { // progress.setVisibility(View.INVISIBLE); Log.d(Constants.TAG, "failed"); Toast.makeText(getApplicationContext(), t.getLocalizedMessage(), Toast.LENGTH_LONG).show(); pDialog.dismiss(); } }); }
activity_register.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:tools="http://schemas.android.com/tools" android:background="@color/bg_register" android:gravity="center" android:orientation="vertical" android:padding="10dp" android:id="@+id/chat"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical" android:paddingLeft="20dp" android:paddingRight="20dp" > <ImageView android:layout_width="389dp" android:layout_height="72dp" android:layout_gravity="center_horizontal" android:layout_marginBottom="24dp" android:src="@drawable/logo" tools:ignore="ContentDescription" /> <EditText android:id="@+id/name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:background="@color/input_register_bg" android:hint="@string/hint_name" android:padding="10dp" android:singleLine="true" android:inputType="textCapWords" android:textColor="@color/input_register" android:textColorHint="@color/input_register_hint" /> <EditText android:id="@+id/email" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:background="@color/input_register_bg" android:hint="@string/hint_email" android:inputType="textEmailAddress" android:padding="10dp" android:singleLine="true" android:textColor="@color/input_register" android:textColorHint="@color/input_register_hint" /> <EditText android:id="@+id/password" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:background="@color/input_register_bg" android:hint="@string/hint_password" android:inputType="textPassword" android:padding="10dp" android:singleLine="true" android:textColor="@color/input_register" android:textColorHint="@color/input_register_hint" /> <!-- Login Button --> <Button android:id="@+id/btnRegister" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dip" android:background="#ea4c88" android:text="register" android:textColor="@color/white" /> <!-- Link to Login Screen --> <Button android:id="@+id/btnLinkToLoginScreen" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="40dip" android:background="@null" android:text="already a member? login" android:textAllCaps="false" android:textColor="@color/white" android:textSize="15dp" /> </LinearLayout>
below is logcat message
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:137) at com.chat.RegisterActivity$3.onResponse(RegisterActivity.java:143) at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95)
I suggest that you to try with findViewById(android.R.id.content)
.
This is what did the trick for me:
Snackbar.make(findViewById(android.R.id.content), resp.getMessage(), Snackbar.LENGTH_LONG).show();
android.R.id.content
will give you the root element of the view (for more information on that, please check Android: What is android.R.id.content used for?).
I found one solution that may help others who are looking for common solution.
I got this error when I have tried to show message with Snackbar before loading our whole XML file.
In fragment I have tried to call API in onCreateView();
and showing Snackbar
message of Internet connection is off
as below:
@Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mBindingObject = DataBindingUtil.inflate(inflater, getLayoutResId(), container, false); getData(); return mBindingObject.getRoot(); }
I just put that method in onViewCreated()
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); getData(); }
Its working for me now.
BONUS:
Always try to use view after its loaded successfully. Each and every position of one line is matters.
Thank you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With