【问题标题】:getActivity().startActivityForResult() is not working in fragmentsgetActivity().startActivityForResult() 在片段中不起作用
【发布时间】:2015-10-21 10:21:28
【问题描述】:

我在 Fragment 中工作,我需要从中选择一个图像 图库并​​将其设置为 imageView 但 getActivity().startActivityForResult() 现在可以工作了

我已经检查了很多链接,但都说调用这个 父活动中的方法,但我没有任何父活动 片段在另一个片段中。我也检查了这个链接

startActivityForResult is not working in Fragment

这是我的代码:-

MainActivity 类:-

public class SabaKuchHomeActivity extends FragmentActivity {

private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;

// nav drawer title
private CharSequence mDrawerTitle;

// used to store app title
private CharSequence mTitle;

// slide menu items
private String[] navMenuTitles;
private TypedArray navMenuIcons;

private ArrayList<NavDrawerItem> navDrawerItems=new ArrayList<NavDrawerItem>();
private NavDrawerListAdapter adapter;

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setContentView(R.layout.home_activity);
    mTitle = mDrawerTitle = getTitle();


    // load slide menu items
    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

    // nav drawer icons from resources
    navMenuIcons = getResources()
            .obtainTypedArray(R.array.nav_drawer_icons);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

    // adding nav drawer items to array
            // Home
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
            // Find People
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
            // Photos
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
            // Communities, Will add a counter here
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
            // Pages
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
            // What's hot, We  will add a counter here
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons.getResourceId(6, -1)));

            // Recycle the typed array
            navMenuIcons.recycle();

            mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

            // setting the nav drawer list adapter
            adapter = new NavDrawerListAdapter(getApplicationContext(),
                    navDrawerItems);
            mDrawerList.setAdapter(adapter);

            // enabling action bar app icon and behaving it as toggle button
            getActionBar().setDisplayHomeAsUpEnabled(true);
            getActionBar().setHomeButtonEnabled(true);
            //getActionBar().setDisplayShowHomeEnabled(false);


            mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                    R.drawable.ic_drawer, //nav menu toggle icon
                    R.string.app_name, // nav drawer open - description for accessibility
                    R.string.app_name // nav drawer close - description for accessibility
            ) {
                @TargetApi(Build.VERSION_CODES.HONEYCOMB)
                public void onDrawerClosed(View view) {
                    getActionBar().setTitle(mTitle);
                    //getActionBar().show();
                    // calling onPrepareOptionsMenu() to show action bar icons
                    invalidateOptionsMenu();
                }

                public void onDrawerOpened(View drawerView) {
                    getActionBar().setTitle(mDrawerTitle);
                    // calling onPrepareOptionsMenu() to hide action bar icons
                    //getActionBar().hide();
                    invalidateOptionsMenu();
                }
            };
            mDrawerLayout.setDrawerListener(mDrawerToggle);

            if (savedInstanceState == null) {
                // on first time display view for first nav item
                displayView(0);
            }
        }

        /**
         * Slide menu item click listener
         * */
        private class SlideMenuClickListener implements
                ListView.OnItemClickListener {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                // display view for selected nav drawer item
                displayView(position);
            }
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // toggle nav drawer on selecting action bar app icon/title
            if (mDrawerToggle.onOptionsItemSelected(item)) {
                return true;
            }
            // Handle action bar actions click
            switch (item.getItemId()) {
            case R.id.action_search:

                Intent TrendIntent = new Intent(SabaKuchHomeActivity.this,TrendsActivity.class);
                startActivity(TrendIntent);

                return true;
            default:
                return super.onOptionsItemSelected(item);
            }
        }

        /* *
         * Called when invalidateOptionsMenu() is triggered
         */
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
            // if nav drawer is opened, hide the action items
            boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
            menu.findItem(R.id.action_search).setVisible(!drawerOpen);
            return super.onPrepareOptionsMenu(menu);
        }

        /**
         * Diplaying fragment view for selected nav drawer list item
         * */


