簡體   English   中英

如何從廣播接收器的onReceive方法內部訪問MainActivity findViewById?

[英]How to get access to the MainActivity findViewById from inside a Broadcast Receiver onReceive method?

當我使用此代碼時:

@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));
}

嘗試將上下文MainActivityMainActivity時出現錯誤。

這是錯誤/堆棧跟蹤:

E / AndroidRuntime:致命例外:main進程:com.example.jordanbleu.lab8chronservjordanble,PID:22693 java.lang.RuntimeException:在com中接收廣播Intent {act = com.example.jordanbleu.lab8chronservjordanbleu.MY_TIME_TICK flg = 0x10}時出錯。 example.jordanbleu.lab8chronservjordanbleu.ChronometerReceiver@d9365fe在android.app.LoadedApk $ ReceiverDispatcher $ Args.run(LoadedApk.java:1132)在android.os.Handler.handleCallback(Handler.java:751)在android.os.Handler。 android.os.Looper.loop(Looper.java:154)的dispatchMessage(Handler.java:95)java.lang.reflect.Method.invoke(Native)的android.app.ActivityThread.main(ActivityThread.java:6119) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)處的com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)處的原因:java.lang.ClassCastException :無法將android.app.Application強制轉換為com.example.jordanbleu.lab8chronservjordanbleu.MainActivity的com.example.jordanbleu.lab8chronservjordanble u.ChronometerReceiver.onReceive(ChronometerReceiver.java:41)在android.app.LoadedApk $ ReceiverDispatcher $ Args.run(LoadedApk.java:1122)在android.os.Handler.handleCallback(Handler.java:751)在android.os在java.lang.reflect.Method上的.Handler.dispatchMessage(Handler.java:95)在android.os.Looper.loop(Looper.java:154)在android.app.ActivityThread.main(ActivityThread.java:6119)處。在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)處com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)處調用(本機方法)

因此,我有一個MainActivity ,它可以啟動服務。 服務創建一個新線程,並且該線程不斷創建隱式意圖,這些隱式意圖由BroadcastReceiver處理。 此廣播接收器將更新時鍾,並使用更新的時間更新布局中的TextView 但是,當我嘗試通過context參數訪問findViewByID ,出現了以上錯誤。

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));
}

您的錯誤是:

java.lang.ClassCastException:android.app.Application無法轉換為com.example.jordanbleu.lab8chronservjordanbleu.MainActivity

這意味着“上下文上下文”是Application,而不是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));
}

您也可以使用界面。 這樣,您將不必訪問BroadcastReceiver中的UI元素。

1)創建一個接口:

interface ReceiverListener {
    public void doSomething(String arg1, String arg2);
}

2)在您的BroadcastReceiver中實例化監聽器

public class YourBroadCastReceiver extends BroadCastReceiver{

    private ReceiverListener listener;

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

        listener = (ReceiverListener)context;  // Initialize listener 

        // Your logic 
        String minutes = //get it
        String seconds = // get it

       listener.doSomething(minutes,seconds); 

    }

}

3)在“您的活動”中實現接口並覆蓋方法

public YourActivity extends AppcompatActivity implements ReceiverListener{

     // Activity related code
    TextView tv;

    public void updateUI(String minutes,String seconds){
        tv.setText (minutes + ":" + seconds);
    }


    @Override 
    public void doSomething(String arg1, String arg2){
        updateUI(arg1,arg2);
    }

}

相關鏈接:

如果您想了解在這種情況下使用接口的優勢,請閱讀此內容

暫無
暫無

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

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