在阅读了大部分官方Android文档后,我遇到了设置Appbar而不使用Toolbar object的麻烦。有趣的是,菜单上的this official page链接到在onCreate()方法中使用工具栏对象。虽然我最近有一个工具栏可以工作,但我不需要工具栏对象的额外灵活性/自定义,而是选择使用各种菜单xml文件进行我的活动。问题是:我的选项菜单的代码不会产生任何类型的Appbar ...它只会产生一个空白的白色屏幕,顶部有任务栏(电池/时间条)。
一般说明:我不打算支持旧的SDK(<7)。此外,我正在使用的手机(LG Stylo3 7.0)在硬件中没有菜单按钮。我的目标是支持minSdkVersion 21,使用targetSdkVersion 28.我也没有扩展片段。我写了许多其他活动,但如果没有适当的菜单导航,它们的内容是无法访问的。
以下代码/资源是我写的:
应用程序/ [包] /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()中添加了断点,并且调试工具似乎没有停在这里。也许没有从onStart()调用onCreateOptionsMenu()?
RES /菜单/ 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>
注意:Android Studio能够毫无问题地预览此xml。
RES /布局/ 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>
注意:我在此布局中创建了一个工具栏对象,之前DOES只能处理此问题,而不是工具栏。 AndroidStudio允许我预览它,它是一个空白屏幕。
AndroidManifest.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:特别是:(Theme.AppCompat.Light.DarkActionBar和Theme.AppCompat.NoActionBar)。前一主题导致白色空白屏幕,后者导致深灰色。
如果进一步诊断需要我省略的其他文件,请告诉我。我的假设是它与我正在使用的约束。
这些是我看过的那些没有帮助解决我的问题的页面:
更改MainActivity.java文件构造函数行以扩展AppCompatActivity
public class MainActivity extends AppCompatActivity {
并将android:theme设置为Theme.AppCompat *的变体,显示了我一直在努力展示的MainActivity Appbar。以下是我为找到合适的解决方案所做的更多研究。
Why this works...是AppCompatActivity和基类Activity之间的差异。 AppCompatActivity继承自Activity,并使用其中一个主题告诉应用程序使用本机ActionBar类来提供应用栏。通常,似乎使用新的Toolbar对象是最好的方法,因为它允许更多的自定义(截至2019年)。围绕此主题的大多数早期问题使用过时/弃用的代码,例如ActionBarActivity。
这可以通过将Activity的布局文件更改为包含此documentation的工具栏来实现。然后可以使用本问题范围之外的技术适当修改工具栏的主题。