gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:24:17 24 4
gpt4 key购买 nike

简介

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

问题

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

问题

我显然不应该在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com