0

當我使用此代碼:如何從Broadcast Receiver onReceive方法中訪問MainActivity的findViewById?

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

    seconds += 0.1; 

    if (seconds > 59.9) { 
     seconds=0; 
     minutes++; 
    } 

    TextView tv = (TextView)((MainActivity)context).findViewById(R.id.txtChron); 
    tv.setText (String.valueOf(minutes) + ":" + String.valueOf(seconds)); 
} 

嘗試投放的背景下MainActivity時,我得到一個錯誤。

以下是錯誤/堆棧跟蹤:

E/AndroidRuntime:致命異常:主要過程: com.example.jordanbleu.lab8chronservjordanbleu,PID:22693 了java.lang.RuntimeException:錯誤接收廣播意向{ 行爲= com.example.jordanbleu.lab8chronservjordanbleu.MY_TIME_TICK FLG = 0×10}在 com[email protected]d9365fe 在 android.app.LoadedApk $ ReceiverDispatcher $ Args.run(LoadedApk.java :1132) at android.o s.Handler.handleCallback(Handler.java:751)at android.os.Handler.dispatchMessage(Handler.java:95)at android.os.Looper.loop(Looper.java:154)at android.app。 ActivityThread.main(ActivityThread.java:6119)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886) at com .android.internal.os.ZygoteInit.main(ZygoteInit.java:776)導致 通過:java.lang.ClassCastException:android.app.Application不能被 轉換爲com.example.jordanbleu.lab8chronservjordanbleu.MainActivity在 com。 example.jordanbleu.lab8chronservjordanbleu.ChronometerReceiver.onReceive(ChronometerReceiver.java:41) at android.app.LoadedApk $ ReceiverDispatcher $ Args.run(LoadedApk.java:1122) at android.os.Handler.handleCallback(Handler.java:751)at android.os.Handler.dispatchMessage(Handler.java:95 )at android.os.Looper.loop(Looper.java:154)at android.app.ActivityThread.main(ActivityThread.java:6119)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

所以我有一個MainActivity,它啓動一項服務。該服務創建一個新線程,並且此線程不斷創建由BroadcastReceiver處理的隱式意圖。該廣播接收機將更新時鐘,並用更新的時間更新佈局中的TextView。但是當我嘗試通過上下文參數訪問findViewByID時,出現上述錯誤。

回答

0

ActivityonCreate函數中初始化您的TextView

TextView tv = (TextView) findViewById(R.id.txtChron); 

然後在你的onReceive功能

@Override 
public void onReceive(Context context, Intent intent) { 
    seconds += 0.1; 
    if (seconds > 59.9) { 
     seconds=0; 
     minutes++; 
    } 

    tv.setText(String.valueOf(minutes) + ":" + String.valueOf(seconds)); 
} 
0

你的錯誤是:

java.lang.ClassCastException:android.app.Application不能轉換爲com.example.jordanbleu。 lab8chronservjordanbleu。MainActivity

這意味着「上下文上下文」是應用程序,而不是MainActivity。

我的建議是,在OnCreate中膨脹TextView。

TextView tv; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    tv = (TextView) findViewById(R.id.txtChron); // This! 
... 
} 

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

    seconds += 0.1; 

    if (seconds > 59.9) { 
     seconds=0; 
     minutes++; 
    } 

    tv.setText (String.valueOf(minutes) + ":" + String.valueOf(seconds)); 
} 
相關問題