Android:从自定义操作栏中调用片段中的函数

死灵

我有以下问题:

我对活动的操作栏有一个自定义布局,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="horizontal"
   android:divider="?android:attr/dividerVertical"
   android:showDividers="middle"
   android:dividerPadding="6dp">
   <include layout="@layout/include_cancel_button" />
   <include layout="@layout/include_done_button" />
</LinearLayout>

带有一个类似的按钮:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   style="?android:actionButtonStyle"
   android:id="@+id/actionbar_done"
   android:layout_width="0dp"
   android:layout_height="match_parent"
   android:layout_weight="1"
   android:onClick="saveSchwein" >
   <TextView style="?android:actionBarTabTextStyle"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center"
       android:paddingRight="10dp"
       android:drawableLeft="@drawable/ic_action_ok"
       android:drawablePadding="8dp"
       android:gravity="center_vertical"
       android:text="@string/ok" />
</FrameLayout>

该片段在活动的onCreate()期间添加到ViewPager中,如下所示:

    viewPager = (ViewPager) findViewById(R.id.schweinpager);
    tabPagerAdapter = new SchweinFragmentAdapter(getSupportFragmentManager());
    viewPager.setAdapter(tabPagerAdapter);

    actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this).setTag(tab_name));
    }

到目前为止,一切正常。我在操作栏的选项卡中显示了三个片段,可以在它们之间滑动开关而不会出现问题。

现在是我的实际问题:我想在自定义操作栏中的片段中调用一个函数。

活动中的saveSchwein()(因为未找到片段中的函数):

public void saveSchwein(View v) {
    Fragment fragment = tabPagerAdapter.getItem(0);
    ((StammdatenFragment) fragment).saveSchwein();
}

以及片段中的对应功能

public void saveSchwein() {
    if (getActivity() == null) {
        System.out.println("getActivity ist null");
    }
    if (rootView == null) {
        System.out.println("rootView ist null");
    }
    if (isAdded()) { System.out.println("Attached to Activity"); } else { System.out.println("NOT attached to Activity"); }

        Schwein schwein = new Schwein();
        schwein.setName(add_name.getText().toString());
        schwein.setGeschlecht(geschlecht_spinner.getSelectedItem().toString());
        schwein.setRasse(rasse_spinner.getSelectedItem().toString());
        schwein.setGeburtsdatum(add_geburtsdatum.getText().toString());
        schwein.setBesonderheiten(add_besonderheiten.getText().toString());

}

在onCreateView()期间,将rootView和视图分配如下:

rootView = inflater.inflate(R.layout.fragment_schwein_stammdaten, container, false);

    add_name = (EditText) rootView.findViewById(R.id.add_name);
    geschlecht_spinner = (Spinner) rootView.findViewById(R.id.geschlecht_spinner);
    rasse_spinner = (Spinner) rootView.findViewById(R.id.rasse_spinner);
    add_geburtsdatum = (TextView) rootView.findViewById(R.id.add_geburtsdatum);
    add_besonderheiten = (EditText) rootView.findViewById(R.id.add_besonderheiten);

结果是rootView和getActivity()均为null,而iwego()为false,因此该片段不再附加到该活动。在这一行,我得到了nullpointerexception:

schwein.setName(add_name.getText().toString());

几天以来,我现在一直在寻找问题的答案,但尚未找到正确的答案。但是我通过了解片段的生命周期取得了进步,并发现这与事实有关:在自定义操作栏中,片段在操作期间不处于活动状态。使用Fragment这样的选项菜单时,它可以在Fragment中运行,但是我更喜欢使用自定义操作栏!

有任何想法吗?

布鲁斯

您的SchweinFragmentAdapter.getItem函数是什么样的?通常,这些功能只是创建一个片段,而无需先检查该片段是否已存在。这是要检查的第一件事,因为在saveSchwein中,您直接调用getItem,并且要确保您没有创建新的片段(没有视图或活动),然后在该新片段上调用该片段的saveSchwein未配置的片段。那可以解释您所看到的行为。

如果是这种情况,那么您可以改为执行以下操作:

public void saveSchwein(View v) {
    Fragment fragment = getSupportFragmentManager().findFragmentByTag("StammdatenFragment");
    ((StammdatenFragment) fragment).saveSchwein();
}

另一种选择是更改getItem的实现,以便它跟踪已创建的所有片段,并仅在需要时创建新片段。

public static class SchweinFragmentAdapter extends FragmentPagerAdapter {
    private Fragment [] fragments = new Fragment[3];

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = fragments[position];

        if (fragment == null) {
            if (position == 0) {
                fragment = new ...
            } else if (position == 1) {
                fragment = new ...
            } else if (position == 2) {
                fragment = new ...
            }
            fragments[position] = fragment;
        }
        return fragment;
    }
}

编辑:

