【问题标题】:How to initialize a EditText when the Fragment's method is called from activity?从Activity调用Fragment的方法时如何初始化EditText?
【发布时间】:2017-12-07 15:06:25
【问题描述】:

我使用记事本应用程序,因为我想尝试 SQLite,但我的智能手机上没有正确的记事本应用程序。

Screenshot of the app

所以我的应用程序由一个 Activity 组成,其中包含一个 Viewpager 和一个用于保存笔记、创建新笔记或删除当前笔记的菜单,以及一个片段,其中是一个简单的 EditText。

我创建了一个自定义对象 Note,它由一个字符串标题、一个字符串内容和一个整数 id 组成,用于将数据保存在 SQLite 上。

所以我的问题是在我的数据库上保存注释的功能。

它从 Activity 的操作栏中的菜单开始,所以当我点击保存按钮(第二个看起来像 SD 卡)时,我从我的片段中调用了一个方法来编辑数据库上的注释像这样:

private void save() {
    TabFragment fragment = new TabFragment();
    fragment.editNote(arrayListTitle);
}

arraylist 包含每个笔记的标题(我用他来创建 TabLayout),我通过他来获取笔记的标题。

所以有我的片段的代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rootview = (ViewGroup) inflater.inflate(R.layout.fragment_tab, container, false);
    editText1 = rootview.findViewById(R.id.editText1);

    manager = new NoteManager(getActivity());
    manager.open();

    Bundle args = getArguments();
    position = args.getInt("0");
    arrayListContent = args.getStringArrayList("1");

    editText1.setText(arrayListContent.get(position));
    return rootview;
}

public void editNote(ArrayList<String> arrayListTitle) {
    title_edit = arrayListTitle.get(position);
    content_edit = editText1.getText().toString();
    Note note = manager.getNote(position + 1);

    note.setTitle(title_edit);
    note.setContent(content_edit);
    manager.modNote(note);
}

当我进入 editNote 方法时,我收到错误:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: fr.pensebete, PID: 24165
              java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
                  at fr.pensebete.TabFragment.editNote(TabFragment.java:50)
                  at fr.pensebete.MainActivity.save(MainActivity.java:130)
                  at fr.pensebete.MainActivity.onOptionsItemSelected(MainActivity.java:101)
                  at android.app.Activity.onMenuItemSelected(Activity.java:3369)
                  at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:368)
                  at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)
                  at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108)
                  at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108)
                  at android.support.v7.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:65)
                  at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:202)
                  at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:780)
                  at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
                  at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171)
                  at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973)
                  at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:963)
                  at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:624)
                  at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:150)
                  at android.view.View.performClick(View.java:6213)
                  at android.widget.TextView.performClick(TextView.java:11074)
                  at android.view.View$PerformClick.run(View.java:23645)
                  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:6692)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

我知道它是因为 EditText 没有初始化,因为我只调用了 editNote() 方法并且没有调用 OnCreateView。

如何从 Activity 调用 EditNote() 方法并使 EditText 和变量位置正确初始化(如在 OnCreateView 方法中)?你能帮我吗,因为我搜索了 3 个小时,却没有解决方案让它工作。

感谢您的宝贵时间和帮助,并为我的英语不好感到抱歉。

编辑:在我写这个问题的过程中,我意识到这可能是因为我在 Activity 的方法中做了一个新的 TabFragment:

private void save() {
    TabFragment fragment = new TabFragment();
    fragment.editNote(arrayListTitle);
}

也许我必须接收或找到已经创建的当前片段,但我不知道该怎么做。帮助 !

【问题讨论】:

  • 使用您的片段实例而不是创建新片段。
  • 是的,我考虑过,但我该怎么做呢?
  • 在下面查看我的答案。

标签: android sqlite android-activity fragment


【解决方案1】:

试试这个:

private void save() {
    TabFragment fragment = getFragmentManager().findFragmentByTag("Tag");
    fragment.editNote(arrayListTitle);
}

确保在创建片段时,您像这样设置标签:

getFragmentManager().beginTransaction().replace(R.id.frame, new TabFragment(), "Tag").commit();

【讨论】:

  • 感谢您的回答!这是我的 ViewPager 适配器用于创建片段的代码:TabFragment tab1 = new TabFragment(); return tab1; } 如您所见,我不使用片段管理器,您知道我可以添加标签吗用这种方式?
【解决方案2】:

例如参考这个

https://github.com/codepath/android_guides/wiki/ViewPager-with-FragmentPagerAdapter

在活动类中

public class MainActivity extends AppCompatActivity {

Adapter adapterViewPager; //Replace with your adapter
ViewPager vpPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    vpPager = (ViewPager) findViewById(R.id.vpPager);
    adapterViewPager = new ViewPagerAdapter(getSupportFragmentManager());
    vpPager.setAdapter(adapterViewPager);
}

private void save() {
  TabFragment fragment = vPager.getItem(0) //position to which fragment
  fragment.editNote(arrayListTitle);
}
}

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2012-08-17
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多