如何在使用具有不同片段/布局的视图页面时传递片段参数?

6
目的: 使用片段参数将 TextView 中的字符串传递到新的片段 TextView,但同时使用具有不同 layouts/fragmentsFragmentPagerAdapterViewPager

问题: 新片段从未收到来自先前片段的片段参数。

我的设置: 我的 Activity 托管着 ViewPagerFragmentPagerAdapter。我重写了 FragmentPagerAdaptergetItem(int position) 方法,根据当前 ViewPager 的位置创建一个新的 fragment 实例。现在我的适配器中只有两个 Fragments,但是在克服这个障碍之后将添加更多的 Fragments。我正在使用 newInstance() 技术传递 Fragment 的参数,但没有传递任何内容。

相关代码:

我的 FragmentPagerAdapter 代码:

//this is a variable that I pass in as the newInstanct() methods parameter,
// I update   this variable from my fragments constantly
public static String fragmentArgumentsValue = "";

mViewPager.setAdapter(new FragmentPagerAdapter(fm) {


            @Override
            public int getCount() {

                return NUMBER_OF_VIEWS;
            }

            @Override
            public Fragment getItem(int position) {
                switch (position) {
                case 0:
                    Log.d(TAG, "---In getPosition(), position 0---");

                    return Frag1
                            .newInstance(fragmentArgumentsValue);

                case 1:
                    Log.d(TAG, "---In getPosition(), position 1---");

                    return frag2
                            .newInstance(fragmentArgumentsValue);

                default:
                    Log.d(TAG, "---In getPosition(), DEFAULT---");

                    return frag1
                            .newInstance(fragmentArgumentsValue);
                }

            }
        });

其中之一的碎片newInstance()方法:

public static Fragment newInstance(String fragmentArgumentsValue) {
    Frag1 f = new Frag1();
    Bundle bun = new Bundle();
    bun.putString(KEY_FRAGMENT_ARGUMENTS_STRING, fragmentArgumentsValue);
    f.setArguments(bun);
    return f;
}

获取片段参数:

String argString = getArguments().getString(
        KEY_FRAGMENT_ARGUMENTS_STRING);
if (argString.length() != 0) {
    Log.d(TAG, "Trying to set the frag args to:" + argString);
    mWorkingTextView.setText("" + argString);
} else {
    Log.d(TAG, "Couldn't set frag args to: " + argString);
}
我尝试过的方法: 我尝试给托管ViewPagerFragmentPagerAdapterActivity一个静态变量,并在每个fragment中不断更新它,我在fragment.newInstance(staticVariableInActivity)方法中包含了这个静态变量,但是这似乎行不通。我还尝试使用ViewPager回调viewPager.setOnPageChangeListener(),我重写了onPageSelected(int pos)并试图在那里传递fragment参数,然而它没有起作用...所以请帮帮我吧! 我的想法: 我没有将不同的fragmentslayouts放在ArrayList或任何列表中,我只是根据FragementPagerAdapter的位置通过newInstance()方法实例化Fragments,这可能有问题吗?我应该创建一个singleton列表来存储layouts/fragments吗?这样我就可以通过singleton列表更改FragmentsTextViews的值了吗?(如果这是一个愚蠢的或不可能的事情,请原谅我)。 注意: 我正在通过public void onSaveInstanceState(Bundle outState)保存TextViews的值以处理屏幕旋转。这可能会有问题吗?
2个回答

3

好的,这个链接可以帮助在片段之间进行通信:与其他片段通信

你需要定义一个接口,该活动将实现并且片段将使用它来向活动发送数据,并且活动将通过标记查找片段执行类似以下操作:

frag = (Fragment2) getSupportFragmentManager()
                    .findFragmentByTag(
                            "android:switcher:" + R.id.viewPager + ":2");

然后通过调用片段内实现的公共方法来更新片段。

提供的链接会很有帮助,来自 Android 开发网站。


2
将bundle添加到适配器中。
在适配器构造函数中的示例:
      public ViewPagerAdapter(Context context, FragmentManager fm) {
        super(fm);
        fragments.add(TileFragments.newInstance());
        Bundle bundleFeatures = new Bundle();
        bundleFeatures.putString(ContentName.FEATURES.toString(),ContentName.FEATURES.toString());

        fragments.get(0).setArguments(bundleFeatures);

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接