2016-02-18 22 views
0

我想獲得在自定義textview中工作的BroadcastReceiver。我用這個代碼,但沒有收到任何東西。然而,setText(「準備好接收」)工作正常。如何在自定義TextView中註冊broadcastreceiver

public class ArefinBatteryTextView extends TextView { 
    private BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      setText("received"); 
     } 
    }; 

    public ArefinBatteryTextView(Context context) { 
     super(context); 

    } 

public ArefinBatteryTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setTextColor(Color.GREEN); 
    setTextSize(75); 
    setText("Ready for receiving"); 

    LocalBroadcastManager lbm =  LocalBroadcastManager.getInstance(context); 
    lbm.registerReceiver(receiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

} 

public ArefinBatteryTextView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 


} 

protected void onDraw (Canvas canvas) { 
    super.onDraw(canvas); 


} 


} 

如何正確註冊接收器以使其正常工作?

+3

「我想得到一個在自定義文本視圖中工作的BroadcastReceiver」 - 恕我直言,任何負責「TextView」的活動都應負責「BroadcastReceiver」。您可能希望考慮更多地瞭解UI架構模式(MVC,MVP,MVVM等);一個'TextView'不應該負責根據模型變化(在這種情況下是電池電量)自行更新。 – CommonsWare

+1

你必須在你的活動中註冊一個broadcastReceiver而不是視圖內。 – Opiatefuchs

回答

0

不知道爲什麼你們認爲這是不可能的,但我已經做到了。這是這樣做的。

public ArefinBatteryTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setTextColor(Color.GREEN); 
    setTextSize(75); 
    setText("Ready for receiving"); 

    context.registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      int a = intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0); 
      setText(""+a); 
     } 
    }, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

}