Search code examples
javaandroidandroid-activityandroid-toolbarandroid-menu

Toolbar is not shown in activities when extending Base Activity that implements ToolBar


I am a beginner Android developer and I have been struggling the issue that I can't see the toolbar in any activity that inherits Base Activity. According to other resource, to use the same toolbar in the different activities. I have to implement it in Base Activity and inherit it where I need to use it. Could anyone help me figure out the problem?

styles.xml

<resources>
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
</style>

<style name="AppTheme" parent="AppBaseTheme">
</style>
</resources>

quiz.menu.xml inside of menu folder

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/contact"
    android:icon="@drawable/ic_contacts_black_24dp"
    android:title="Contact"
    app:showAsAction="ifRoom" />

<item android:id="@+id/language"
    android:title="Language"
    app:showAsAction="never" />

<item android:id="@+id/speech"
    android:title="Speech"
    app:showAsAction="never">

    <munu>
        <item android:id="@+id/subitem1"
            android:title="Sub Item 1"/>

        <item android:id="@+id/subitem2"
            android:title="Sub Item 2"/>
    </munu>
</item>
</menu>

BaseActivity

public class BaseActivity extends AppCompatActivity {

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

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.quiz_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case R.id.contact:
            Toast.makeText(this, "Contact is selected", Toast.LENGTH_SHORT).show();
            return true;

        case R.id.language:
            Toast.makeText(this, "Language is selected", Toast.LENGTH_SHORT).show();
            return true;

        case R.id.speech:
            Toast.makeText(this, "Speech is selected", Toast.LENGTH_SHORT).show();
            return true;

        case R.id.subitem1:
            Toast.makeText(this, "Language is selected", Toast.LENGTH_SHORT).show();
            return true;

        case R.id.subitem2:
            Toast.makeText(this, "Speech is selected", Toast.LENGTH_SHORT).show();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

WelcomeActivity (inherits base Activity)

public class WelcomeActivity extends BaseActivity {

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

    final Button databaseButton = findViewById(R.id.database);
    databaseButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // Code here executes on main thread after user presses button
            Intent databaseIntent = new Intent(WelcomeActivity.this, Questionnaire.class);
            startActivity(databaseIntent);
        }
    });
}

Questionnaire

public class Questionnaire extends BaseActivity {
public Spinner languageSpinner;
public int languageId;

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

Solution

  • The answer is actually simple. You firstly set contentview in OnCreate() method of the BaseActivity class, then you change the view to another xml file in OnCreate() methods of the child classes.

    What I suggest is that you do not implement OnCreate() method in BaseActivity class but implement SetContentView() method in BaseActivity.

    In short, delete onCreate() method from BaseActivity() and add setContentView() method in the below.

    @Override
    public void setContentView(int layoutResID) {
        super.setContentView(layoutResID);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }
    

    P.S - Your quiz_menu.xml file does not look like a menu file. :) P.P.S - Let me know if it works, or if you have troubles. :)