好吧,我是Android Studio的新手而且我似乎无法弄清楚。
我有一个主要的活性和2个碎片。我正在尝试在主要活动的片段中编辑公共变量(列表(。这就是我到目前为止要做的事情。
内部活动中我有以下内容:
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);
}
...
表格和图表是我的两个片段,这两个片段都不会让我编辑他们的公开声明的变量。
这是我图表课的开头的样子:
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访问entryList
:chart.entryList.add(...);
。但是,当我执行该方法并到达该行时(或试图从MainActivity中读取/更改变量的任何代码行时,我都会获得Null对象参考。
i在每个片段中都设置了接口,以将信息从片段发送到主activity。我应该使用相同的界面将信息从主动行为发送到片段,如果是这样?
这是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)
编辑:
我应该提到,如果我声明form
和chart
如下,则该代码执行,并且不要尝试将其引用到其片段ID:
private Form form = new Form();
private Chart chart = new Chart();
这样做时,片段实际上并未随着我要在其中更改的数据而更新。因此,我认为问题在于getSupportFragmentManager().findFragmentById(R.id.---);
上片段的引用。我似乎不明白为什么引用为null。
尝试使用片段中的静态关键字:
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);
}
遇到问题后,我不喜欢那样,只使用静态。您可以尝试找到为什么会发生的原因。