-4

I am using Android Studio 2.3 Testing Device (Tecno-Tecno-6.0 Marshallow).

I am new to android apps development.. I have 3 Activity (MainActivity, DisplayMessageActivity and ReadMessageActivity).screens.

I can navigate back and forth from the MainActivity, which is the parentActivity to the DisplayMessageActivity, which is the child activity, and from DisplayMessageActivity to the ReadMessageActivity.

But I cannot navigate back from ReadMessageActivity to the DisplayMessageActivity. When I do this, the application crashes with error "Unfortunately, AppName has Stopped."

This app works fine...except that the 3rd activity crashes the app when going back to the 2nd activity.

Please see the AndroidManifest.xml and the different Activity.xml codes below and help me in this challenge. Thank you in advance.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".DisplayMessageActivity"
        android:parentActivityName=".MainActivity"
        android:label="@string/welcome_screen_title"
        android:finishOnTaskLaunch="true"
        android:launchMode="standard">

        <!-- The meta-data tag is required if you support API level 15 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
    </activity>


    <activity android:name=".ReadMessageActivity"
        android:parentActivityName=".DisplayMessageActivity"
        android:label="@string/question_screen"
        android:allowTaskReparenting="true">

        <!-- The meta-data tag is required if you support API level 15 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".DisplayMessageActivity" />
    </activity>
</application>

MainActivity.xml

package com.example.examinationportal;
import android.content.Intent;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
   String message = "";

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

    /** Called when the user taps the Send button */
    public void loginUser(View login) {
        Intent intent = new Intent(this, DisplayWelcomeScreen.class);//start the ui
        //initialize the status bar textview control
        TextView statusBar = (TextView) findViewById(R.id.textViewStatusMsg);
        //initialize textViewLogin
        TextView titleLogin = (TextView) findViewById(R.id.textViewLogin) ;
        titleLogin.setTextColor(0x01060013);//colors

        EditText un = (EditText) findViewById(R.id.editTextUsername);//username field
        EditText pw = (EditText) findViewById(R.id.editTextPassword);//password field

        String username = un.getText().toString();//convert username and password to string and parse
        String password = pw.getText().toString();//them to variables

        //check the login
       if(username.equals("admin")  && password.equals("admin")){//compare the username and password entered by user with the defaul
           message = "Welcome"; //message for successful login
           String msg = "Login Successful!";//this message will be displayed on the status bar
           statusBar.setTextColor(Color.parseColor("#ff0000"));
           statusBar.setBackgroundColor(Color.parseColor("#d3d3d3"));
           statusBar.setText(msg);//disp the msg for unsuccessful login

           Bundle bundle = new Bundle();//bundle the message and parse it to the next activity
           bundle.putString("dispMsg", message);//bundle the message using the variable dispMsg
           intent.putExtras(bundle);
           startActivity(intent);
       }else{
           message = "Invalid Login! You are not authorised to view this page...";

           //statusBar.setText(null);//status bar textview
           //statusBar.setTextColor(getResources().getColor(R.color.colorAccent));
           //statusBar.setTextColor(ContextCompat.getColor(context, R.color.colorAccent));
           statusBar.setTextColor(Color.parseColor("#ff0000"));
           statusBar.setBackgroundColor(Color.parseColor("#d3d3d3"));
           statusBar.setText(message);//disp the msg for unsuccessful login
        }

    }
}

DisplayMessageActivity.xml

package com.example.examinationportal;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class DisplayWelcomeScreen extends AppCompatActivity {

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


    // Get the Intent that started this activity and extract the string
    Intent intent = getIntent();
    Bundle bundle = getIntent().getExtras();
    String showMsg = bundle.getString("dispMsg");

    // Capture the layout's TextView and set the string as its text
    TextView textView = (TextView) findViewById(R.id.textViewWelcome);
    textView.setText(showMsg);

        //disable some controls when user is not logged in
        View buttonCSS342 = findViewById(R.id.buttonCSS342);



        View buttonCSS352 = findViewById(R.id.buttonCSS352);
        View buttonCSS354 = findViewById(R.id.buttonCSS354);
        View buttonCSS356 = findViewById(R.id.buttonCSS356);
        View buttonCSS381 = findViewById(R.id.buttonCSS381);
        View buttonPCR362 = findViewById(R.id.buttonPCR362);
  }