@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
private void displayView(int position) {
    // update the main content by replacing fragments
    android.support.v4.app.Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new OzoneFragment();
        break;
    case 1:
        fragment = new MyZoneFragment();
        break;
    case 2:
        fragment = new BizZoneFragment();
        break;
    case 3:
        fragment = new EventsFragment();
        break;
    case 4:
        fragment = new PrivacySettingFragment();
        break;
    case 5:
        fragment = new ProfileSettingFragment(); ***This is the fragment where I am moving now***
        break;

    case 6:

        AppContoller.getInstance().pref=getSharedPreferences(AppContoller.getInstance().PREF_NAME, 0);
        Editor editer=AppContoller.getInstance().pref.edit();
        editer.putString(AppContoller.getInstance().USER_ID, "0");
        editer.commit();

        finish();

        break ;

    default:
        break;
    }

    if (fragment != null) {
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();

        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    getActionBar().setTitle(mTitle);
}

/**
 * When using the ActionBarDrawerToggle, you must call it during
 * onPostCreate() and onConfigurationChanged()...
 */

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggls
    mDrawerToggle.onConfigurationChanged(newConfig);
}

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

}

这里是ProfileSettingFragment() 片段:-

 @SuppressLint("NewApi")
public class ProfileSettingFragment extends android.support.v4.app.Fragment implements TabListener {

private ViewPager mPager;
private MyPageAdapter adapter;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
         View rootView = inflater.inflate(R.layout.profile_setting_fragment, container, false);

         mPager=(ViewPager)rootView.findViewById(R.id.pager);

            mPager.setOffscreenPageLimit(5);
            adapter=new MyPageAdapter(getChildFragmentManager());
            mPager.setAdapter(adapter);


            TabPageIndicator indicater=(TabPageIndicator)rootView.findViewById(R.id.indicator1);
            indicater.setViewPager(mPager);

            indicater.setOnPageChangeListener(new OnPageChangeListener() {

                @Override
                public void onPageSelected(int arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onPageScrollStateChanged(int arg0) {
                    // TODO Auto-generated method stub

                }
            });

            /*mPager.setOnPageChangeListener(new OnPageChangeListener() {

                @Override
                public void onPageSelected(int position) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onPageScrollStateChanged(int arg0) {
                    // TODO Auto-generated method stub

                }
            });*/

            /*actionBar.addTab(actionBar.newTab().setText("Home").setTabListener(this));
            actionBar.addTab(actionBar.newTab().setText("MiZone").setTabListener(this));
            actionBar.addTab(actionBar.newTab().setText("Top Trending").setTabListener(this));
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);*/

            return rootView;
    }

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

    private class MyPageAdapter extends FragmentStatePagerAdapter
       {
            private List<android.support.v4.app.Fragment> fragments;

        public MyPageAdapter(FragmentManager fm) {
            super(fm);
            // TODO Auto-generated constructor stub
            this.fragments=new ArrayList<android.support.v4.app.Fragment>();
            fragments.add(new ProfileGeneralSetting());
            fragments.add(new ProfileOzoneSetting());
            fragments.add(new ProfileMyzoneSetting());
            fragments.add(new ProfileBizzoneSetting());
            fragments.add(new ProfilePasswordSetting());

        }

        @Override
        public android.support.v4.app.Fragment getItem(int arg0) {
            // TODO Auto-generated method stub
            return fragments.get(arg0);
        }

        @Override
        public CharSequence getPageTitle(int position) {
        // TODO Auto-generated method stub
             switch (position) {
                case 0:
                    return "General";
                case 1:
                    return "Ozone";
                case 2:
                    return "MyZone";
                case 3:
                    return "Biz Zone";
                case 4 :
                    return "Password Setting";
            }
             return null;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return fragments.size();
        }

       }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
        mPager.setCurrentItem(tab.getPosition());

    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

}

这是我必须更改图像的嵌套片段:-

public class ProfileOzoneSetting extends Fragment implements MiFeelingBase, OnClickListener{

 NetworkImageView genSetOzoneUserImage;

 private ArrayList<String>arrCategoryId=new ArrayList<String>();
 List<String> interestList = new ArrayList<String>();
 String[] interest;
 Boolean setImg ;


 private static final int SELECT_PICTURE = 1;
 private String selectedImagePath;


 Button SettingOzSave;
 private MultipartEntity reqEntity;

 String[] y ={""};


 private String strUserID;
 ImageLoader imageLoader = AppContoller.getInstance().getImageLoader();

 OzoneSettingData ozSettingList = new OzoneSettingData();

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View rootView = inflater.inflate(R.layout.profiesettingozone, container, false);


