我如何在嵌套片段上覆盖onactivityresult方法?

时间:2017-02-02 08:42:43

标签: android android-viewpager fragment

我使用的片段不是这个,导入android.app.Fragment

我使用这个,导入android.support.v4.app.Fragment

因为我将它用于viewpager

public class PagerAdapter extends FragmentPagerAdapter{

        public PagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {

            if(position == 0){
                return new FragmentOne();
            }else if(position == 1){
                return new FragmentTwo();
            }


        }

        @Override
        public int getCount() {
            return 2;
        }
    }

在这种情况下,FragmentOne扩展导入android.support.v4.app.Fragment 所以不是错误,但FragmentTwo扩展导入android.app.Fragment所以它发生错误

所以我有两个问题

  1. 如果我使用viewpager,Fragment必须是扩展导入android.support.v4.app.Fragment?

  2. 如果我必须扩展导入android.support.v4.app.Fragment,我怎么能使用onactivityresult?

4 个答案:

答案 0 :(得分:2)

如果您希望旧版支持添加support库,则您只能在应用中使用其中一个库。

要通知您的片段有关活动结果的更改,您可以使用界面来完成。

在您的活动中:

public interface ActivityResultListener {
    onActivityResult(int requestCode, int resultCode, Intent data);
}

setremove

创建两种方法
ActivityResultListener

然后,当您收到活动结果时,通知您的听众是否存在。

public void setActivityResultListener(ActivityResultListener listener){
    // You need the listener (ActivityResultListener) variable in the Activity
    this.listener = listener;
}
public void removeActivityResultListener(){
    listener = null;
}

在片段中实现界面:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(listener != null){
        listener.onActivityResult(requestCode, resultCode, data);
    }
}   

这会强制您覆盖public class WhateverFragment implements MyActivity.ActivityResultListener{ // .... } 方法。在活动获得结果时,您将收到结果,按照您的意愿行事。只剩下一步,将onActivityResult设置为WhateverFragment上的onAttach并将其移除onDetach方法。

onAttach方法:

((MyActivity)getActivity()).setActivityResultListener(this);

onDetach方法:

((MyActivity)getActivity()).removeActivityResultListener();

这已经动态写入,因此可能存在错误。

答案 1 :(得分:0)

理想情况下,您应该只使用支持库的Fragment,即android.support.v4.app.Fragment来实现向后兼容。

由于您正在使用片段适配器,它是支持库中可用的类,仅处理android.support.v4.app.Fragment,因此您必须使用支持库的片段。

您可以像android.support.v4.app.Fragment一样使用android.app.fragment正常工作。支持库也有onActivityResult方法,可以很容易地继承。

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }

答案 2 :(得分:0)

对于第一 - 如果您的应用需要支持api level 15,请使用 android.support.v4.app.Fragment 。 否则,如果您的最小api级别为17,则可以使用 android.app.Fragment

第二次 - 在你的Activity类 -

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case <requestCode>:
               ((FragmentOne)pageAdapter.getItem(0)).onActivityResult(requestCode, resultCode, data);
                break;
        }
    }

答案 3 :(得分:0)

第一个问题

如果我使用viewpager,Fragment必须是扩展导入android.support.v4.app.Fragment?

要使用FragmentPagerAdapterFragmentStatePagerAdapter

案例1:如果您将应用程序定位为低于17 android api级别,请使用支持库。 (android.app.Fragment中没有17个以下的childFragmentManager)

案例2:如果你的目标应用为17及以上的android api,那么使用android.app.Fragment。 (从api级别17及以上的childFragmentManager可用android.app.Fragment)

要使用PagerAdapter

您可以选择任何支持库或android.app.Fragment。

第二个问题

如果我必须扩展导入android.support.v4.app.Fragment,我怎么能使用onactivityresult?

查看此Answer