I am working on some Android application using Java using Android Studio on Windows 10 operating system. I have single Activity with several Fragments. Now, if I use target mobile phone with no previous installation of this app or I uninstall the app on target mobile phone, the main activity shows correct contents (Login Fragment):
However on 2nd and all other runs from Android Studio, I get blanck black screen from main activity:
Like I said, if I uninstall app or use the phone with no previous installation of app, it works fine. What is the problem?
P.S.: Since I am rather newbie with Android and I have no clue at all, what is wrong, I did not post any code of mine, becuase I do not know at all if this is a bug in my code or something else ...
UPDATE 1
According to @Ashutosh Ojha and @bhaskarkh hints, here is the method for switching fragments inside MainActivity.java:
public void switchToScreen(final Fragment targetFragment)
{
this.getSupportFragmentManager()
.beginTransaction()
.replace(R.id.mainActivity,
targetFragment)
.commit();
}
And here is relevant part of MainActivity.java:
public class MainActivity extends AppCompatActivity
{
private static final String TAG=MainActivity.class.getSimpleName();
private LoginFragment loginFragment=null;
private static final String[] appMandatoryPermissions=new String[]
{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
};
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if(this.loginFragment==null)
{
this.loginFragment=LoginFragment.newInstance();
}
this.checkAppPermissions();
}
public void switchToScreen(final Fragment targetFragment)
{
this.getSupportFragmentManager()
.beginTransaction()
.replace(R.id.mainActivity,
targetFragment)
.commit();
}
public void checkAppPermissions()
{
int permissionGrantResult=0;
List<String> neededPermissionsList=new ArrayList<>();
for(String permission:MainActivity.appMandatoryPermissions)
{
permissionGrantResult=ContextCompat.checkSelfPermission(this.getApplicationContext(),
permission);
if(permissionGrantResult!=PackageManager.PERMISSION_GRANTED)
{
neededPermissionsList.add(permission);
}
}
if(!neededPermissionsList.isEmpty())
{
ActivityCompat.requestPermissions(this,
neededPermissionsList.toArray(new String[neededPermissionsList.size()]),
0);
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults)
{
boolean allPermissionsGranted=false;
super.onRequestPermissionsResult(requestCode,
permissions,
grantResults);
if((permissions.length>0)&&
(grantResults.length>0)&&
(permissions.length==grantResults.length))
{
for(int permissionIndex=0; permissionIndex<permissions.length; permissionIndex++)
{
if(grantResults[permissionIndex]==PackageManager.PERMISSION_GRANTED)
{
Toast.makeText(this,
permissions[permissionIndex]+
" "+
"granted",
Toast.LENGTH_SHORT)
.show();
allPermissionsGranted=true;
}
else if(grantResults[permissionIndex]==PackageManager.PERMISSION_DENIED)
{
Toast.makeText(this,
permissions[permissionIndex]+
" "+
"denied",
Toast.LENGTH_SHORT)
.show();
allPermissionsGranted=false;
}
else
{
Toast.makeText(this,
permissions[permissionIndex]+
" "+
"invalid value, aborting",
Toast.LENGTH_SHORT)
.show();
allPermissionsGranted=false;
}
}
}
if(allPermissionsGranted)
{
setContentView(R.layout.activity_main);
this.switchToScreen(this.loginFragment);
}
else
{
this.finishAndRemoveTask();
}
}
Is this.finishAndRemoveTask(); right way to quit app?
And here is LoginFragment.java:
package com.mikroelektronika.guestnotificationsystem.Main;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import com.mikroelektronika.R;
import com.mikroelektronika.guestnotificationsystem.MainActivity;
public class LoginFragment extends Fragment
{
private static final String TAG=LoginFragment.class.getSimpleName();
private Button btnLogin=null;
private Button btnClear=null;
private Button btnRegister=null;
private EditText userNameEntryField=null;
private EditText passwordEntryField=null;
@NonNull
public static LoginFragment newInstance()
{
LoginFragment fragment=new LoginFragment();
Bundle args=new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@SuppressLint("SetTextI18n")
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState)
{
View inflatedView=inflater.inflate(R.layout.fragment_login,
container,
false);
if(this.userNameEntryField==null)
{
this.userNameEntryField=(EditText)inflatedView.findViewById(R.id.editUsername_field);
this.userNameEntryField.setText("my@bla.com");
}
if(this.passwordEntryField==null)
{
this.passwordEntryField=(EditText)inflatedView.findViewById(R.id.editPassword_field);
this.passwordEntryField.setText("frgfdgghgfhgy");
}
if(this.btnLogin==null)
{
this.btnLogin=(Button)inflatedView.findViewById(R.id.btnLogin);
}
if(this.btnClear==null)
{
this.btnClear=(Button)inflatedView.findViewById(R.id.btnClear);
}
if(this.btnRegister==null)
{
this.btnRegister=(Button)inflatedView.findViewById(R.id.btnRegister);
}
this.btnLogin.setOnClickListener(v->
{
String username=userNameEntryField.getText().toString();
String password=passwordEntryField.getText().toString();
if(!username.isEmpty()&&
!password.isEmpty())
{
MainActivity mainActivity=(MainActivity)requireActivity();
mainActivity.userLogin(username,
password);
}
else
{
Toast.makeText(getContext(),
"Credentials cannot be empty.",
Toast.LENGTH_SHORT).show();
}
});
this.btnClear.setOnClickListener(v->
{
userNameEntryField.setText("");
passwordEntryField.setText("");
});
this.btnRegister.setOnClickListener(v->
{
MainActivity mainActivity=(MainActivity)requireActivity();
mainActivity.switchToScreen(mainActivity.getRegisterFragment());
});
return inflatedView;
}
}
And its XML counterpart:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
tools:context=".guestnotificationsystem.Main.LoginFragment">
<TextView
android:id="@+id/textViewGreetings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal"
android:text="@string/welcome_text"
android:textAlignment="center" />
<TextView
android:id="@+id/textViewUsername"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textViewGreetings"
android:layout_centerHorizontal="true"
android:layout_gravity="center"
android:text="@string/username_text"
android:textAlignment="center" />
<EditText
android:id="@+id/editUsername_field"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textViewUsername"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal"
android:autofillHints=""
android:ems="40"
android:importantForAutofill="no"
android:inputType="textEmailAddress"
android:minHeight="48dp"
android:text=""
tools:ignore="SpeakableTextPresentCheck" />
<TextView
android:id="@+id/textViewPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editUsername_field"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal"
android:text="@string/password_text"
android:textAlignment="center" />
<EditText
android:id="@+id/editPassword_field"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textViewPassword"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal"
android:autofillHints=""
android:ems="40"
android:importantForAutofill="no"
android:inputType="textPassword"
android:minHeight="48dp"
android:text=""
tools:ignore="SpeakableTextPresentCheck" />
<LinearLayout
android:id="@+id/layoutButtons"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editPassword_field"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal"
android:minHeight="48dp"
android:orientation="horizontal">
<Button
android:id="@+id/btnLogin"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/login_text" />
<Button
android:id="@+id/btnClear"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/clear_text" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/layoutButtons"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:minHeight="48dp"
android:orientation="vertical">
<Button
android:id="@+id/btnRegister"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:minHeight="48dp"
android:text="@string/register_text" />
</LinearLayout>
</RelativeLayout>