2016-07-25 12 views
0

Ich versuche eine TextView zu ändern, um den Status einer Bluetooth-Verbindung innerhalb eines Fragments zu geben, aber es scheint nichts zu passieren, wenn msgReceived.setText(string) aufgerufen wird. Wie würde ich das machen? Hier ist meine Java-Datei für das Fragment:TextView kann nicht innerhalb eines Fragments aus derselben Aktivität geändert werden

package dleedesign.dubcommunicationstestapp; 

import android.app.Fragment; 
import android.bluetooth.BluetoothAdapter; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.support.annotation.Nullable; 
import android.view.LayoutInflater; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.TextView; 

public class SecondFragment extends Fragment implements View.OnClickListener { 

View myView; 

public final String TAG = "Main"; 
private Bluetooth bt; 
public Button sendCommand; 
public TextView msgReceived; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    myView = inflater.inflate(R.layout.second_layout, container, false); 

    sendCommand = (Button) inflater.inflate(R.layout.second_layout, container, false).findViewById(R.id.sendCommand); 
    msgReceived = (TextView) inflater.inflate(R.layout.second_layout, container, false).findViewById(R.id.msgReceived); 
    msgReceived.setText("Ready to connect"); 

    bt = new Bluetooth(new MainActivity(), mHandler); 
    connectService(); 

    return myView; 
} 

@Override 
public void onClick(View v) 
{ 
    connectService(); 
} 

public void connectService() 
{ 
    try { 
     msgReceived.setText("Connecting..."); 
     BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter(); 
     if(btAdapter.isEnabled()) 
     { 
      bt.start(); 
      bt.connectDevice("HC-06"); 
      Log.d(TAG, "Btservice started- listening"); 
      msgReceived.setText("Connected!"); 
     } 
     else 
     { 
      Log.w(TAG, "Btservice started - bluetooth is not enabled"); 
      msgReceived.setText("Bluetooth not enabled"); 
     } 
    } catch (Exception e) { 
     Log.e(TAG, "Unable to start bluetooth", e); 
     msgReceived.setText("Unable to connect: " + e); 
    } 
} 

private final Handler mHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     switch (msg.what) 
     { 
      case Bluetooth.MESSAGE_STATE_CHANGE: 
       Log.d(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1); 
       break; 
      case Bluetooth.MESSAGE_WRITE: 
       Log.d(TAG, "MESSAGE_WRITE"); 
       break; 
      case Bluetooth.MESSAGE_READ: 
       Log.d(TAG, "MESSAGE_READ"); 
       break; 
      case Bluetooth.MESSAGE_DEVICE_NAME: 
       Log.d(TAG, "MESSAGE_DEVICE_NAME " + msg); 
       break; 
      case Bluetooth.MESSAGE_TOAST: 
       Log.d(TAG, "MESSAGE_TOAST " + msg); 
       break; 
     } 
    } 
}; 

} 

EDIT: Hier ist die LogCat Nachricht, die ausspuckt, wenn ich die SecondFragment wählen:

dleedesign.dubcommunicationstestapp D/BluetoothService: Bounded device 40:EF:4C:C2:A9:32 
dleedesign.dubcommunicationstestapp D/BluetoothService: Bounded device 98:D3:31:70:80:C5 
dleedesign.dubcommunicationstestapp D/BluetoothService: start 
dleedesign.dubcommunicationstestapp D/BluetoothService: setState() 0 -> 1 
dleedesign.dubcommunicationstestapp W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback 
dleedesign.dubcommunicationstestapp D/BluetoothService: Socket Type: nullBEGIN mAcceptThreadThread[Thread-20627,5,main] 
dleedesign.dubcommunicationstestapp D/BluetoothService: connect to: 98:D3:31:70:80:C5 
dleedesign.dubcommunicationstestapp D/BluetoothService: setState() 1 -> 2 
dleedesign.dubcommunicationstestapp D/Main: Btservice started- listening 
dleedesign.dubcommunicationstestapp I/BluetoothService: BEGIN mConnectThread SocketType:null 
dleedesign.dubcommunicationstestapp W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback 
dleedesign.dubcommunicationstestapp D/Main: MESSAGE_STATE_CHANGE: 1 
dleedesign.dubcommunicationstestapp D/Main: MESSAGE_STATE_CHANGE: 2 
dleedesign.dubcommunicationstestapp E/BluetoothService: Unable to connect socket 
                         java.io.IOException: read failed, socket might closed or timeout, read ret: -1 
                          at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:517) 
                          at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:528) 
                          at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:320) 
                          at dleedesign.dubcommunicationstestapp.Bluetooth$ConnectThread.run(Bluetooth.java:408) 
dleedesign.dubcommunicationstestapp D/BluetoothService: start 
dleedesign.dubcommunicationstestapp D/BluetoothService: setState() 2 -> 1 
dleedesign.dubcommunicationstestapp D/Main: MESSAGE_TOAST { when=-15ms what=5 target=dleedesign.dubcommunicationstestapp.SecondFragment$1 } 
dleedesign.dubcommunicationstestapp D/Main: MESSAGE_STATE_CHANGE: 1 
+0

Was ist die Nachricht, die Sie sehen? Außerdem wäre ein Logcat-Snippet nützlich. IMHO sollten Sie etwas wie eine AsyncTask verwenden, um mit Bluetooth in einem anderen Thread zu spielen und Informationen über den UI-Thread anzuzeigen. –

+0

Wäre das ein effizienter Weg? –

Antwort

1

Was passiert, ist, dass Sie versuchen, jedes Mal, wenn Sie findViewById machen, eine Ansicht mit einem bestimmten Layout aufzublasen und sie dann auf ein Tex zu übertragen tView. Dies ruft findViewById auf eine andere Ansicht als Sie zurückkommen. Sie sollten zuerst das Layout aufblasen, wie Sie in der ersten Zeile hat mit

myview = inflater.inflate.... 

und dann

msgReceived = (TextView) myView.findViewById(R.id.msgReceived); 

(Gleiche mit einem anderen Textview, Knopf usw. Sie versuchen, zu verwenden)

+1

In Ordnung das macht Sinn, weil der Button nicht so gut funktioniert. Vielen Dank für die Erklärung! –

+0

Sie sind herzlich willkommen! – wanpanman

0

versuchen

msgReceived = (TextView) myView.findViewById(R.id.msgReceived); 
+0

Das hat funktioniert, vielen Dank! –

+0

Sie sind herzlich willkommen! Bitte nehmen Sie sich Zeit, um es als Antwort zu validieren und es zu verbessern, damit die Leute erkennen können, dass es das Gute ist, Prost! –

+0

Ich empfehle auch die Verwendung dieser Methode mit allen UI-Elementen –