如何一键将数据正确保存在多个片段中?

时间:2018-08-23 13:45:24

标签: java android android-fragments android-edittext save

简介

大家好目前,我正在研究一个问题表单应用程序。在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)

1 个答案:

答案 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();
}