【问题标题】:How I can override onactivityresult method on nested fragment?如何在嵌套片段上覆盖 onactivityresult 方法?
【发布时间】:2017-02-02 08:42:42
【问题描述】:

我用的是fragment,不是这个,import android.app.Fragment

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

因为我用它来查看页面

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 扩展了 import android.support.v4.app.Fragment 所以不是错误,但 FragmentTwo extends import android.app.Fragment 所以它会发生错误

所以我有两个问题

  1. 如果我使用viewpager,Fragment必须是extends import android.support.v4.app.Fragment?

  2. 如果我必须扩展 import android.support.v4.app.Fragment,我该如何使用 onactivityresult?

【问题讨论】:

  • @AnuragSingh 我想在 FragmentOne 中通过 startActivityResult 调用 Activity 但 FragmentOne 无法覆盖方法 onactivityresult
  • 抱歉,我隐藏了方法,所以我找不到它抱歉

标签: android android-viewpager fragment


【解决方案1】:

您只能在应用中使用这两个库之一,如果您想要旧版支持,请添加 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);
    }
}   

在你的 Fragment 中实现接口:

public class WhateverFragment implements MyActivity.ActivityResultListener{
    // ....
}

这会强制您覆盖 onActivityResult 方法。当 Activity 得到结果时,你会收到结果,做你想做的事。仅剩一步,将您的WhateverFragment 设置为onAttach 上的侦听器,并在onDetach 方法上将其删除。

onAttach方法:

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

onDetach方法:

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

这是即时编写的,因此可能存在错误。

【讨论】:

    【解决方案2】:

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

    由于您使用的是支持库中可用的类 Fragment Adapter,并且仅处理 android.support.v4.app.Fragment,因此您必须使用支持库的片段。

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

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

    【讨论】:

    • 我也认为,但不是自动完成方法,而不是覆盖
    【解决方案3】:

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

    对于第二个- 在你的活动课上-

    @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;
            }
        }
    

    【讨论】:

      【解决方案4】:

      第一个问题

      如果我使用 viewpager,Fragment 必须是 extends import android.support.v4.app.Fragment?

      为了使用FragmentPagerAdapterFragmentStatePagerAdapter

      案例 1:如果您的应用程序的目标是低于 17 的 android api 级别,则使用支持库。 (17以下childFragmentManager在android.app.Fragment中不可用)

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

      为了使用PagerAdapter

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

      第二个问题

      如果我必须扩展 import android.support.v4.app.Fragment,我该如何使用 onactivityresult?

      查看此Answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-28
        • 2011-02-05
        • 2013-05-19
        相关资源
        最近更新 更多