2013-02-17 2 views
0

Я новичок в java и в настоящее время работаю над проектом. Я пытаюсь познакомиться с Bluetooth. Пока что я смог включить и выключить Bluetooth из приложения. Проблема в том, что экран не обновляется после того, как действие было выполнено. Например, когда я включаю bluetooth, он включается, но текст в текстовом режиме не обновляется, пока я не переверну телефон. То же самое, когда я отсоединяюсь. Вот мой кодЭкран, не обновляющийся после действия

package com.example.bluetooth; 

import android.os.Bundle; 
import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 


public class MainActivity extends Activity { 


BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter(); 
Button button; 
TextView update; 
CharSequence enabled = "Bluetooth Enabled"; 
CharSequence disabled = "Bluetooth disabled"; 
CharSequence connect = "Connect"; 
CharSequence disconnect = "Disconnect"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    setUp(); 
    action(); 
    } 

private void action() { 
    if (button.getText() == connect) { 
     button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       btAdapter.enable(); 

      } 
     }); 
    } 

    if (button.getText() == disconnect) { 
     button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       btAdapter.disable(); 

      } 
     }); 
    } 

} 

private void setUp() { 
    button = (Button) findViewById(R.id.button1); 
    update = (TextView) findViewById(R.id.textView1); 



    button = (Button) findViewById(R.id.button1); 
    if (btAdapter.isEnabled()) { 

     update.setText("Bluetooth is enabled"); 
     button.setText(disconnect); 

    } 

    else { 

     update.setText("Bluetooth is disabled"); 
     button.setText(connect); 


    } 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

} 

Любая помощь вообще будет оценена по достоинству. Спасибо.

ответ

1

Две вещи я вижу не так:

  1. Вы вызываете метод, отвечающий за обновление TextView (setIp()) только один раз, так как onCreate() вызывается только один раз в создании активность. Начиная с поворота adapter on/off, is done outside the UI Thread, вам нужно будет сделать BroadcastReceiver и послушать BluetoothAdapter.ACTION_STATE_CHANGED, а затем обновить соответствующим образом.
  2. Вы сравниваете CharSequences с ==. Вместо этого вы должны использовать строки, а затем использовать .equals(), поскольку это обеспечит глубокое сравнение. Единственное, что вам нужно изменить, - это объявление типа .toString() после getText(). Например button.getText().toString()

Редактировать: Простое (но беспорядочное) решение может динамически создавать приемник и регистрировать его. Теперь имейте в виду, что вам нужно только позвонить setUp(), как и раньше. Что-то вроде приведенного ниже кода может работать.

public class MainActivity extends Activity { 


    BluetoothAdapter btAdapter; 
    Button button; 
    TextView update; 
    String enabled = "Bluetooth Enabled"; 
    String disabled = "Bluetooth disabled"; 
    String connect = "Connect"; 
    String disconnect = "Disconnect"; 
    BroadcastReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    btAdapter = BluetoothAdapter.getDefaultAdapter(); 
    setUp(); 
    action(); 
    } 

    @Override 
    public void onPause() 
    { 
    try{ 
     unregisterReceiver (receiver); 
    } 
    catch (NullPointerException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IllegalStateException ie) 
    { 
     ie.printStackTrace(); 
    } 
    super.onPause(); 
    } 

    private void action() { 
    button.setOnClickListener(new View.OnClickListener(){ 

    @Override 
    public void onClick(View v) { 
     if (btAdapter.isEnabled()) 
      btAdapter.disable(); 
     else 
      btAdapter.enable(); 

    } 

    }); 

} 

    private void setButtonText() 
    { 
    if (btAdapter.isEnabled()) {  
     update.setText("Bluetooth is enabled"); 
     button.setText(disconnect); 
    } 

    else { 

     update.setText("Bluetooth is disabled"); 
     button.setText(connect); 
    } 
    } 
    private void setUp() { 
    button = (Button) findViewById(R.id.button1); 
    update = (TextView) findViewById(R.id.textView1); 
    setButtonText(); 

    receiver = new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context context, Intent intent) { 
     setButtonText(); 

     } 

    }; 

    IntentFilter filter = new IntentFilter (BluetoothAdapter.ACTION_STATE_CHANGED); 
    registerReceiver (receiver, filter); 

    } 
} 
+0

спасибо. Я попробовал снова называть 'setup()' в каждом из onclicklisteners, но он все равно не работает. Я также изменил значение с '==' на '.equals()' –

+0

@hauwamusa Включение отключения - это асинхронный вызов, поэтому вам нужно будет сделать широковещательный приемник. Я попробую сделать образец кода в ближайшее время. –

+0

Хорошо, спасибо большое. Я буду смотреть на ваш образец. –

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