簡體   English   中英

Android Studio / Java空對象引用-似乎無法從活動中編輯片段變量

[英]Android Studio/Java null object reference - can't seem to edit fragment variable from activity

好的,我是Android Studio的新手,如果這是一個愚蠢的問題,請在這里接受,但是我已經研究了幾個小時,試圖弄清為什么我不能做到這一點,而且我似乎也無法弄清楚。

我有一個MainActivity和2個片段。 我正在嘗試在主要活動的片段內編輯公共變量(列表)。 到目前為止,這是我所做的事情。

在MainActivity內部,我有以下內容:

public class MainActivity extends AppCompatActivity implements Form.sendFormData, Chart.chartData {

    private Form form = new Form();
    private Chart chart = new Chart();

    public MainActivity() {
        this.form = (Form) getSupportFragmentManager().findFragmentById(R.id.fragmentForm);
        this.chart = (Chart) getSupportFragmentManager().findFragmentById(R.id.fragmentChart);
    }

...

Form和Chart是我的2個片段,這兩個片段都不會讓我編輯它們的公開聲明的變量。

這是我的Chart類開始時的樣子:

public class Chart extends Fragment {

    private static final String TAG = "Chart";

    PieChart chart;

    public List<Entry> entryList = new ArrayList<>();
    public List<PieEntry> entries = new ArrayList<>();
...

我想做的是通過執行以下操作通過MainActivity訪問entryListchart.entryList.add(...); 但是,當我執行該方法並到達代碼的那一行(或試圖從MainActivity讀取片段中的變量的任何代碼行)時,我會得到空對象引用。

我在每個片段中都設置了接口,用於將信息從片段發送到MainActivity。 我是否應該使用相同的接口將信息從MainActivity發送到Fragments,如果可以,怎么辦?

這是logcat:

05-03 00:44:10.873 29594-29594/com.mptests.rafflemore E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mptests.rafflemore, PID: 29594
java.lang.NullPointerException: Attempt to read from field 'java.util.List com.mptests.rafflemore.Chart.entryList' on a null object reference
at com.mptests.rafflemore.MainActivity.onSubmitEntry(MainActivity.java:61)
at com.mptests.rafflemore.Form.submitEntry(Form.java:139)
at com.mptests.rafflemore.Form$1.onClick(Form.java:74)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22429)
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)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

編輯:

我應該提到的是,如果我按以下方式聲明formchart ,並且不嘗試將它們引用到它們的片段ID上,則代碼將執行:

private Form form = new Form();
private Chart chart = new Chart();

但是,當我這樣做時,片段實際上並不會使用我要在其中更改的數據進行更新。 所以我假設問題出在getSupportFragmentManager().findFragmentById(R.id.---);的片段引用之內getSupportFragmentManager().findFragmentById(R.id.---); 我只是似乎不明白為什么引用為空。

嘗試在片段中使用static關鍵字,如下所示:

public static List<Entry> entryList = new ArrayList<>();

您的懷疑是正確的。 問題在這里:

public MainActivity() {
    this.form = (Form) getSupportFragmentManager().findFragmentById(R.id.fragmentForm);
    this.chart = (Chart) getSupportFragmentManager().findFragmentById(R.id.fragmentChart);
}

您不能在此處分配表格和圖表。 在這里,沒有觀點被破壞。 因此,findFragmentById(R.id.fragmentForm)和findFragmentById(R.id.fragmentChart)將為null。

您可以在onCreate()中設置它們

@Override
onCreate() {
    setContentVew(R.layout.my_view);

    this.form = (Form) getSupportFragmentManager().findFragmentById(R.id.fragmentForm);
    this.chart = (Chart) getSupportFragmentManager().findFragmentById(R.id.fragmentChart);
}

遇到問題后,我不喜歡使用靜態方法。 您可以嘗試找出原因。

暫無
暫無

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

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