主要问题:
如果布局布局文件里 没有 ActionBar 或者 Toolbar,即使添加了菜单,也不会显示出来。
<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- 添加 Toolbar -->
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 设置 Toolbar 为 ActionBar
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.phone, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_about:
Toast.makeText(MainActivity.this, "点击了菜单1", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
在 Android 开发中,ActionBar 和 Toolbar 都可用于实现应用的顶部导航栏,但它们存在一些区别,下面从多个方面为你详细介绍:
-
引入时间与发展 ActionBar:ActionBar 是在 Android 3.0(API 级别 11)引入的,它是 Android 系统自带的导航栏组件,在早期的 Android 应用中广泛使用。不过随着 Android 系统的发展,其功能和灵活性逐渐无法满足复杂的设计需求。 Toolbar:Toolbar 是在 Android 5.0(API 级别 21)引入的,作为 ActionBar 的替代方案,它提供了更强大的功能和更高的灵活性,同时也具有更好的兼容性,可支持到 Android 2.1(API 级别 7)。
-
功能灵活性 ActionBar:ActionBar 的功能相对固定,定制性较差。它主要用于显示应用的标题、图标、菜单和导航按钮等基本元素,对于一些复杂的布局和交互效果支持不足。 Toolbar:Toolbar 的功能更加灵活,可根据需求自由定制。它可以放置在布局的任何位置,不仅能包含 ActionBar 的所有功能,还能添加自定义的视图和交互逻辑,如添加自定义按钮、文本输入框等。
-
布局使用 ActionBar:ActionBar 通常是系统自动添加到应用的顶部,开发者难以对其进行布局上的调整。若要修改 ActionBar 的样式,往往需要通过主题和样式来实现。 Toolbar:Toolbar 是一个普通的视图组件,可像其他视图一样在布局文件中自由定义其位置和大小。开发者可以将 Toolbar 放置在布局的任意位置,并且可以方便地与其他视图进行组合。
-
兼容性 ActionBar:ActionBar 是系统自带的组件,在不同版本的 Android 系统上可能会有不同的显示效果。对于低版本的 Android 系统,可能需要使用 AppCompat 库来实现兼容。 Toolbar:Toolbar 是 AppCompat 库的一部分,可通过 androidx.appcompat.widget.Toolbar 来使用,具有良好的兼容性,能在不同版本的 Android 系统上保持一致的显示效果。 示例代码对比 使用 ActionBar
// 在 Activity 的 onCreate 方法中设置 ActionBar 的标题
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().setTitle("ActionBar Title");
}
使用 Toolbar
<!-- activity_main.xml 布局文件 -->
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
// 在 Activity 的 onCreate 方法中设置 Toolbar
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("Toolbar Title");
}
综上所述,Toolbar 相较于 ActionBar 具有更高的灵活性和更好的兼容性,在现代 Android 开发中,推荐使用 Toolbar 来实现应用的导航栏。