在Fragment Pager中的Fragment中调用Fragment / get属性中的方法

时间:2014-01-04 17:56:51

标签: android android-fragments android-fragmentactivity fragmentpageradapter

我有一个大的形式分成3个片段。片段包含在FragmentPagerAdapter中,因此可以将它们作为页面滑动。由于有很多调用,我认为在每个更改的控件上调用从片段到活动的接口是不切实际的。有没有办法在每个页面滑动时调用方法或获取片段的属性?

这是当前的代码:

    final List<Fragment> fragments = getFragments();
    pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);
    ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
    pager.setOffscreenPageLimit(3); //This is necessary to prevent the destruction of the last fragment, otherwise the dynamically added views get lost
    pager.setAdapter(pageAdapter);

随着offscreenlimit的增加以解决当片段不可见时程序化将视图作为子节点添加到其中一个片段中的布局的问题, onPause()不适用否则只需调用其中的界面就可以了。

我已经覆盖了寻呼机的 OnPageChangeListener ,但是我找不到如何获取我需要的数据。这是片段中代码的一部分:

根据此答案https://stackoverflow.com/a/9977370/1927033

实现从片段到活动的接口

接口

public interface DataPassIF {

    public void passPartForm(UForm pageFromForm);
}
DataPassIF dataPasser;

@Override
public void onAttach(Activity a){
    super.onAttach(a);
    dataPasser = (DataPassIF) a;
}

这是一个片段,如果没有增加限制,搜索栏会被破坏。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    final View fragment = inflater.inflate(R.layout.page3, container, false);

    LinearLayout ll = (LinearLayout) fragment.findViewById(R.id.p3_ll);
    RelativeLayout rl = (RelativeLayout) fragment.findViewById(R.id.p3_rl);

    int child = rl.getChildCount();
    for (int i = 0; i < child; i++) {
        View v = rl.getChildAt(i);
        if (v instanceof CheckBox) {
            v.setOnClickListener(onCickAdder(fragment.getContext()));
        }
    }

    return fragment;
}

private View.OnClickListener onCickAdder(final Context context) {
    return new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (((CheckBox) view).isChecked()) {
                SeekBar nsb = createSeekBar(context);
                //TODO clear up this with proper id generation
                nsb.setId(imak++);
                view.setTag(nsb.getId());
                ll.addView(nsb);
            } else {
                ll.removeView(ll.findViewById((Integer) view.getTag()));
            }

        }
    };
}

private SeekBar createSeekBar(Context context) {
    SeekBar sb = new SeekBar(context);
    sb.setMax(20);
    sb.setProgress(10);
    return sb;
}

1 个答案:

答案 0 :(得分:0)

只需在onPageChangeListener内的ViewPager对象上设置Activity,然后您就可以使用该位置来了解用户当前正在查看的片段。我不确定你要用这个做什么,否则我会试着更清楚......

编辑:既然你说过你只有3 Fragments,为什么不在你的活动中保留对片段的引用,然后在片段上使用getter方法来获取POJO?

Subo Code:

将您的界面更改为:

public interface DataPassIF {
     public UForm getPartForm();
}

让所有片段实现此接口,其实现返回其UForm的实例:

public class YourFragment implements DataPassIF {

    UForm form;

    @Override
    public UForm getPartForm(){
        return form;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState){
         super.onCreate(savedInstanceState);
         form = new Uform();
    }

    //Logic to modify Uform
    ...

}

由于您知道每个片段都实现了此接口,因此您可以在需要时将存储在List<Fragment> fragments中的每个片段转换为DataPassIF,并调用接口的方法。根据用户是否使用提交按钮,可能更容易从onClick(View v);方法中将数据发送到活动,以便您知道他们在使用之前已完成修改数据。

pager = (ViewPager) findViewById(R.id.tutorial_pager);
        pager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                        DataPassIF part = (DataPassIF) fragments.get(position);
                        completeForm.merge(part);
            }

            @Override
            public void onPageScrolled(int position, float positionOffset,
                    int postitionOffsetPixels) {
                        //Might need to use this method to see if they're changing pages...
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

}