简介
大家好目前,我正在研究一个问题表单应用程序。在MainActivity中添加项目会打开QuestionListActivity。单击第一项将打开Main2Activity,其中包含3个片段(使用Viewpager选项卡)。每个片段都包含一个EditText字段来回答问题。还有一个带有保存按钮的工具栏。第一个问题是给表单一个名称,该名称在MainActivity中可见。单击MainActivity中一个保存的项目将打开QuestionList,然后单击第一个项目将显示片段及其保存的数据,这些片段已在EditText表单中进行查看或更改。处理完这些片段后,保存按钮应一次保存所有片段,而不是一次保存一个片段。
问题
首先,我只能保存项目。但是无法查看它们。然后,我为每个片段修复了Java类,现在可以在MainActivity中查看每个保存项的片段内的所有保存数据。但是现在的问题是我无法保存新数据,也无法更改已保存的数据,因为这样我在代码(LogCat)的私有void saveNote部分中得到了空对象引用。
问题
我显然不应该在Main2Activity的oncreate方法中调用title,question2和question3,因此这会导致空对象引用。但是我真的不知道如何正确地做到这一点。希望有人知道如何正确地保存一项中每个片段的数据,也许知道如何更改私有void saveNote中的标题,question2和question3。
(我在StackOverFlow上搜索了正确的答案,但不幸的是,这无法以这种特定方式帮助我)
代码
在这里,我发布了Main2Activity和一个片段(Frag1)的代码。其他片段的设置方法相同。
public class Main2Activity extends AppCompatActivity {
private void saveNote() {
String title1,title2,title3;
for(int position = 0; position<mSectionsPagerAdapter.getCount();position++){
Fragment fragment = mSectionsPagerAdapter.getItem(position);
if(fragment instanceof Frag1){
title1 = ((Frag1)fragment).getTitle();
} else if(fragment instanceof Frag2){
title2 = ((Frag2)fragment).getQuestion2();
} else if(fragment instanceof Frag3){
title3 = ((Frag3)fragment).getQuestion3();
}
}
boolean valid = !TextUtils.isEmpty(title1);
valid = valid && !TextUtils.isEmpty(title2);
valid = valid && !TextUtils.isEmpty(title3);
Note note;
if(!valid()){
Toast.makeText(this, "Please provide inputs", Toast.LENGTH_SHORT).show();
return;
}
note = new Note((mLoadedNote != null)?mLoadedNote.getDateTime():System.currentTimeMillis(), title.getText().toString(), question2.getText().toString(), question3.getText().toString());
if (Utilities.saveNote(this, note)){
Toast.makeText(this, "saved", Toast.LENGTH_SHORT).show();
} else{
Toast.makeText(this, "not enough space", Toast.LENGTH_SHORT).show();
}
finish();
}
08-23 13:53:52.045 7779-7779/com.example.beginnoteinidee E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.beginnoteinidee, PID: 7779
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
at com.example.beginnoteinidee.Main2Activity.saveNote(Main2Activity.java:109)
at com.example.beginnoteinidee.Main2Activity.onOptionsItemSelected(Main2Activity.java:139)
at android.app.Activity.onMenuItemSelected(Activity.java:2885)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:436)
at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:196)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109)
at android.support.v7.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:64)
at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:204)
at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:781)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:981)
at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:625)
at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:151)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
答案 0 :(得分:2)
按如下所示更改您的saveNote方法,
http://localhost:8080/images/firstImage.jpg
您还需要在每个片段Frag1,Frag2和Frag3上创建方法getTitle。
例如
Frag1
private void saveNote() {
String title1="",title2="",title3="";
for(int position = 0; position<mSectionsPagerAdapter.getCount();position++){
Fragment fragment = mSectionsPagerAdapter.getItem(position);
if(fragment instanceof Frag1){
title1 = ((Frag1)fragment).getTitle();
} else if(fragment instanceof Frag2){
title2 = ((Frag2)fragment).getTitle();
} else if(fragment instanceof Frag2){
title3 = ((Frag2)fragment).getTitle();
}
}
boolean valid = !TextUtils.isEmpty(title1);
valid = valid && !TextUtils.isEmpty(title2);
valid = valid && !TextUtils.isEmpty(title3);
Note note;
if(!valid){
Toast.makeText(this, "Please provide inputs", Toast.LENGTH_SHORT).show();
return;
}
note = new Note((mLoadedNote != null)?mLoadedNote.getDateTime():System.currentTimeMillis(), title1, title2, title3);
if (Utilities.saveNote(this, note)){
Toast.makeText(this, "saved", Toast.LENGTH_SHORT).show();
} else{
Toast.makeText(this, "not enough space", Toast.LENGTH_SHORT).show();
}
finish();
}