2016-07-07 2 views
0

Я получаю ArrayAdapter requires the resource ID to be a TextView при запуске приложения на реальном устройстве.(ArrayAdapter требует, чтобы идентификатор ресурса был TextView), но я использую ListView

Я использую только ArrayAdapter относительно ListView, не имеющего TextView вообще в моем дизайне. Не могли бы вы взглянуть на мою .java и logcat и посмотреть, сможете ли вы выявить проблему? Позвольте мне знать, если вам нужно что-нибудь еще. Спасибо! Выход

MainActivity.java

package com.example.mihaianca.btcar; 

//imports 
import android.Manifest; 
import android.bluetooth.BluetoothManager; 
import android.support.v4.app.ActivityCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 

import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListAdapter; 
import android.widget.TextView; 
import android.widget.ListView; 
import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothAdapter.LeScanCallback; 
import android.bluetooth.BluetoothServerSocket; 
import android.bluetooth.BluetoothSocket; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.widget.Toast; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.UUID; 
import android.os.Handler; 
import android.util.Log; 
import java.util.Set; 
import android.widget.AdapterView; 

public class MainActivity extends AppCompatActivity { 
    //variables-not using all of them but some are required in many examples for finding the MAC address 
    Handler bluetoothIn; 
    final int handlerState = 0; 
    private BluetoothAdapter BA; 
    Context context = this; 
    private BluetoothManager BM; 
    private BluetoothSocket btSocket = null; 
    private ConnectedThread mConnectedThread; 
    private static final UUID BTMODULEUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    //list for addresses 
    private static final String TAG = "DeviceListActivity"; 
    public static String EXTRA_DEVICE_ADDRESS = "device_address"; 
    private ArrayAdapter<String> mNewDevicesArrayAdapter; 
    private ArrayAdapter<String> pairedDevicesArrayAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { //here I define my buttons 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     setResult(Activity.RESULT_CANCELED); 

     final Button upb = (Button) findViewById(R.id.up); 
     upb.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       mConnectedThread.write("1"); 
      } 
     }); 
     final Button downb = (Button) findViewById(R.id.down); 
     downb.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       mConnectedThread.write("2"); 
      } 
     }); 
     final Button rightb = (Button) findViewById(R.id.right); 
     rightb.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       mConnectedThread.write("3"); 
      } 
     }); 
     final Button leftb = (Button) findViewById(R.id.left); 
     leftb.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       mConnectedThread.write("4"); 
      } 
     }); 
     final Button connectb = (Button) findViewById(R.id.connect); 
     connectb.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       checkBTState(); 
       doDiscovery(); 
       v.setVisibility(View.GONE); 
      } 
     }); 


     pairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.activity_main); 
     mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.activity_main); 

     ListView pairedListView = (ListView) findViewById(R.id.paired_devices); 
     pairedListView.setAdapter(pairedDevicesArrayAdapter); 
     pairedListView.setOnItemClickListener(mDeviceClickListener); 

     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 
     BM = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE); 
     BA = BM.getAdapter(); 
     checkBTState(); 
     if(BA!= null) { 
      // Get a set of currently paired devices 
      Set<BluetoothDevice> pairedDevices = BA.getBondedDevices(); 

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

      if(EXTRA_DEVICE_ADDRESS != "device_address") { 
       BluetoothDevice device = BA.getRemoteDevice(EXTRA_DEVICE_ADDRESS); 

       try { 
        btSocket = createBluetoothSocket(device); 
       } catch (IOException e) { 
        Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_LONG).show(); 
       } 
       // Establish the Bluetooth socket connection. 
       try { 
        btSocket.connect(); 
       } catch (IOException e) { 
        try { 
         if(btSocket!=null) 
         btSocket.close(); 
        } catch (IOException e2) { 
         //insert code to deal with this 
        } 
       } 
       mConnectedThread = new ConnectedThread(btSocket); 
       mConnectedThread.start(); 
      } 

     } 
    } 

    private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException { //something I have seen in one example I tried to copy 

     return device.createRfcommSocketToServiceRecord(BTMODULEUUID); 
     //creates secure outgoing connecetion with BT device using UUID 
    } 

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

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

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

    @Override 
    public void onPause() { 
     super.onPause(); 
     try { 
      if(btSocket!=null) 
      //Don't leave Bluetooth sockets open when leaving activity 
      btSocket.close(); 
     } catch (IOException e2) { 
      //insert code to deal with this 
     } 
    } 

    private class ConnectedThread extends Thread { 
     private final InputStream mmInStream; 
     private final OutputStream mmOutStream; 

     //creation of the connect thread 
     public ConnectedThread(BluetoothSocket socket) { 
      InputStream tmpIn = null; 
      OutputStream tmpOut = null; 

      try { 
       //Create I/O streams for connection 
       tmpIn = socket.getInputStream(); 
       tmpOut = socket.getOutputStream(); 
      } catch (IOException e) { 
      } 

      mmInStream = tmpIn; 
      mmOutStream = tmpOut; 
     } 

     public void run() { 
      byte[] buffer = new byte[256]; 
      int bytes; 

      // Keep looping to listen for received messages 
      while (true) { 
       try { 
        bytes = mmInStream.read(buffer);   //read bytes from input buffer 
        String readMessage = new String(buffer, 0, bytes); 
        // Send the obtained bytes to the UI Activity via handler 
        bluetoothIn.obtainMessage(handlerState, bytes, -1, readMessage).sendToTarget(); 
       } catch (IOException e) { 
        break; 
       } 
      } 
     } 

     //write method 
     public void write(String input) { 
      byte[] msgBuffer = input.getBytes();   //converts entered String into bytes 
      try { 
       mmOutStream.write(msgBuffer);    //write bytes over BT connection via outstream 
      } catch (IOException e) { 
       //if you cannot write, close the application 
       Toast.makeText(getBaseContext(), "Connection Failure", Toast.LENGTH_LONG).show(); 
       finish(); 
      } 
     } 
    } 

    private void doDiscovery() { 
     Log.d(TAG, "doDiscovery()"); 

     // Indicate scanning in the title 
     setProgressBarIndeterminateVisibility(true); 

     // If we're already discovering, stop it 
     if(BA!=null) 
      if (BA.isDiscovering()) { 
       BA.cancelDiscovery(); 
      } 

     // Request discover from BluetoothAdapter 
     BA.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 
      BA.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); 

      // Set result and finish this Activity 
      setResult(Activity.RESULT_OK, intent); 
      finish(); 
     } 
    }; 

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      // When discovery finds a device 
      if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       // Get the BluetoothDevice object from the Intent 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       // If it's already paired, skip it, because it's been listed already 
       if (device.getBondState() != BluetoothDevice.BOND_BONDED) { 
        mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
       } 
       // When discovery is finished, change the Activity title 
      } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
       setProgressBarIndeterminateVisibility(false); 
       setTitle(R.string.select_device); 
       if (mNewDevicesArrayAdapter.getCount() == 0) { 
        String noDevices = getResources().getText(R.string.none_found).toString(); 
        mNewDevicesArrayAdapter.add(noDevices); 
       } 
      } 
     } 
    }; 

    private void checkBTState() { 
     // Check device has Bluetooth and that it is turned on 
     BA=BM.getAdapter(); 
     if(BA==null) { 
      Toast.makeText(getBaseContext(), "Device does not support Bluetooth", Toast.LENGTH_SHORT).show(); 
     } else { 
      if (BA.isEnabled()) { 
       Log.d(TAG, "...Bluetooth ON..."); 
      } else { 
       //Prompt user to turn on Bluetooth 
       Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
       startActivityForResult(enableBtIntent, 1); 
      } 
     } 
    } 

} 

