GetActivity (). StartActivityForResult () не работает в фрагментах

Я работаю во Фрагменте, в котором мне нужно выбрать изображение из галереи и установить его в imageView, но getActivity (). StartActivityForResult () теперь работает

Я уже проверил множество ссылок, но все говорят, что вызывать этот метод в родительской активности, но у меня нет родительской активности, поскольку этот фрагмент находится внутри другого фрагмента. Я тоже проверил эту ссылку

StartActivityForResult не работает в фрагменте

Вот мой код: –

Основной класс: –

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

Здесь находится Nested Fragment, откуда я должен изменить изображение: –

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

Пожалуйста, дайте мне знать, какую ошибку я здесь делаю ???

Обновить

Я SabaKuchHomeActivity и ProfileSettingFragment

Solutions Collecting From Web of "GetActivity (). StartActivityForResult () не работает в фрагментах"

Проблема в том, что вы реализуете onActivityResult в своем фрагменте и вызываете getActivity (). StartActivityForResult (…) . Поскольку вы запускаете Activity from Activity, вызов метода onActivityResult (…) переходит к Activity, который запускает новую активность.

Итак, все, что вам нужно сделать, это удалить часть getActivity (), и ваш onActivityResult (…) будет вызван в вашем фрагменте!

EDIT: Как вы можете видеть из GrepCode, код в startActivityForResult от Fragment отличается от startActivityForResult Activity . Это не случайно.

Вы не должны использовать

 getActivity().startActivityForResult(...) 

Просто используйте

 startActivityForResult(...) 

Таким образом onActivityResult в вашем фрагменте.

Это подробно обсуждается здесь и размещается здесь в блоге, и здесь есть отчет об ошибке.

Краткая версия: это разбито для вложенных фрагментов, и вам нужно написать собственное обходное решение.

Мое предложение было бы в вызове фрагмента вашего ребенка:

 getParentFragment().startActivityForResult(....) 

И в вашем родительском фрагменте переопределите onActivityResult и повторите вызов ваших дочерних фрагментов:

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

Удалить

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

В вашей деятельности и первом фрагменте и поддерживайте это в своем вложенном фрагменте

И даже если это не сработало, пропустите свой экземпляр активности, а intializing фрагмент –

 fragment = new ProfileSettingFragment(activity); 

И создайте конструктор по фрагменту, что вы используете с экземпляром активности, а затем вы можете вызвать onActivityResult в основном действии и можете получить форму данных этой активности, когда вы передаете ссылку на активность при инициализации вашего фрагмента.

Вы можете создать интерфейс, в котором метод будет возвращать строку, и, реализуя это в своей деятельности, вы можете получать данные до того места, где доступно ваше обращение к действию.

Попробуйте, Когда вы вызываете startActivityForResult (), onActivityResult () Activity сначала вызывается, тогда вызывается onActivityResult () его фрагмента, но этот вызов не предоставляется вложенному фрагменту. Таким образом, в 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 () будет выглядеть примерно так: попробуйте получить фрагмент из фрагментатора или с помощью вашего 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; } 

По какой-то причине, когда вы запускаетеActivityForResult из

 android.support.v4.app.Fragment 

Не будет работать, он перейдет к вашей деятельности onActivityResult. Если вы используете

 android.app.Fragment 

Он будет работать и вернуться к вашему onActivityResult во Фрагменте.

Хотя я не тестировал ваш код. Я пишу этот ответ от моего имени.

 getActivity.startActivityForResult(...) 

Должен вызвать Activity onActivityResult.

 getParentFragment().onActivityResult(...) 

Должен вызвать onActivityResult в вашем родительском фрагменте.

А также

 this.onActivityResult(...) 

Должен вызывать ваш текущий фрагмент onActivityResult ().

Вы можете попробовать это ключевое слово, как упомянуто здесь. Если вы все еще сталкиваетесь с проблемой, дайте мне знать, что я буду использовать образец кода на GIT

попробуй это:

 getContext().getApplicationContext.startActivityforResult(); 

Переопределить onActivityResult в вашем использовании SabaKuchHomeActivity

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

Используйте getParentFragment (), если вы используете пользовательский фрагмент или / или viewpager, иначе igonre / remove getParentFragment ()

Простое решение просто вызовет только startActivityForResult(/* … */) и onActivityResult(/* … */) в вашем фрагменте. Я обычно использую это.

Мы также можем реализовать onActivityResult() в вашем фрагменте.

Так дорого для вашего кода, просто удалите getActivity. Из getActivity.startActivityForResult(...) то он вызывает onActivityResult() вашего фрагмента. Для получения дополнительной информации см. Эту ссылку . Наслаждайся своим кодом 🙂

Это стало более длинным кодом, я просто сделаю краткое пошаговое руководство – (с его щедрости), и все. Здесь используется 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> 

Все, что я сделал, чтобы заставить его работать, – создать interface под названием ActivityResHan который просто имел метод initiate(String fragmentTag); ( Мои имена бедны – я знаю ), логика заключалась в том, чтобы иметь мой прямой Fragment – ( фрагмент, содержащий просмотрщик или ребенок, который предал и имеет детей ) реализует этот interface ActivityResHan

 class ViewPagerFragment extends Fragment implements ActivityResHan{ 

startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); должен был вызвать 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); } 

Этот onActivityResult direct-Fragment проверяет, является ли calleer пустым – ( я надеюсь, что вы уже встретились с каллером ), если его нет, то он вызывает onActivityResult для своих детей, и он распознает своих детей с помощью Tag через FragmentManager.findFragmentByTag(); Вот где приходит calleer

И теперь Every Child of the direct-Fragment , когда ему нужно запустить действие для результата, просто находит direct-Fragment по Tag – ( viewpageframent ), а затем отбрасывает этот Fragment на ActivityResHan и вызывает 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); } } } 

Надеюсь, поможет.

В вашем фрагменте переопределите этот метод

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

И сохраните переменную активности как члена вашего класса. Таким образом, вы всегда будете получать правильную деятельность, предоставляемую системой.