从一个从宣言调用的类改变TextView的值

时间:2018-02-14 22:23:07

标签: java android

每当设备从USB /电源拔下或插上时,我都会从宣言中调用一个类。

我正在尝试更改TextView的值,向用户显示设备连接的状态。

这应该是一件非常容易和简单的事情,但遗憾的是,即使经过数小时的搜索,我也无法找到答案。

以下是我的代码:(注释部分不起作用)

public class PowerConnectionReceiver extends BroadcastReceiver{
    @Override

public void onReceive(Context context, Intent intent) {


        String action = intent.getAction();

        if(action.equals(Intent.ACTION_POWER_CONNECTED))
        {
            //TextView txtStatus = (TextView) ((Activity)context).findViewById(R.id.txtStatus);
            //txtStatus.setText("Connected");

        }
        else if(action.equals(Intent.ACTION_POWER_DISCONNECTED))
        {
            //TextView txtStatus = (TextView) ((Activity)context).findViewById(R.id.txtStatus);
           // txtStatus.setText("Disconnected");

        }

    }
}

1 个答案:

答案 0 :(得分:0)

从动态注册的广播接收器(即不在清单中)更新UI相对容易,但是从清单中注册的广播接收器更新它是tricker,因为实例是静态的。

理论上你可以使它可观察并添加观察者,或者添加一个静态的可观察对象并听取它,但我不太习惯在我自己的代码中这样做,特别是因为不能保证清单接收器存在直到收到第一个广播。最安全的方法可能是在您的活动中添加另一个广播接收器,然后将PowerConnectionReceiver的广播发送到您活动中的广播。在我的例子中,我使用的是本地广播接收器(开销较小)。所以你的PowerConnectionReceiver看起来像这样:

public class PowerConnectionReceiver extends BroadcastReceiver {

    public static final String ACTION_STATUS_CHANGE = "STATUS_CHANGE";
    public static final String EXTRA_STATUS = "POWER_STATUS";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        String status = null;
        if(action.equals(Intent.ACTION_POWER_CONNECTED)){
            status = "Connected";
        }
        else if(action.equals(Intent.ACTION_POWER_DISCONNECTED)){
           status = "Disconnected";
        }

        if (status == null){
            return;
        }

        Intent intent = new Intent(ACTION_STATUS_CHANGE);
        // You can also include some extra data.
        intent.putExtra(EXTRA_STATUS, status);
        LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
    }
}

你的活动看起来像这样:

public class MyActivity extends AppCompatActivity {

    private txtStatusView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myLayoutWithTextView);
        txtStatusView = findViewById(R.id.txtStatus);

        LocalBroadcastManager.getInstance(this).registerReceiver(
            statusReceiver, new IntentFilter(PowerConnectionReceiver.ACTION_STATUS_CHANGE)
        );
    }

    @Override
    protected void onDestroy() {
      LocalBroadcastManager.getInstance(this).unregisterReceiver(statusReceiver);
      super.onDestroy();
    }

    private BroadcastReceiver statusReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
        String status = intent.getStringExtra(PowerConnectionReceiver.EXTRA_STATUS);
        txtStatusView.setText(status);
      }
    };
}