2016-09-16 2 views
0

Я создал приложение, в котором при включении Bluetooth отображается тост и начинается новое действие. Это мой широковещательный приемный класс:Запустить действие в приемнике BroadCast, вызвав приложе ние приложения

public class BroadCast extends BroadcastReceiver { 

    String prefs="myPrefs"; 
    String count="myCount"; 
    static int counter=0; 
    Intent i; 

    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     String bluth = arg1.getAction(); 
     if (bluth.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { 
      if(arg1.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_ON){ 
       SharedPreferences sp = arg0.getSharedPreferences(prefs, Context.MODE_PRIVATE); 
       Editor ed = sp.edit(); 
       ed.putInt(count, counter); 
       ed.commit(); 
       counter++; 
       Toast.makeText(arg0, "Bluetooth on " + sp.getInt(count, 0), Toast.LENGTH_LONG).show(); 
       i = new Intent(arg0, Indicators.class); 
       i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       arg0.startActivity(i); 
       Indicators.on.setVisibility(View.VISIBLE); 
      } else if (arg1.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_OFF) { 

      } else if (arg1.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_TURNING_OFF) { 

      } else if (arg1.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) == BluetoothAdapter.STATE_TURNING_ON) { 

      } 
     } 
    } 
} 

Теперь нет проблем. Активность начинается, но в приведенном выше коде, когда я положил

Indicators.on.setVisibility(View.VISIBLE); 

И запустить приложение, оно падает!

На самом деле on является textview obj, который я определил в Indicators class следующим образом:

public class Indicators extends Activity { 
    static TextView on, off, opening, closing; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.textviewbluetooth); 

     opening = (TextView)findViewById(R.id.textView1); 
     on = (TextView)findViewById(R.id.textView2); 
     closing = (TextView)findViewById(R.id.textView3); 
     off = (TextView)findViewById(R.id.textView4); 
     opening.setVisibility(View.INVISIBLE); 
     on.setVisibility(View.INVISIBLE); 
     off.setVisibility(View.INVISIBLE); 
     closing.setVisibility(View.INVISIBLE); 
    } 
} 

Как мне удалить эту ошибку?

+0

, пожалуйста, разместите свою ошибку stacktrace в своем сообщении. – Opiatefuchs

ответ

0
class YourActivity extends xxxx { 
    private static YourActivity mInst; 

    public static YOurActivity instance() { 
      return mInst; 
    } 

    /// Do your task here. 
    public void setViewText(xxxx) ; 

    @Override 
    public void onStart() { 
    ... 
    mInst = this; 
    } 

    @Override 
    public void onStop() { 
    ... 
    mInst = null; 
    } 
} 

И в вашем BroadcastReceiver:

YOurActivity inst = YOurActivity.instance(); 
    if(inst != null) { // your activity can be seen, and you can update it's context 
     inst.setViewText... 
    } 
+0

Не могли бы вы рассказать, что такое ошибка в моем коде? –

+0

Я использовал 'Indicators.on.setVisibility (View.VISIBLE);' для доступа к 'textview' из другого класса! –

+0

Скорее всего, ваш метод onCreate еще не назвал эту строку: on = (TextView) findViewById (R.id.textView2); и, следовательно, этот TextView имеет значение NULL. Проверьте мой ответ ниже. – Lev

0

Поместите эту строку

   on.setVisibility(View.VISIBLE); 

Внутри деятельности -> OnCreate() метод.

Не используйте статические ссылки на члены класса Activity, такие как TextViews вне самой активности, поскольку они, возможно, были уничтожены или еще не созданы. Это плохая практика в целом.

Редактировать: добавьте дополнительную информацию о намерении стартера, если вам нужен флаг для показа индикатора.

+0

Но я хочу, чтобы всякий раз, когда широковещательная передача системы происходит из «BluetoothAdapter.state_off», тогда должно появляться только «on.setVisibility (View.VISIBLE)» –

+0

, если я поставлю 'on.setVisibility (View.VISIBLE) 'in' onCreate() ', тогда он всегда будет виден, и я не хочу. Я хочу, чтобы он был видимым только тогда, когда эта конкретная передача произошла! –

+0

Вы можете использовать BroadcastReceiver в своей деятельности и запускать трансляцию, чтобы Activity могла установить видимость TextView. Кроме того, есть lib с открытым исходным кодом, который делает это, а код намного проще, чем BroadcastReceivers. https://github.com/greenrobot/EventBus – Lev

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