Logcat:

FATAL EXCEPTION: main 
                     Process: com.example.mihaianca.btcar, PID: 9961 
                     java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView 
                      at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:393) 
                      at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369) 
                      at android.widget.AbsListView.obtainView(AbsListView.java:2346) 
                      at android.widget.ListView.makeAndAddView(ListView.java:1876) 
                      at android.widget.ListView.fillDown(ListView.java:702) 
                      at android.widget.ListView.fillFromTop(ListView.java:763) 
                      at android.widget.ListView.layoutChildren(ListView.java:1671) 
                      at android.widget.AbsListView.onLayout(AbsListView.java:2148) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:435) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1735) 
                      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1579) 
                      at android.widget.LinearLayout.onLayout(LinearLayout.java:1488) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
                      at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2179) 
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1939) 
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115) 
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6023) 
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
                      at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                      at android.view.Choreographer.doFrame(Choreographer.java:606) 
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5422) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                     Caused by: java.lang.ClassCastException: android.widget.FrameLayout cannot be cast to android.widget.TextView 
                      at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386) 
                      at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369) 
                      at android.widget.AbsListView.obtainView(AbsListView.java:2346) 
                      at android.widget.ListView.makeAndAddView(ListView.java:1876) 
                      at android.widget.ListView.fillDown(ListView.java:702) 
                      at android.widget.ListView.fillFromTop(ListView.java:763) 
                      at android.widget.ListView.layoutChildren(ListView.java:1671) 
                      at android.widget.AbsListView.onLayout(AbsListView.java:2148) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:435) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1735) 
                      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1579) 
                      at android.widget.LinearLayout.onLayout(LinearLayout.java:1488) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
                      at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
                      at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678) 
                      at android.view.View.layout(View.java:16636) 
                      at android.view.ViewGroup.layout(ViewGroup.java:5437) 
                      at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2179) 
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1939) 
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115) 
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6023) 
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
                      at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                      at android.view.Choreographer.doFrame(Choreographer.java:606) 
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5422) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

Возможный дубликат [ "ArrayAdapter требует идентификатор ресурса, чтобы быть TextView" проблемы XML] (http://stackoverflow.com/questions/9280965/arrayadapter-requires-the-resource-id-to-be-a-textview-xml-problems) –

ответ

0

ArrayAdapter Конструкторы второго параметра Я ожидает идентификатор ресурса файла макета, содержащего TextView использовать при инстанцировании взглядов. Вы можете использовать предопределенный макет как

yourAdapterObject = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); 
0

Заменить ваши строки ниже

pairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.activity_main); 
mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.activity_main); 

с

pairedDevicesArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,android.R.id.text1,YOURPAIREDDEVICESARRAYLIST); 
mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,android.R.id.text1,YOURDEVICESARRAYLIST); 
+0

Что делает «android.R.layout.simple_list_item_1» и «android. R.id.text1 "стоят? Должен ли я заменить его на «R.layout.activity_main» и «pairedListView»? –

Смежные вопросы