在阅读了大部分官方android留档后,我遇到了在不使用工具栏对象的情况下设置Appbar的问题。有趣的是,菜单上的这个官方页面链接到在on创建()方法中使用工具栏对象。虽然我最近得到了一个工具栏来工作,但我不需要工具栏对象的额外灵活性/自定义,而是选择为我的活动使用各种菜单xml文件。问题是:我的选项菜单代码不会生成任何类型的Appbar…它只会生成一个空白的白色屏幕,上面有任务栏(电池/时间条)。
一般说明:我不希望支持旧的SDK(
以下代码/资源是我编写的:
app/[包]/MainActivity.java
package [package];
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity;
import [package].R;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
注意:我尝试过在onCreateOptionsMenu()中调用super,也在return语句中调用它。我也尝试过扩展AppCompatActivity而不是Activity,但是我不打算支持早期的SDK版本。我在onCreateOptionsMenu()中设置了断点,调试工具似乎并没有就此停止。也许onCreateOptionsMenu()不是从onStart()调用的?
res/menu/main_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" >
<item android:id="@+id/action_servers"
android:icon="@drawable/ic_action_server"
android:title="@string/action_server"
app:showAsAction="ifRoom" />
<item android:id="@+id/action_settings"
android:icon="@drawable/ic_action_settings"
android:title="@string/action_settings"
app:showAsAction="ifRoom"/>
</menu>
注意:AndroidStudio能够毫无问题地预览此xml。
分辨率/布局/activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/swipe_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- Some commented out stuff for now -->
</androidx.constraintlayout.widget.ConstraintLayout>
注意:我已经在这个布局中创建了一个工具栏对象,之前它只起作用。这个问题与工具栏无关。AndroidStudio允许我预览这个,它是一个空白屏幕。
Android清单.xml
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
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>
注意:我已经在res/values/styles.xml中尝试了各种有/没有ActionBar的android:themes...值得注意的是:(主题。AppCompat.Light.DarkActionBar和Theme。AppCompat.NoActionBar)。前一个主题导致空白的白色屏幕,后一个主题导致深灰色。
如果我省略的其他文件需要进一步诊断,请务必告诉我。我的假设是它与我正在使用的约束布局有关。
这些是我看过的页面,对解决我的问题没有帮助:
更改 MainActivity.java 文件构造函数行以扩展 AppCompatActivity
public class MainActivity extends AppCompatActivity {
并将 android:theme 设置为 Theme.AppCompat* 的变体,会显示我一直在努力显示的 MainActivity Appbar。以下是我为找到合适的解决方案所做的更多研究。
为什么这有效...是 AppCompatActivity 和基类 Activity 之间的差异。AppCompatActivity 继承自活动,使用这些主题之一会告知应用使用本机 ActionBar 类来提供应用栏。一般来说,使用新的工具栏对象似乎是最好的方法,因为它允许更多的自定义(截至 2019 年)。围绕此主题的大多数早期问题都使用过时/已弃用的代码,例如 ActionBarActivity。
这是通过根据本文档更改活动的布局文件以包含工具栏来实现的。然后可以使用这个问题范围之外的技术适当地修改工具栏的主题。