    genSetOzoneUserImage = (NetworkImageView)rootView.findViewById(R.id.genSetOzoneUserImage);

    SettingOzSave = (Button)rootView.findViewById(R.id.SettingOzSave);

    SettingOzSave.setOnClickListener(this);

    genSetOzoneUserImage.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            Log.d("first time", "before method");

            Intent intent  = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
        //startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);

            Log.d("first time", "before method11");
            //startActivityForResult(intent, SELECT_PICTURE);
            getParentFragment().startActivityForResult(intent, SELECT_PICTURE);
            //startActivityForResult(intent, SELECT_PICTURE);
            //((SabaKuchHomeActivity)getActivity()).startActivitForResult(intent, SELECT_PICTURE);
            //getContext().getApplicationContext.startActivityforResult(intent, SELECT_PICTURE);
            //fragment.getApplicationContext.startActivityforResult(intent, SELECT_PICTURE);
            //getActivity().startActivityForResult(intent, SELECT_PICTURE);
            //startActivityForResult(intent, SELECT_PICTURE);
            //((SabaKuchHomeActivity)getActivity()).startActivitForResult(intent, SELECT_PICTURE);

            Log.d("first time", "before method22");

        }
    });


    APIAccess.fetchData(ProfileOzoneSetting.this, getActivity(), getActivity());
    return rootView;
}
@Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {


    Log.d("first time", "before method33");
      super.onActivityResult(requestCode, resultCode, data);

        Log.d("first time", "before method44");

        if (requestCode == SELECT_PICTURE && resultCode ==Activity.RESULT_OK && null != data) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

            Cursor cursor = getActivity().getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
            genSetOzoneUserImage.setImageBitmap(BitmapFactory.decodeFile(picturePath));

            setImg = true;
         }
          }

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
     AppContoller.getInstance().pref=getActivity().getSharedPreferences(AppContoller.getInstance().PREF_NAME, 0);



@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
}

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = getActivity().managedQuery(uri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

请让我知道我在这里犯了什么错误???

更新

我确实更新了SabaKuchHomeActivityProfileSettingFragment

【问题讨论】:

  • 只需在 Log onClick of your button 中打印一些内容
  • 尝试将您的getActivity() 投射到父活动中。例如((YourActivityClasss)getActivity()).startActivitForResult();
  • 看@vilpe89的回答
  • @Devraj 甚至父片段也来自您调用的位置。它应该是 Activity 或 Fragment Activity.There 覆盖 OnActvityResult
  • @Elltz 是的,当然......即使我也在尝试这样做,但因为我做了这么多编码而感到困惑,现在我的大脑被阻塞了...... lolzz.. 请给我一些演示.这将非常有帮助。 :)

标签: android android-fragments imageview


【解决方案1】:

问题是您在 Fragment 中实现 onActivityResult 并调用 getActivity().startActivityForResult(...)。因为您是从 Activity 启动 Activity,所以 onActivityResult(...) 方法调用会转到启动新 Activity 的 Activity。

所以您需要做的就是删除 getActivity() 部分,您的 onActivityResult(...) 将在您的 Fragment 中被调用!

编辑: 从GrepCode可以看出,FragmentstartActivityForResult中的代码与ActivitystartActivityForResult不同。这肯定不是巧合……

【讨论】:

  • 好的,那么问题出在其他地方......当您删除 getActivity() 部分时,您是否尝试过将日志记录或断点用于调试 onActivityResult 方法?删除 getActivity() 部分并在 if (resultCode == Activity.RESULT_OK) { 代码行之前放置一些内容。我认为 resultCode 不是 Activity.RESULT_OK :)
  • 确保调用停止的一种方法是将 onActivityResult 也放入您的 Activity 和父 Fragment 中,然后将一些日志代码放在那里并观察会发生什么!
  • 是的,我也试过这个......还根据你的建议更新了我的问题
  • 我没有任何活动或 fragmentActivity 来保存这个片段。也是持有这个fragment的fragment。
  • 每个 UI 组件都包含在一个活动中
【解决方案2】:

你不应该使用

getActivity().startActivityForResult(...)

简单使用

startActivityForResult(...)

这样会调用片段中的onActivityResult

【讨论】:

  • 我不明白为什么这个答案应该被认为是错误的。点赞。
【解决方案3】:

这在here 进行了详细讨论,并在博客中提到了here,还有一个关于它的错误报告here

