首页 > 解决方案 > 扩展实现 ToolBar 的 Base Activity 时,Activity 中不显示工具栏

问题描述

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

样式.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>

基本活动

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

标签: javaandroidandroid-activityandroid-toolbarandroid-menu

解决方案


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

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

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

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

PS - 您的quiz_menu.xml文件看起来不像菜单文件。:) PPS - 让我知道它是否有效,或者如果你有麻烦。:)


推荐阅读