扩展实现工具栏的基础 Activity 时,工具栏未显示在活动中

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

我是初学者 Android 开发人员,我一直在努力解决在继承 Base Activity 的任何 activity 中看不到工具栏的问题。根据其他资源,在不同的活动中使用相同的工具栏。我必须在 Base Activity 中实现它,并在我需要使用它的地方继承它。谁能帮我解决问题?

styles.xml

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

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

quiz.menu.xml 菜单文件夹内

<?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>

基地Activity

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);
        }
    }
}

欢迎Activity(继承基础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);
        }
    });
}

问卷

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);
    ...
}
}

答案其实很简单。您首先在 BaseActivity class 的 OnCreate() 方法中设置内容视图,然后在子 classes 的 OnCreate() 方法中将视图更改为另一个 xml 文件。

我建议您不要在 BaseActivity class 中实现 OnCreate() 方法,而是在 BaseActivity 中实现 SetContentView() 方法。

简而言之,从 BaseActivity() 中删除 onCreate() 方法并在下面添加 setContentView() 方法。

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

P.S - 您的 quiz_menu.xml 文件看起来不像菜单文件。 :) P.P.S - 让我知道它是否有效,或者如果您遇到问题。 :)