java - 扩展实现 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);
...
}
}
解决方案
答案其实很简单。您首先在 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 - 让我知道它是否有效,或者如果你有麻烦。:)
推荐阅读
- c++ - 这个 C++ 语句中的方括号是什么意思?
- php - 为什么我的 SQL 代码没有从数据库中获取数据?
- android - 不允许旋转 android 应用程序
- r - 如何绘制关于阿姆斯特丹邮政编码/社区的地图和数据
- oracle - oracle pl/sql utl_file ORA-29280: 无效的目录路径和 ORA-29280: 无效的目录对象
- javascript - Html - Javascript:Mysql不会将数据保存在数据库中
- django - Django 创建多对多关系
- jekyll - 如何禁用 github 页面中的排版?
- laravel - 根据 laravel 中的认证用户返回结果
- android - Firestore 查询缓存