Android开发:如何将菜单栏迁移至蓝牙设备扫描Activity?
问题描述
开发带蓝牙功能的Android应用,蓝牙设备搜索功能正常,但DeviceScanActivity无法显示菜单栏,主Activity的菜单栏显示正常。
关键问题分析
- Activity继承类不兼容:
DeviceScanActivity继承的ListActivity是Android旧框架类,对AppCompat的Toolbar/菜单系统支持不佳,而主Activity使用的AppCompatActivity是专为兼容现代UI组件设计的。 - 主题配置冲突:Manifest中
DeviceScanActivity设置了@style/Theme.NewWalk.NoActionBar主题,直接隐藏了ActionBar,且未手动配置Toolbar替代。 - 缺少Toolbar初始化逻辑:
DeviceScanActivity的onCreate方法中没有设置Toolbar并关联为SupportActionBar的代码,导致没有载体显示菜单。
解决方案
1. 修改Activity继承关系
将DeviceScanActivity改为继承AppCompatActivity,适配现代UI组件:
public class DeviceScanActivity extends AppCompatActivity { private LeDeviceListAdapter mLeDeviceListAdapter; private BluetoothAdapter mBluetoothAdapter; private boolean mScanning; private Handler mHandler; private ListView mListView; // 手动添加ListView引用 private static final int REQUEST_ENABLE_BT = 1; private static final long SCAN_PERIOD = 30000; // 原有方法逻辑保留,后续调整 }
2. 配置布局与Toolbar
创建或修改DeviceScanActivity的布局文件(如activity_device_scan.xml),添加Toolbar:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" /> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
在onCreate方法中初始化Toolbar并关联:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_device_scan); // 初始化Toolbar并设置为SupportActionBar Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // 配置标题与返回按钮(可选) if (getSupportActionBar() != null) { getSupportActionBar().setTitle(R.string.title_devices); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } mHandler = new Handler(); mListView = findViewById(android.R.id.list); // BLE支持检查 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show(); finish(); } // 初始化列表适配器 mLeDeviceListAdapter = new LeDeviceListAdapter(); mListView.setAdapter(mLeDeviceListAdapter); // 原有蓝牙扫描逻辑保留 }
3. 调整Manifest主题配置
可以保持NoActionBar主题(因为我们手动设置了Toolbar),或改为正常主题,两种方式都能正常显示菜单:
<activity android:name=".DeviceScanActivity" android:label="@string/app_name" android:theme="@style/Theme.NewWalk.NoActionBar" android:exported="false" />
4. 优化菜单处理逻辑
调整菜单相关方法,适配AppCompatActivity:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_for_scan, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_scan) { mLeDeviceListAdapter.clear(); scanLeDevice(true); return true; } else if (id == R.id.action_stop) { scanLeDevice(false); return true; } else if (id == android.R.id.home) { finish(); // 处理返回按钮点击 return true; } return super.onOptionsItemSelected(item); }
内容的提问来源于stack exchange,提问作者user19887561
相关产品推荐
相关产品推荐