抱歉,我给您的解决方案实际上存在问题。是的,它可以工作,但是也可能导致内存泄漏,因为Android已经在FragmentPagerAdapter中缓存片段。我对此类感到沮丧,因为没有公共API获取适配器将片段添加到您的活动时使用的标签。但是,由于我们可以查看代码,因此可以看到它们在做什么。

更好的解决方案尽管很丑陋,但使用findFragmentByTag。但是,标签不是我最初回答的内容。尝试以下方法:

private static final int POSITION_STAMMDATEN = //TODO the position of your fragment in the adapter

public void saveSchwein(View v) {
    Fragment fragment = getSupportFragmentManager().findFragmentByTag(
        "android:switcher:" + viewPager.getId() + ":"
                + tabPagerAdapter.getItemId(POSITION_STAMMDATEN)");
    ((StammdatenFragment) fragment).saveSchwein();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

片段Android中的自定义操作栏

来自分类Dev

在自定义操作栏中显示片段标题

来自分类Dev

Android中的操作栏上的“自定义”视图问题

来自分类Dev

从活动中调用自定义片段

来自分类Dev

如何使用子片段更改自定义操作栏中 textview 的文本

来自分类Dev

如何用Android中的自定义操作栏完全替换AppCompatActivity的操作栏?

来自分类Dev

在Android中自定义操作栏会先显示默认操作栏

来自分类Dev

在简码中调用自定义函数

来自分类Dev

在Android中动态在按钮中添加自定义操作栏

来自分类Dev

在操作栏中实现自定义视图样式

来自分类Dev

按钮ID未进入自定义操作栏中

来自分类Dev

如何打开和关闭导航抽屉,单击Android中的自定义操作栏图标?

来自分类Dev

自定义样式操作栏在android 4中不起作用

来自分类Dev

Android:在操作栏中向SearchView窗口小部件添加自定义按钮

来自分类Dev

Android中的自定义操作栏与父项不匹配

来自分类Dev

无法为Android应用程序中的操作栏自定义AppTheme

来自分类Dev

Android:在操作栏中向SearchView窗口小部件添加自定义按钮

来自分类Dev

Android-自定义后,标题文本未显示在操作栏中

来自分类Dev

Android-操作栏中的自定义视图不可点击

来自分类Dev

无法在 android 中更改自定义操作栏背景颜色

来自分类Dev

android:从片段中打开chrome自定义标签

来自分类Dev

在 WordPress 中调用 PHP 函数中的自定义字段

来自分类Dev

通过CRM Online中的JavaScript调用自定义操作

来自分类Dev

如何从自定义 UIView 调用 UIViewController 中的方法/操作?

来自分类Dev

属性构造函数中的自定义操作

来自分类Dev

Android工具栏中的自定义图标

来自分类Dev

在Android中更改自定义搜索栏的宽度

来自分类Dev

无法更改Android中的自定义进度栏宽度

来自分类Dev

在android webview中添加自定义进度栏

Related 相关文章

  1. 1

    片段Android中的自定义操作栏

  2. 2

    在自定义操作栏中显示片段标题

  3. 3

    Android中的操作栏上的“自定义”视图问题

  4. 4

    从活动中调用自定义片段

  5. 5

    如何使用子片段更改自定义操作栏中 textview 的文本

  6. 6

    如何用Android中的自定义操作栏完全替换AppCompatActivity的操作栏?

  7. 7

    在Android中自定义操作栏会先显示默认操作栏

  8. 8

    在简码中调用自定义函数

  9. 9

    在Android中动态在按钮中添加自定义操作栏

  10. 10

    在操作栏中实现自定义视图样式

  11. 11

    按钮ID未进入自定义操作栏中

  12. 12

    如何打开和关闭导航抽屉,单击Android中的自定义操作栏图标?

  13. 13

    自定义样式操作栏在android 4中不起作用

  14. 14

    Android:在操作栏中向SearchView窗口小部件添加自定义按钮

  15. 15

    Android中的自定义操作栏与父项不匹配

  16. 16

    无法为Android应用程序中的操作栏自定义AppTheme

  17. 17

    Android:在操作栏中向SearchView窗口小部件添加自定义按钮

  18. 18

    Android-自定义后,标题文本未显示在操作栏中

  19. 19

    Android-操作栏中的自定义视图不可点击

  20. 20

    无法在 android 中更改自定义操作栏背景颜色

  21. 21

    android:从片段中打开chrome自定义标签

  22. 22

    在 WordPress 中调用 PHP 函数中的自定义字段

  23. 23

    通过CRM Online中的JavaScript调用自定义操作

  24. 24

    如何从自定义 UIView 调用 UIViewController 中的方法/操作?

  25. 25

    属性构造函数中的自定义操作

  26. 26

    Android工具栏中的自定义图标

  27. 27

    在Android中更改自定义搜索栏的宽度

  28. 28

    无法更改Android中的自定义进度栏宽度

  29. 29

    在android webview中添加自定义进度栏

热门标签

归档