KernelPanic
KernelPanic

Reputation: 2432

Android java app main activity blank after 2nd run fo app

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): Correct login screen However on 2nd and all other runs from Android Studio, I get blanck black screen from main activity: Blank 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

Answers (1)

ahjo4321hsotuhsa
ahjo4321hsotuhsa

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

Related Questions