public void courseClicked(View v) {

        String course = "";
        Intent intent = new Intent(this, CSS_342_Questions.class);
        int qNum = 0;

       switch (v.getId()){
           case R.id.buttonCSS342:
               course = "CSS 342";
               qNum=1;
               break;
           case R.id.buttonCSS352:
               course = "CSS 352";
               qNum=1;
               break;
           case R.id.buttonCSS354:
               course = "CSS 354";
               qNum=1;
               break;
           case R.id.buttonCSS356:
               course = "CSS 356";
               qNum=1;
               break;
           case R.id.buttonCSS381:
               course = "CSS 381";
               qNum=1;
               break;
           case R.id.buttonPCR362:
               course = "PCR 362";
               qNum=1;
               break;
       }
        Bundle bundle = new Bundle();
        bundle.putString("dispCode", course);
        bundle.putInt("qNum", qNum);
        intent.putExtras(bundle);

        startActivity(intent);

    }
}

ReadMessageActivity.xml

package com.example.examinationportal;


import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.TextView;

import org.w3c.dom.Text;

public class CSS_342_Questions extends AppCompatActivity {
    public int qNum = 0;
    public String showCode ="";
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_css_342__questions);

        // Get the Intent that started this activity and extract the string
        Intent intent = getIntent();
        Bundle bundle = getIntent().getExtras();
        showCode = bundle.getString("dispCode");
        qNum = bundle.getInt("qNum");

        TextView textView = (TextView) findViewById(R.id.textViewCourseTitle);
        TextView qn = (TextView)findViewById(R.id.textViewQn);
        TextView q = (TextView)findViewById(R.id.textViewQ);

        WebView ans = (WebView) findViewById(R.id.textViewAns);
        ans.getSettings().setLoadsImagesAutomatically(true);
        ans.getSettings().setJavaScriptEnabled(true);
        ans.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        ans.getSettings().setBuiltInZoomControls(true);

View buttonPrev = findViewById(R.id.buttonPrevious);
        View buttonNext = findViewById(R.id.buttonNext);

        if(showCode.equals("CSS 342") && qNum == 1) {
            String showTitle = "Safety Management and Loss Prevention";
            textView.setText(showTitle);// Capture the layout's TextView and set the string as its text
            qn.setText(Questions.css342_q1[0]);
            q.setText(Questions.css342_q1[1]);
            ans.loadUrl("file:///android_asset/css342_q1.html");
            buttonPrev.setVisibility( View.INVISIBLE);
            qNum = 1;
        }else if(showCode.equals("CSS 352") && qNum == 1){
            String showTitle = "Crime and Crime Theories";
            // Capture the layout's TextView and set the string as its text
            textView.setText(showTitle);
            qn.setText(Questions.css352_q1[0]);
            q.setText(Questions.css352_q1[1]);
            ans.loadUrl("file:///android_asset/css352_q1.html");
            buttonPrev.setVisibility(View.INVISIBLE);
            qNum = 1;
 }
    }
}
Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62

1 Answers1

0

Update your AndroidManifest.xml as below:

.................
.........................

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".DisplayWelcomeScreen"
        android:label="@string/welcome_screen_title">

    </activity>

    <activity android:name=".CSS_342_Questions"
        android:label="@string/question_screen">

    </activity>
</application>

...............
.......................

Clean and Run your application. Hope it will work~

Ferdous Ahamed
  • 21,438
  • 5
  • 52
  • 61
  • I like your enthusiasm... but your answer does not work.. rather, it removes the 'Up' Button from the its position. I have to press the cancel button on the device in order to go back. Please I need more help. – Cybernetiquettes Apr 13 '17 at 16:10
  • @Luiz, I think I have found the LogCat Stack Trace... Below is it... --------- beginning of crash 04-13 17:33:16.038 579-579/com.example.examinationportal E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.examinationportal, PID: 579 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.examinationportal/com.example.examinationportal.DisplayWelcomeScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' – Cybernetiquettes Apr 13 '17 at 16:40
  • on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2572) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5763) at java.lang.reflect.Method.invoke(Native Method) – Cybernetiquettes Apr 13 '17 at 16:41
  • at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference at com.example.examinationportal.DisplayWelcomeScreen.onCreate(DisplayWelcomeScreen.java:21) at android.app.Activity.performCreate(Activity.java:6375) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113) at – Cybernetiquettes Apr 13 '17 at 16:41
  • android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2519) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5763) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) – Cybernetiquettes Apr 13 '17 at 16:42
  • at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) – Cybernetiquettes Apr 13 '17 at 16:42