简短的版本是:这对于嵌套片段来说是错误的,您必须编写自己的解决方法。

我的建议是在您的子片段调用中:

getParentFragment().startActivityForResult(....)

并在您的父 Fragment 中覆盖 onActivityResult 并重播对您的子 Fragment 的调用:

...
for (Fragment child : getChildFragmentManager().getFragments()) {
   child.onActivityResult(requestCode, resultCode, data);
}
...

【讨论】:

    【解决方案4】:

    删除

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

    在您的活动和第一个片段中,并在您的嵌套片段中维护它

    即使没有工作,在将片段初始化为时传递您的活动实例

    fragment = new ProfileSettingFragment(activity);
    

    并在片段中创建一个构造函数,您使用的是活动实例 然后您可以在主活动中调用 onActivityResult 并在初始化片段时传递活动引用时从该活动中获取数据。

    您可以创建一个接口,该接口有一个方法将返回一个字符串,并通过在您的活动中实现该方法,您可以通过活动参考可用的位置接收数据。

    【讨论】:

    • 我会试试这个并告诉你.. :)
    【解决方案5】:

    试一试, 当您调用 startActivityForResult() 时,首先调用 Activity 的 onActivityResult(),然后调用其 Fragment 的 onActivityResult(),但不会将此调用提供给嵌套的 Fragment。因此,在片段的 onActivityResult() 中,您必须以某种方式获取当前加载的片段,如果需要对其进行类型转换,然后调用写入其中的方法,您将获得 OnActivityResult() 的任何内容传递给该方法。

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
    
      // notifying nested fragments (support library bug fix)
      final FragmentManager childFragmentManager = getChildFragmentManager();
    
      if (childFragmentManager != null) {
        final List < Fragment > nestedFragments = childFragmentManager.getFragments();
    
        if (nestedFragments == null || nestedFragments.size() == 0) return;
    
        for (Fragment childFragment: nestedFragments) {
          if (childFragment != null && !childFragment.isDetached() && !childFragment.isRemoving()) {
            childFragment.onActivityResult(requestCode, resultCode, data);
          }
        }
      }
    }
    

    片段的 onActivityResult() 中的代码看起来像, 尝试从 fragmentManager 或在 viewPagerAdapter 的帮助下获取片段 也尝试调用 startActivityForResult 为,

    fragment.getParentFragment().startActivityForResult();
    

    而不是

    fragment.startActivityForResult();
    

    把它放在你的外部片段中以访问当前加载的片段,

    MyFragment myFragment = (MyFragment)pagerAdapter.getCurrentFragment();
    myFragment.myMethod();
    

    适配器中的以下代码将返回当前加载的片段,请记住以下内容仅供您理解,请在您的代码中相应地使用它

    Fragment fragment;
    
    @Override
    public Fragment getItem(int index) {
        fragment = new FragFilter();
        return fragment;
    }
    
    public Fragment getCurrentFragment() {
        return this.fragment;
    }
    

    【讨论】:

    • 你放这个了吗? fragment.getParentFragment().startActivityForResult();而不是 fragment.startActivityForResult();
    • 是的,我试过了......它开始在“片段”上给出错误“片段无法解析”。并要求更改 Fragment(support.android.v4.app)。当我更改它时,它会在整行中给出错误..“无法从类型 Fragment 对非静态方法 getParentFragment() 进行静态引用”
    • 尝试从 pagerAdapter 获取片段,然后对其进行类型转换并调用它的方法
    • 很抱歉,我无法从 pagerAdapter 分片,请告诉我,
    【解决方案6】:

    由于某种原因,当您从

    启动ActivityForResult 时
    android.support.v4.app.Fragment
    

    不会工作,它将转到您的活动 onActivityResult。如果你使用

    android.app.Fragment
    

    它将起作用并返回到您在 Fragment 中的 onActivityResult。

    【讨论】:

    • Jason,谢谢你的努力,也许你是对的,但我无法将 v4.app.fragment 更改为 android.app.fragment 因为我使用的是使用 v4 支持库的 viewPager,如果我替换这个,我在所有片段对象、类、构造函数等中都遇到错误。请帮我解决这个问题。
    • 如果您需要 v4 片段,我在我的一个项目中所做的是;所有片段都扩展了 BaseFragment 并且 base 有一个名为 onResult 的函数。因此,现在当在 Activity 中调用 onResut 时,将信息传递给片段中的这个函数 onResult,您唯一需要的是在每个单独的片段中 @override 这个函数。
    • 杰森,请检查我更新的问题。我也添加了我的主要活动课程。
    【解决方案7】:

    虽然我没有测试你的代码。 我代表我写这个答案。

    getActivity.startActivityForResult(...)
    

    应该在ActivityResult上调用Activity。

    getParentFragment().onActivityResult(...)
    

    应该在你的父片段中调用 onActivityResult。

    还有

    this.onActivityResult(...)
    

    应该调用你当前的片段 onActivityResult() 方法。

    您可以尝试这里提到的这些关键字。如果您仍然遇到问题,请告诉我,我将在 GIT 上提供代码示例

    【讨论】:

    • 请测试我的代码,可能还有其他问题。因为我几乎尝试了 Stack 上的所有方法。
    • @Devraj 让我检查您的代码一次。那我更新一下
    【解决方案8】:

    试试这个:

    getContext().getApplicationContext.startActivityforResult();
    

    【讨论】:

    • 要求在类中创建一个方法 'getContext()'。在创建之后,'getApplicationContext' 给出错误“getApplicationContext 无法解析或不是字段”
    • @Devraj 你也可以使用v.getApplicationContext.startActivityforResult();,实际使用(查看v)
    • heyi Milad,我真的很感谢你付出了 100%,但兄弟使用 v.getApplicationContext.startActivityforResult() 也给出了“getApplicationContext 无法解析或不是字段”的错误
    【解决方案9】:

    在您的SabaKuchHomeActivity 使用中覆盖onActivityResult

    public void dispatchTakePictureIntent() {
            final int TAKE_PHOTO_RESULT_CODE = 2345;
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (takePictureIntent
                    .resolveActivity(getActivity().getPackageManager()) != null)
                if (getParentFragment() != null)
                    getParentFragment().startActivityForResult(takePictureIntent, TAKE_PHOTO_RESULT_CODE);
                else
                    startActivityForResult(takePictureIntent, TAKE_PHOTO_RESULT_CODE);
        }
    
        public void dispatchChoosePictureIntent() {
            final int CHOOSE_PHOTO_RESULT_CODE = 1234;
            Intent intent = new Intent(Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            intent.setType("image/*");
            if (getParentFragment() != null)
                getParentFragment().startActivityForResult(Intent.createChooser(intent, "Choose Picture"),
                        CHOOSE_PHOTO_RESULT_CODE);
            else
                startActivityForResult(Intent.createChooser(intent, "Choose Picture"),
                        CHOOSE_PHOTO_RESULT_CODE);
        }
    

    如果您正在使用自定义片段或/和 viewpager,请使用 getParentFragment(),否则请使用 getParentFragment()

    【讨论】:

    • 为什么要在一个类中创建 dispatchChoosePictureIntent() 两次????
    • 仔细阅读代码,一种是抓图,另一种是从图库中选择
    • 是的...我在发表评论几秒钟后才知道。我的问题是,我尝试了 getParentFragment() 但它没有改变。以及如何在 SabaKuchHomeActivity 中覆盖 onActivityResult()。你能在我的代码中进行更改吗??
    • 我确实更新了您的问题,运行您的项目,在您的活动和片段内的 onActivityResult 中添加断点,然后看看会发生什么
    • 在您的代码中插入上述方法并调用其中任何一个,
    【解决方案10】:

    简单的解决方案只需调用startActivityForResult(/* … */) 并且您的片段中的onActivityResult(/* … */) 将被调用。我经常用这个。

    【讨论】:

    • 这不是片段好友,这是嵌套片段。 :)
    【解决方案11】:

    我们也可以在你的 Fragment 中实现onActivityResult()

    您的代码如此珍贵,只需从getActivity.startActivityForResult(...) 中删除getActivity.,然后它将调用您片段的onActivityResult()。 有关更多信息,请参阅此link。 享受你的代码:)

    【讨论】:

    • 这是我在这里发布问题之前尝试的第一件事......:P 不工作兄弟......我在 logcat 中也没有错误,但有一个警告“活动结果片段索引超出范围:0x20001"
    【解决方案12】:

    它变成了一个更长的代码,我将做一个简短的演练-(因为它是一个赏金),仅此而已。这是我使用的xml。其余的java

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res/rumorsapp.ghaweek"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="rumorsapp.ghaweek.MainActivity" >
    
    <android.support.design.widget.TabLayout
        android:id="@+id/tablayou"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:background="#ff9900"
        android:minHeight="50dp"
        app:tabIndicatorColor="#f09"
        app:tabMode="scrollable"
        app:tabPadding="10dp"
        app:tabSelectedTextColor="#004"
        app:tabTextColor="#fff" >
    </android.support.design.widget.TabLayout>
    
    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_marginTop="2dp"
        android:layout_below="@+id/tablayou"
        android:layout_height="match_parent"/>
    </RelativeLayout>
    

    我所做的只是创建一个名为 ActivityResHaninterface,它只是有一个名为 initiate(String fragmentTag); 的方法(我的名字很差 - 我知道)逻辑是让我的直接Fragment -(包含查看器或通奸并有孩子的孩子的片段)实现这个ActivityResHaninterface

    class ViewPagerFragment extends Fragment implements ActivityResHan{
    

    这将调用startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); 从内容提供者那里检索联系人。

    @Override
        public void initiate(String fragmentTag) {
            calleer = fragmentTag; //this calleer saves the tag
            Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
            pickContactIntent.setType(Phone.CONTENT_TYPE);
            startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
        }
    

    这个direct-FragmentonActivityResult 检查calleer 是否为空-(我希望你已经见过调用者)如果不是,那么它会为他/她调用onActivityResult孩子,它通过Tag识别它的孩子,通过FragmentManager.findFragmentByTag();这就是calleer进来的地方

    现在direct-Fragment 的每个孩子,当它需要为结果启动一个活动时,只需通过Tag -(viewpageframent) 找到direct-Fragment,然后投射FragmentActivityResHan 并致电initiate(fragmentTag);

    ((ActivityResHan)getActivity().getSupportFragmentManager().
                                findFragmentByTag("viewpageframent")).initiate(getTag());
    

    剩下的代码让这一切都发生了

    import android.content.Intent;
    import android.graphics.Color;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.ContactsContract.CommonDataKinds.Phone;
    import android.support.annotation.Nullable;
    import android.support.design.widget.TabLayout;
    import android.support.design.widget.TabLayout.OnTabSelectedListener;
    import android.support.design.widget.TabLayout.Tab;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.FrameLayout;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    /*
     *  FOr simplicity i added compacted classes, but the idea is, it is suppose
     *  to work even if you have separate clases. you may even reslove to getting
     *  rid of the interface, and using request code, as the tag. so you can 
     *  identify them there.
     */
    
    //i am in my separate class
    interface ActivityResHan{
    
        void initiate(String fragmentTag);
    }
    //i am in my separate class
    public class MainActivity extends AppCompatActivity {
    
    String ANDROID_PAGER_TAG_REFERER = "android:switcher:2131296359:";
    ViewPager mViewPager;
    TabLayout tabl;
    FrameLayout fl;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fl = new FrameLayout(this);
        fl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.MATCH_PARENT));
        fl.setId(2);
        setContentView(fl);
        getSupportFragmentManager().beginTransaction().
        add(2,new ViewPagerFragment(), "viewpageframent").commit();
    
    }
    
    //i am in my separate class
    private class ViewPagerFragment extends Fragment implements ActivityResHan{
        static final int PICK_CONTACT_REQUEST = 1; 
        String calleer = "";
    
        @Override
        @Nullable
        public View onCreateView(LayoutInflater inflater,
                @Nullable ViewGroup container,
                @Nullable Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            return inflater.inflate(R.layout.activity_main, null);
        }
    
        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onViewCreated(view, savedInstanceState);
            tabl = (TabLayout) view.findViewById(R.id.tablayou);
            mViewPager = (ViewPager) view.findViewById(R.id.pager);
            tabl.setTabsFromPagerAdapter(new FragmentPAdapt());
            mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabl));
    
            tabl.setOnTabSelectedListener(new OnTabSelectedListener() {
    
                @Override
                public void onTabUnselected(Tab arg0) {
    
                }
    
                @Override
                public void onTabSelected(Tab arg0) {
                    mViewPager.setCurrentItem(arg0.getPosition());
                }
    
                @Override
                public void onTabReselected(Tab arg0) {
    
                }
            });
        }
    
        @Override
        public void initiate(String fragmentTag) {
            calleer = fragmentTag;
            Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
            pickContactIntent.setType(Phone.CONTENT_TYPE);
            startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode,
                Intent data) {
            if(!calleer.isEmpty()){
                Fragment fg =getSupportFragmentManager().findFragmentByTag(calleer);
                fg.onActivityResult(requestCode, resultCode, data);
                calleer = "";
            }else{
                //run my own shit
                super.onActivityResult(requestCode, resultCode, data);
            }
        }
    
    }
    //i am in my separate class
    private class FragmentPAdapt extends FragmentPagerAdapter{
    
        private class Thefrag extends Fragment{
            TextView t;
            public Thefrag() {
                super();
            }
            @Override
            @Nullable
            public View onCreateView(LayoutInflater inflater,
                    @Nullable ViewGroup container,
                    @Nullable Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                LinearLayout v = new LinearLayout(MainActivity.this);
                v.setBackgroundColor(Color.WHITE);
                t = new TextView(MainActivity.this);
                LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.MATCH_PARENT, 
                        LinearLayout.LayoutParams.MATCH_PARENT);
                lp.gravity = Gravity.CENTER_VERTICAL|Gravity.FILL_VERTICAL;
                t.setLayoutParams(lp);
                t.setText("         This is frag " +getTag().subSequence(
                        getTag().length()-1,
                        getTag().length()));
                t.setTextSize(15f);
                v.setClickable(true);
                v.setOnClickListener(new OnClickListener() {
    
                    @Override
                    public void onClick(View arg0) {
                        ((ActivityResHan)getActivity().getSupportFragmentManager().
                                findFragmentByTag("viewpageframent")).initiate(getTag());
                    }
                });
                v.addView(t);
                return v;
            }
    
            @Override
            public void onActivityResult(int requestCode, int resultCode,
                    Intent data) {
                // TODO Auto-generated method stub
                t.setText("               Contact uri is = " + data.getDataString());
                super.onActivityResult(requestCode, resultCode, data);
            }
        }
    
        public FragmentPAdapt() {
            super(getSupportFragmentManager());
            mViewPager.setAdapter(this);
        }
    
        @Override
        public Fragment getItem(int arg0) {
            Fragment f = getSupportFragmentManager().findFragmentByTag(
                    ANDROID_PAGER_TAG_REFERER + String.valueOf(arg0));
            if(f == null){
                return new Thefrag();
            }
            return f;
        }
    
        @Override
        public int getCount() {         
            return 10;
        }
        @Override
        public CharSequence getPageTitle(int position) {
            return "FRAGMENT "+String.valueOf(position);
        }
     }
    
    }
    

    希望对你有帮助。

    【讨论】:

    • 对不起兄弟,我等了你这么久,然后我就订婚了。我会检查你的过程,别担心,如果它有效,我会重新启动赏金并确定给你。 :)
    【解决方案13】:
    In Kotlin
    
    In Activity :-
    
    private var fragment: Fragment? = null
    
     override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.fragment_activity)
    
        fragment = Fragment()
    
     }
    
     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
    
        fragment?.onActivityResult(requestCode, resultCode, data)
    }
    
    In Fragment :- 
    
    button.setOnClickListener {
    
    activity?.startActivityForResult(Intent(parentActivity,
                    SecondActivity::class.java), REQUEST_CODE)
    
    }
    
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
    
        val string = data?.getStringExtra("SELECTED_NAME")
        Log.e("Name", "$string")
    }
    
    In SecondActivity :- 
    
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
    
        when (item.itemId) {
            android.R.id.home -> finish()
    
            R.id.action_filter_apply -> {
                val intent = Intent()
                intent.putExtra("SELECTED_NAME", "Android")
                setResult(Activity.RESULT_OK, intent)
                finish()
            }
        }
    
        return super.onOptionsItemSelected(item)
    }
     
    

    【讨论】:

    • 天啊,仍在尝试回答 5 年前的问题。希望您没有正确阅读问题。我没有使用 2 个活动。这是Activity-->Fragment-->ChildFragment的场景。我想在 ChildFragment 中获取实例。
    【解决方案14】:

    在您的片段中覆盖此方法

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }
    

    并将活动变量存储为类的成员。 这样,您将始终获得系统提供的正确活动。

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 1970-01-01
      • 2014-05-11
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      相关资源
      最近更新 更多