java - 如何一键正确地将数据保存在多个 fragment 中?

标签 java android android-fragments android-edittext save

简介

大家好。目前我正在开发一个问题形式的应用程序。在 MainActivity 中添加项目会打开 QuestionListActivity。单击第一个项目将打开 Main2Activity,其中包含 3 个 fragment (使用 Viewpager 选项卡)。每个 fragment 都包含一个用于回答问题的 EditText 字段。以及一个带有保存按钮的工具栏。第一个问题是为表单指定一个可在 MainActivity 中查看的名称。单击 MainActivity 中已保存的项目之一将打开 QuestionList,然后单击第一个项目将显示 fragment ,其保存的数据已在 EditText 表单中以供查看或更改。在处理这些 fragment 后,保存按钮应该一次保存所有 fragment ,而不是一次保存一个 fragment 。

问题

首先我只能保存项目。但无法查看它们。然后我修复了每个 fragment 的 java 类,现在可以查看 MainActivity 中每个已保存项目的 fragment 内的所有已保存数据。但现在的问题是我无法保存新数据,或更改已保存的数据,因为这样我在代码的 private void saveNote 部分(LogCat)中得到了一个空对象引用。

问题

我显然不应该在 Main2Activity 的 oncreate 方法中调用 title、question2 和 Question3,因此这会导致空对象引用。但我真的不知道如何以正确的方式做到这一点。希望有人知道如何以正确的方式保存一个项目中每个 fragment 的数据,以及如何更改 private void saveNote 中的标题、问题 2 和问题 3。

(我在 StackOverFlow 上搜索了正确的答案,但不幸的是,这无法以这种特定方式帮助我)

代码

在这里,我发布了我的 Main2Activity 和一个 fragment (Frag1) 的代码。其他 fragment 以同样的方式设置。

 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)

最佳答案

更改您的 saveNote 方法,如下所示,

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

您还需要在每个 fragment Frag1、Frag2 和 Frag3 上创建方法 getTitle。

例如,

fragment 1

public String getTitle(){
 return mEtTitle.getText().toString();
}

关于java - 如何一键正确地将数据保存在多个 fragment 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51987326/

相关文章:

android - 替换 FragmentActivity 中的 fragment 会卡住我的应用程序超过 5 秒

android - 更改方向时如何在 fragment 中保存 WebView 状态?

android - 如何使用像后退按钮一样的按钮来关闭当前 fragment ?

java - Java 可变参数可以为空吗?

引用另一个 Java 项目的 Java Web 项目

java - ant 脚本中无法识别环境变量

php - Android从php org.json.JSONArray检索数据无法转换为JSONObject

android - 将位图传递给另一个 Activity 以 RunTimeException 结束

java - 在字符串中搜索 URL

Android Studio - SDK 管理器