You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何将菜单栏迁移至蓝牙设备扫描Activity?

问题描述

开发带蓝牙功能的Android应用,蓝牙设备搜索功能正常,但DeviceScanActivity无法显示菜单栏,主Activity的菜单栏显示正常。

关键问题分析

  1. Activity继承类不兼容:DeviceScanActivity继承的ListActivity是Android旧框架类,对AppCompat的Toolbar/菜单系统支持不佳,而主Activity使用的AppCompatActivity是专为兼容现代UI组件设计的。
  2. 主题配置冲突:Manifest中DeviceScanActivity设置了@style/Theme.NewWalk.NoActionBar主题,直接隐藏了ActionBar,且未手动配置Toolbar替代。
  3. 缺少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:55:19