2015-10-18 186 views
0
public class DeviceListActivity extends Activity { 
private static final String TAG = "DeviceListActivity"; 
private static final boolean D = true; 

// Return Intent extra 
public static String EXTRA_DEVICE_ADDRESS = "device_address"; 


// Member fields 
private BluetoothAdapter mBtAdapter; 
private ArrayAdapter<String> mPairedDevicesArrayAdapter; 
private ArrayAdapter<String> mNewDevicesArrayAdapter; 
//private String[] deviceAddresses={"","","","","","",""}; 
private Button scanButton; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Setup the window 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    setContentView(R.layout.device_list); 

    // Set result CANCELED incase the user backs out 
    setResult(Activity.RESULT_CANCELED); 

    // Initialize the button to perform device discovery 
    scanButton = (Button) findViewById(R.id.button_scan); 

    scanButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      doDiscovery(); 

      findViewById(R.id.layoutButton).setVisibility(View.GONE); 
     } 
    }); 
    // Initialize array adapters. One for already paired devices and 
    // one for newly discovered devices 
    mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); 
    mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); 

    // Find and set up the ListView for paired devices 
    ListView pairedListView = (ListView) findViewById(R.id.paired_devices); 
    pairedListView.setAdapter(mPairedDevicesArrayAdapter); 
    pairedListView.setOnItemClickListener(mDeviceClickListener); 

    // Find and set up the ListView for newly discovered devices 
    ListView newDevicesListView = (ListView) findViewById(R.id.new_devices); 
    newDevicesListView.setAdapter(mNewDevicesArrayAdapter); 
    newDevicesListView.setOnItemClickListener(mDeviceClickListener); 

    // Register for broadcasts when a device is discovered 
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
    this.registerReceiver(mReceiver, filter); 

    // Register for broadcasts when discovery has finished 
    filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
    this.registerReceiver(mReceiver, filter); 

    // Get the local Bluetooth adapter 
    mBtAdapter = BluetoothAdapter.getDefaultAdapter(); 

    // Get a set of currently paired devices 
    Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices(); 

    // If there are paired devices, add each one to the ArrayAdapter 
    if (pairedDevices.size() > 0) { 
     findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE); 
     for (BluetoothDevice device : pairedDevices) { 
      mPairedDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
     } 
    } else { 
     String noDevices = getResources().getText(R.string.none_paired).toString(); 
     mPairedDevicesArrayAdapter.add(noDevices); 
    } 
} 

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

    // Make sure we're not doing discovery anymore 
    if (mBtAdapter != null) { 
     mBtAdapter.cancelDiscovery(); 
    } 

    // Unregister broadcast listeners 
    this.unregisterReceiver(mReceiver); 
} 

/** 
* Start device discover with the BluetoothAdapter 
*/ 
private void doDiscovery() { 
    if (D) Log.d(TAG, "doDiscovery()"); 

    // Indicate scanning in the title 
    setProgressBarIndeterminateVisibility(true); 
    setTitle(R.string.scanning); 

    // Turn on sub-title for new devices 
    findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE); 
    findViewById(R.id.layoutNewDevices).setVisibility(View.VISIBLE); 

    // If we're already discovering, stop it 
    if (mBtAdapter.isDiscovering()) { 
     mBtAdapter.cancelDiscovery(); 
    } 

    // Request discover from BluetoothAdapter 
    mBtAdapter.startDiscovery(); 
} 

// The on-click listener for all devices in the ListViews 
private AdapterView.OnItemClickListener mDeviceClickListener = new AdapterView.OnItemClickListener() { 
    public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) { 
     // Cancel discovery because it's costly and we're about to connect 
     // mBtAdapter.cancelDiscovery(); 

     // Get the device MAC address, which is the last 17 chars in the View 
     String info = ((TextView) v).getText().toString(); 
     String address = info.substring(info.length() - 17); 

     // Create the result Intent and include the MAC address 
     Intent intent = new Intent(); 
     intent.putExtra(EXTRA_DEVICE_ADDRESS, address); 

     Toast.makeText(getApplicationContext(), "Device Selected " + "-> " + address, Toast.LENGTH_SHORT).show(); 
     setResult(Activity.RESULT_OK, intent);    // Set result and finish this Activity 

     finish(); 
    } 

}; 

} 

当我执行我的应用程序,并按下一个按钮,应用程序崩溃 的错误是;那么问题是什么?我的代码有什么问题?

我觉得现在的问题是ArrayAdapter,但我不知道热修复它

你能帮助我吗? 谢谢!

java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView 
+0

如果您对您的问题使用过于笼统的标题,很多人都不会理会它的阅读。描述一下发生了什么导致更多的观众(和更少的票!) –

回答

0

这里:

mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); 
mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); 

ArrayAdapter期望布局R.layout.device_name仅为TextView(而不是例如一个TextView包裹在Linear/Relative/FrameLayout)。您可以使用此构造函数来代替:

new ArrayAdapter<String>(this, R.layout.device_name, R.id.my_textview_id) 

引述文档为ArrayAdapter

由任意对象的数组支持的具体BaseAdapter。默认情况下,这个类期望提供的资源id引用单个TextView。如果您想使用更复杂的布局,请使用也需要字段ID的构造函数。该字段ID应在较大的布局资源中引用TextView。

+0

谢谢你,这是我的第一个适配器,我不知道如何使用它 – NeosFV

+0

没问题:)。 。 –