首页 文章

getActionBar() . setTitle null reference

提问于
浏览
0

出现以下错误:

java.lang.RuntimeException:无法启动活动ComponentInfo {ee490g.epfl.ch.dwarfsleepy / ee490g.epfl.ch.dwarfsleepy.PolarBelt.DeviceScanActivity}:java.lang.NullPointerException:尝试调用虚方法'void android.app空对象引用上的.ActionBar.setDisplayHomeAsUpEnabled(boolean)'

package ee490g.epfl.ch.dwarfsleepy.PolarBelt; 
import android.app.Activity; 
import android.app.ListActivity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothManager; 
import android.content.Context;
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast;
import java.util.ArrayList;
import ee490g.epfl.ch.dwarfsleepy.R;

 /**  * Activity for scanning and displaying available Bluetooth LE
 devices.  */


 public class DeviceScanActivity extends ListActivity {
 private LeDeviceListAdapter mLeDeviceListAdapter;
 private BluetoothAdapter mBluetoothAdapter;
 private boolean mScanning;
 private Handler mHandler;

 private static final int REQUEST_ENABLE_BT = 1;
 // Stops scanning after 10 seconds.
 private static final long SCAN_PERIOD = 10000;

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     getActionBar().setTitle(R.string.title_devices);
     mHandler = new Handler();

     // Use this check to determine whether BLE is supported on the device.  Then you can
     // selectively disable BLE-related features.
     if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE))
     {
         Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
         finish();
     }

     // Initializes a Bluetooth adapter.  For API level 18 and above, get a reference to
     // BluetoothAdapter through BluetoothManager.
     final BluetoothManager bluetoothManager =
             (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
     mBluetoothAdapter = bluetoothManager.getAdapter();

     // Checks if Bluetooth is supported on the device.
     if (mBluetoothAdapter == null) {
         Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();
         finish();
         return;
     }
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
     getMenuInflater().inflate(R.menu.main, menu);
     if (!mScanning) {
         menu.findItem(R.id.menu_stop).setVisible(false);
         menu.findItem(R.id.menu_scan).setVisible(true);
         menu.findItem(R.id.menu_refresh).setActionView(null);
     } else {
         menu.findItem(R.id.menu_stop).setVisible(true);
         menu.findItem(R.id.menu_scan).setVisible(false);
         menu.findItem(R.id.menu_refresh).setActionView(R.layout.actionbar_indeterminate_progress);
     }
     return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
     switch (item.getItemId()) {
         case R.id.menu_scan:
             mLeDeviceListAdapter.clear();
             scanLeDevice(true);
             break;
         case R.id.menu_stop:
             scanLeDevice(false);
             break;
     }
     return true;
 }

 @Override
 protected void onResume() {
     super.onResume();

     // Ensures Bluetooth is enabled on the device.  If Bluetooth is not currently enabled,
     // fire an intent to display a dialog asking the user to grant permission to enable it.
     if (!mBluetoothAdapter.isEnabled()) {
         if (!mBluetoothAdapter.isEnabled()) {
             Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
             startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
         }
    }

     // Initializes list view adapter.
     mLeDeviceListAdapter = new LeDeviceListAdapter();
     setListAdapter(mLeDeviceListAdapter);
     scanLeDevice(true);
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     // User chose not to enable Bluetooth.
     if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) {
         finish();
         return;
     }
    super.onActivityResult(requestCode, resultCode, data);
 }

 @Override
 protected void onPause() {
     super.onPause();
     scanLeDevice(false);
     mLeDeviceListAdapter.clear();
 }

 @Override
 protected void onListItemClick(ListView l, View v, int position, long id) {
     final BluetoothDevice device = mLeDeviceListAdapter.getDevice(position);
     if (device == null) return;
     final Intent intent = new Intent(this, DeviceControlActivity.class);
     intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_NAME, device.getName());
     intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_ADDRESS, device.getAddress());
     if (mScanning) {
         mBluetoothAdapter.stopLeScan(mLeScanCallback);
         mScanning = false;
     }
     startActivity(intent);
 }

private void scanLeDevice(final boolean enable) {
     if (enable) {
         // Stops scanning after a pre-defined scan period.
         mHandler.postDelayed(new Runnable() {
             @Override
             public void run() {
                 mScanning = false;
                mBluetoothAdapter.stopLeScan(mLeScanCallback);
                 invalidateOptionsMenu();
             }
         }, SCAN_PERIOD);

         mScanning = true;
         mBluetoothAdapter.startLeScan(mLeScanCallback);
     } else {
         mScanning = false;
         mBluetoothAdapter.stopLeScan(mLeScanCallback);
     }
     invalidateOptionsMenu();
 }

 // Adapter for holding devices found through scanning.
 private class LeDeviceListAdapter extends BaseAdapter {
     private ArrayList<BluetoothDevice> mLeDevices;
     private LayoutInflater mInflator;

     public LeDeviceListAdapter() {
         super();
         mLeDevices = new ArrayList<BluetoothDevice>();
         mInflator = DeviceScanActivity.this.getLayoutInflater();
     }

     public void addDevice(BluetoothDevice device) {
         if(!mLeDevices.contains(device)) {
             mLeDevices.add(device);
         }
     }

     public BluetoothDevice getDevice(int position) {
         return mLeDevices.get(position);
     }

     public void clear() {
         mLeDevices.clear();
     }

     @Override
     public int getCount() {
         return mLeDevices.size();
     }

     @Override
     public Object getItem(int i) {
         return mLeDevices.get(i);
     }

     @Override
     public long getItemId(int i) {
         return i;
     }

     @Override
     public View getView(int i, View view, ViewGroup viewGroup) {
         ViewHolder viewHolder;
         // General ListView optimization code.
         if (view == null) {
             view = mInflator.inflate(R.layout.listitem_device, null);
             viewHolder = new ViewHolder();
             viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);
             viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name);
             view.setTag(viewHolder);
         } else {
             viewHolder = (ViewHolder) view.getTag();
         }

         BluetoothDevice device = mLeDevices.get(i);
         final String deviceName = device.getName();
         if (deviceName != null && deviceName.length() > 0)
             viewHolder.deviceName.setText(deviceName);
         else
             viewHolder.deviceName.setText(R.string.unknown_device);
         viewHolder.deviceAddress.setText(device.getAddress());

         return view;
     }
 }

 // Device scan callback.
 private BluetoothAdapter.LeScanCallback mLeScanCallback =
         new BluetoothAdapter.LeScanCallback() {

     @Override
     public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
                 mLeDeviceListAdapter.addDevice(device);
                 mLeDeviceListAdapter.notifyDataSetChanged();
             }
         });
     }
 };

 static class ViewHolder {
     TextView deviceName;
     TextView deviceAddress;
 } }

1 回答

  • 0

    如果您在应用中使用主题 . 你应该在 res/values/styles 文件夹中检查它们

    // when you set like this , it will not show for us 
    @android:style/Theme.NoTitleBar
    // or like this 
    <item name="windowActionBar">false</item> 
    <item name="android:windowNoTitle">true</item>
    

    所以你应该检查它 . 你可以像这样使用 .

    1,引进

    android.support.v7.app.ActionBar
    

    2.使用主题

    <style name="AppTheme" parent="@android:style/Theme.Holo.Light">
    

    3.使用 getSupportActionBar

    Edit

    你错过了 setContentView . 所以你可以这样使用 .

    setContentView(R.layout.activity_device_scan);
    ActionBar actionBar = getActionBar();
    actionBar.setTitle(R.string.title_devices);
    

相关问题