如何从VIewpager中的其他片段获取信息

时间:2015-02-24 01:51:32

标签: android android-fragments android-viewpager

我正在从Android开发者网站上关注本教程 http://developer.android.com/training/animation/screen-slide.html

我的情况是这样......

我有N个片段代表我的viewpager中的每个页面,每个片段都不同并且有自己的布局。这就是为什么我为每种类型的片段都有不同的类。

我想获得我在第一页中使用的不同编辑文本的值,但在最后一页我要处理该信息。

我不知道如何解决这个问题

3 个答案:

答案 0 :(得分:0)

您可以使用Intent或Bundle将信息从一个片段传递到其他片段。在2nd Fragment中处理该信息并再次使用Intent或Bundle将处理结果传递给第一个片段 例: Simple example for Intent and Bundle

答案 1 :(得分:0)

如@calvinfly所述,尝试实现一个接口。因为每个单独的片段都是唯一的并且彼此不了解,所以它们之间的唯一链接是创建它们的适配器。因此,您可以在Fragment及其适配器之间设置回调:

public class DummyFragment extends Fragment {
    private OnEditTextSendListener mListener;
    ...
    public interface OnSendTextListener { // this requires the adapter to implement sendMessage()
        public void sendMessage(CharSequence msg);
    }

    public void setOnSendTextListener(OnSendTextListener listener) {
        mListener = listener;
    }

    public View onCreateView( ... ) {
        ...
        (EditText) editText = (EditText) rootView.findViewById(R.id.editText);
        editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                mListener.sendMessage(v.getText());
            }
        }
    }
}

注意:如果需要,指定收听特定的actionId(例如EditorInfo.IME_ACTION_SEND

然后在你的寻呼机适配器中:

public class SectionsPagerAdapter extends FragmentStatePagerAdapter 
    implements DummyFragment.OnSendTextListener {
    private String mReceivedMessage;

    // the required method to implement from the interface
    public void sendMessage(CharSequence msg) {
        mReceivedMessage = msg.toString();
        notifyOnDataSetChanged(); // tell the adapter views need to be updated
    }
}

从这里,您的适配器现在会在您对EditText执行操作时收到EditText输入(一旦适配器调用setOnSendTextListener并将其设置为自身,您将在下面看到)。唯一剩下的就是将此消息传递回相应的片段,可能在getItem期间作为Bundle中的参数之一。

public Fragment getItem(int position) {
    Fragment fragment;
    Bundle args = new Bundle();
    switch (position) {
        case 0:
            fragment = new DummyFragment();
            ((DummyFragment) fragment).setOnSendTextListener(this);
            break;
        case 1:
            // your other fragment
        case 2:
            // your other fragment that wants the message from 1st fragment
            args.putString(DummyOtherFragment.ARG_DUMMYFRAGMENT_MSG, mReceivedMessage);
            break;
        default:
    }

    // other arguments here
    fragment.setArguments(args);
    return fragment;
}

希望这有帮助 - 请参阅Android开发人员指南Creating event callbacks to the activity)以获取更多信息。

附注:您可能会遇到适配器正确接收回调信息的问题,但是传递数据的片段不会重新加载数据(即使您正在调用notifyOnDataSetChanged()。这本身就是另外一个问题,我想引导你another SO question about ViewPager refreshing fragments进一步阅读。

答案 2 :(得分:0)

在您发布的教程中,我认为您必须实现getItem override方法。 在该网页中查找文字:

  

创建一个扩展FragmentStatePagerAdapter抽象的类   class并实现getItem()

扩展Fragment或PagerAdapter的想法很常见。我为PagerAdapter做了这件事,我很高兴。