\nHowever on 2nd and all other runs from Android Studio, I get blanck black screen from main activity
:\n\nLike 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 ...
\nUPDATE 1
\nAccording to @Ashutosh Ojha and @bhaskarkh hints, here is the method for switching fragments inside MainActivity.java
:
public void switchToScreen(final Fragment targetFragment)\n{\n this.getSupportFragmentManager()\n .beginTransaction()\n .replace(R.id.mainActivity,\n targetFragment)\n .commit();\n}\n
\nAnd here is relevant part of MainActivity.java
:
public class MainActivity extends AppCompatActivity\n{\n private static final String TAG=MainActivity.class.getSimpleName();\n \n private LoginFragment loginFragment=null; \n \n private static final String[] appMandatoryPermissions=new String[]\n {\n Manifest.permission.READ_EXTERNAL_STORAGE,\n Manifest.permission.WRITE_EXTERNAL_STORAGE,\n Manifest.permission.CAMERA\n };\n \n @Override\n protected void onCreate(Bundle savedInstanceState)\n {\n super.onCreate(savedInstanceState);\n \n if(this.loginFragment==null)\n {\n this.loginFragment=LoginFragment.newInstance();\n }\n \n this.checkAppPermissions();\n }\n \n public void switchToScreen(final Fragment targetFragment)\n {\n this.getSupportFragmentManager()\n .beginTransaction()\n .replace(R.id.mainActivity,\n targetFragment)\n .commit();\n }\n \n public void checkAppPermissions()\n {\n int permissionGrantResult=0;\n List<String> neededPermissionsList=new ArrayList<>();\n\n for(String permission:MainActivity.appMandatoryPermissions)\n {\n permissionGrantResult=ContextCompat.checkSelfPermission(this.getApplicationContext(),\n permission);\n\n if(permissionGrantResult!=PackageManager.PERMISSION_GRANTED)\n {\n neededPermissionsList.add(permission);\n }\n }\n\n if(!neededPermissionsList.isEmpty())\n {\n ActivityCompat.requestPermissions(this,\n neededPermissionsList.toArray(new String[neededPermissionsList.size()]),\n 0);\n }\n }\n \n @Override\n public void onRequestPermissionsResult(int requestCode,\n @NonNull String[] permissions,\n @NonNull int[] grantResults)\n {\n boolean allPermissionsGranted=false;\n\n super.onRequestPermissionsResult(requestCode,\n permissions,\n grantResults);\n\n if((permissions.length>0)&&\n (grantResults.length>0)&&\n (permissions.length==grantResults.length))\n {\n for(int permissionIndex=0; permissionIndex<permissions.length; permissionIndex++)\n {\n if(grantResults[permissionIndex]==PackageManager.PERMISSION_GRANTED)\n {\n Toast.makeText(this,\n permissions[permissionIndex]+\n " "+\n "granted",\n Toast.LENGTH_SHORT)\n .show();\n\n allPermissionsGranted=true;\n }\n else if(grantResults[permissionIndex]==PackageManager.PERMISSION_DENIED)\n {\n Toast.makeText(this,\n permissions[permissionIndex]+\n " "+\n "denied",\n Toast.LENGTH_SHORT)\n .show();\n\n allPermissionsGranted=false;\n }\n else\n {\n Toast.makeText(this,\n permissions[permissionIndex]+\n " "+\n "invalid value, aborting",\n Toast.LENGTH_SHORT)\n .show();\n\n allPermissionsGranted=false;\n }\n }\n }\n\n if(allPermissionsGranted)\n {\n setContentView(R.layout.activity_main);\n this.switchToScreen(this.loginFragment);\n }\n else\n {\n this.finishAndRemoveTask();\n }\n }\n
\nIs this.finishAndRemoveTask(); right way to quit app?\nAnd here is LoginFragment.java
:
package com.mikroelektronika.guestnotificationsystem.Main;\n\nimport android.annotation.SuppressLint;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.EditText;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\n\nimport com.mikroelektronika.R;\nimport com.mikroelektronika.guestnotificationsystem.MainActivity;\n\npublic class LoginFragment extends Fragment\n{\n private static final String TAG=LoginFragment.class.getSimpleName();\n\n private Button btnLogin=null;\n private Button btnClear=null;\n private Button btnRegister=null;\n private EditText userNameEntryField=null;\n private EditText passwordEntryField=null;\n\n @NonNull\n public static LoginFragment newInstance()\n {\n LoginFragment fragment=new LoginFragment();\n Bundle args=new Bundle();\n\n fragment.setArguments(args);\n\n return fragment;\n }\n\n @Override\n public void onCreate(Bundle savedInstanceState)\n {\n super.onCreate(savedInstanceState);\n }\n\n @SuppressLint("SetTextI18n")\n @Override\n public View onCreateView(@NonNull LayoutInflater inflater,\n ViewGroup container,\n Bundle savedInstanceState)\n {\n View inflatedView=inflater.inflate(R.layout.fragment_login,\n container,\n false);\n\n if(this.userNameEntryField==null)\n {\n this.userNameEntryField=(EditText)inflatedView.findViewById(R.id.editUsername_field);\n this.userNameEntryField.setText("my@bla.com");\n }\n\n if(this.passwordEntryField==null)\n {\n this.passwordEntryField=(EditText)inflatedView.findViewById(R.id.editPassword_field);\n this.passwordEntryField.setText("frgfdgghgfhgy");\n }\n\n if(this.btnLogin==null)\n {\n this.btnLogin=(Button)inflatedView.findViewById(R.id.btnLogin);\n }\n\n if(this.btnClear==null)\n {\n this.btnClear=(Button)inflatedView.findViewById(R.id.btnClear);\n }\n\n if(this.btnRegister==null)\n {\n this.btnRegister=(Button)inflatedView.findViewById(R.id.btnRegister);\n }\n\n this.btnLogin.setOnClickListener(v->\n {\n String username=userNameEntryField.getText().toString();\n String password=passwordEntryField.getText().toString();\n\n if(!username.isEmpty()&&\n !password.isEmpty())\n {\n MainActivity mainActivity=(MainActivity)requireActivity();\n\n mainActivity.userLogin(username,\n password);\n }\n else\n {\n Toast.makeText(getContext(),\n "Credentials cannot be empty.",\n Toast.LENGTH_SHORT).show();\n }\n });\n\n this.btnClear.setOnClickListener(v->\n {\n userNameEntryField.setText("");\n passwordEntryField.setText("");\n });\n\n this.btnRegister.setOnClickListener(v->\n {\n MainActivity mainActivity=(MainActivity)requireActivity();\n\n mainActivity.switchToScreen(mainActivity.getRegisterFragment());\n });\n\n return inflatedView;\n }\n}\n
\nAnd its XML counterpart
:
<?xml version="1.0" encoding="utf-8"?>\n<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"\n xmlns:tools="http://schemas.android.com/tools"\n android:layout_width="match_parent"\n android:layout_height="match_parent"\n android:background="@color/black"\n tools:context=".guestnotificationsystem.Main.LoginFragment">\n\n <TextView\n android:id="@+id/textViewGreetings"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:layout_alignParentTop="true"\n android:layout_centerHorizontal="true"\n android:layout_gravity="center_horizontal"\n android:text="@string/welcome_text"\n android:textAlignment="center" />\n\n <TextView\n android:id="@+id/textViewUsername"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:layout_below="@+id/textViewGreetings"\n android:layout_centerHorizontal="true"\n android:layout_gravity="center"\n android:text="@string/username_text"\n android:textAlignment="center" />\n\n <EditText\n android:id="@+id/editUsername_field"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:layout_below="@+id/textViewUsername"\n android:layout_centerHorizontal="true"\n android:layout_gravity="center_horizontal"\n android:autofillHints=""\n android:ems="40"\n android:importantForAutofill="no"\n android:inputType="textEmailAddress"\n android:minHeight="48dp"\n android:text=""\n tools:ignore="SpeakableTextPresentCheck" />\n\n <TextView\n android:id="@+id/textViewPassword"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:layout_below="@+id/editUsername_field"\n android:layout_centerHorizontal="true"\n android:layout_gravity="center_horizontal"\n android:text="@string/password_text"\n android:textAlignment="center" />\n\n <EditText\n android:id="@+id/editPassword_field"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:layout_below="@+id/textViewPassword"\n android:layout_centerHorizontal="true"\n android:layout_gravity="center_horizontal"\n android:autofillHints=""\n android:ems="40"\n android:importantForAutofill="no"\n android:inputType="textPassword"\n android:minHeight="48dp"\n android:text=""\n tools:ignore="SpeakableTextPresentCheck" />\n\n <LinearLayout\n android:id="@+id/layoutButtons"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:layout_below="@+id/editPassword_field"\n android:layout_centerHorizontal="true"\n android:layout_gravity="center_horizontal"\n android:minHeight="48dp"\n android:orientation="horizontal">\n\n <Button\n android:id="@+id/btnLogin"\n style="?android:attr/buttonBarButtonStyle"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:layout_gravity="center_horizontal"\n android:text="@string/login_text" />\n\n <Button\n android:id="@+id/btnClear"\n style="?android:attr/buttonBarButtonStyle"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:layout_gravity="center_horizontal"\n android:text="@string/clear_text" />\n </LinearLayout>\n\n <LinearLayout\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:layout_below="@+id/layoutButtons"\n android:layout_centerHorizontal="true"\n android:layout_gravity="center_horizontal"\n android:gravity="center_horizontal"\n android:minHeight="48dp"\n android:orientation="vertical">\n\n <Button\n android:id="@+id/btnRegister"\n android:layout_width="wrap_content"\n android:layout_height="wrap_content"\n android:layout_gravity="center_horizontal"\n android:minHeight="48dp"\n android:text="@string/register_text" />\n </LinearLayout>\n</RelativeLayout>\n
\n","author":{"@type":"Person","name":"KernelPanic"},"upvoteCount":0,"answerCount":1,"acceptedAnswer":{"@type":"Answer","text":"When you are running app 2nd time you had already provided permission and there is no fragment or UI loading in this case hence blank screen. Else case is missing after permission check
\n if(!neededPermissionsList.isEmpty())\n {\n ActivityCompat.requestPermissions(this,\n neededPermissionsList.toArray(new \n String[neededPermissionsList.size()]),0);\n }\n else{ //call setContentView and FragmentTransaction here}\n
\nNOTE: You can have more optimised way of doing your task, please check that
\n","author":{"@type":"Person","name":"ahjo4321hsotuhsa"},"upvoteCount":2}}}Reputation: 2432
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>
Upvotes: 0
Views: 44
Reputation: 430
When you are running app 2nd time you had already provided permission and there is no fragment or UI loading in this case hence blank screen. Else case is missing after permission check
if(!neededPermissionsList.isEmpty())
{
ActivityCompat.requestPermissions(this,
neededPermissionsList.toArray(new
String[neededPermissionsList.size()]),0);
}
else{ //call setContentView and FragmentTransaction here}
NOTE: You can have more optimised way of doing your task, please check that
Upvotes: 2