簡體   English   中英

如何在 BroadcastReceiver 類中使用 findViewbyId

[英]How to use findViewbyId in BroadcastReceiver class

我試圖在我的 BroadCastReceiver 類中的一個方法中使用 imageview,但它給了我錯誤“無法解析 findViewbyid”,因為我不能在 mainactivity 之外使用 findViewbyId。任何想法我如何在這個方法“onButtonSingleOrDoubleClickOrHold”中使用“findViewbyId”。我基本上需要在調用此方法時更改 imageview 的顏色。

下面是我的 BroadCastReceiver 類

 public class MyBroadcastReceiver extends FlicBroadcastReceiver {

@Override
protected void onRequestAppCredentials(Context context) {
    // Set app credentials
}

@Override
public void onButtonSingleOrDoubleClickOrHold(Context context, FlicButton button, boolean wasQueued, int timeDiff, boolean isSingleClick, boolean isDoubleClick, boolean isHold) {

    if(isSingleClick) {
       ImageView blueImage = (ImageView) findViewById(R.id.imageView);
       blueImage.setColorFilter(0xff000000);
       }

還有我的主要活動

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    try {
        FlicManager.getInstance(this, new FlicManagerInitializedCallback() {
            @Override
            public void onInitialized(FlicManager manager) {
                manager.initiateGrabButton(MainActivity.this);
            }
        });
    } catch (FlicAppNotInstalledException err) {
        Toast.makeText(this, "Flic App is not installed", Toast.LENGTH_SHORT).show();
    }
}

@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    FlicManager.getInstance(this, new FlicManagerInitializedCallback() {
    @Override
     public void onInitialized(FlicManager manager) {
         FlicButton button = manager.completeGrabButton(requestCode, resultCode, data);
                if (button != null) {
                    button.registerListenForBroadcast(FlicBroadcastReceiverFlags.CLICK_OR_DOUBLE_CLICK_OR_HOLD);
                    Toast.makeText(MainActivity.this, "Grabbed a button", Toast.LENGTH_SHORT).show();

                } else {
                    Toast.makeText(MainActivity.this, "Did not grab any button", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

您可以嘗試在onButtonSingleOrDoubleClickOrHold手動將上下文轉換為 Activity :

if(context == null || !(context instanceof MainActivity))
    return;

AppCompatActivity yourActivity = (AppCompatActivity) context;
ImageView blueImage = (ImageView) yourActivity.findViewById(R.id.imageView);

您可以在MyBroadcastReceiver添加對ImageViewActivityMyBroadcastReceiver 您可以在實例化MyBroadcastReceiver時將其設置為將您需要的MyBroadcastReceiver傳遞給構造函數,因此當您需要對已將其放入MyBroadcastReceiver

您可以決定是傳遞一個Activity然后膨脹您的ImageView還是直接傳遞您的ImageView

另一種方法是將MyBroadcastReceiver聲明為活動的內部類或匿名類,以便您可以直接訪問主要活動的變量

您可以決定在 MainActivity 中創建一個靜態Activity對象,並從BroadcastReceiver調用它。 這不是一個好的做法,因為它可能會導致內存泄漏。 但是,如果您真的想將方法保留在 BroadcastReceiver 中:

public class MainActivity extends AppCompatActivity {

   public static MainActivity instance = null;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       this.instance = this;
   }
}

然后調用:

ImageView blueImage = (ImageView) MainActivity.instance.findViewById(R.id.imageView);

我建議你重新考慮你的代碼設計,也許將改變顏色的函數移動到你的活動中,並從 BroadcastReceiver 調用該方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM