I am working in Fragment in which I need to select an image from gallery and set it to an imageView but getActivity().startActivityForResult() is now working
I have already checked many Links but all are saying that call this method in parent activity but I dont have any parent activity as this fragment is inside a another fragment. I have checked this link too
startActivityForResult is not working in Fragment
Here is my code :-
MainActivity Class:-
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);
}
}
here is
ProfileSettingFragment()
fragment :-
@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
}
}
here is Nested Fragment from where I have to change the image :-
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);
}
Please let me know what mistake I am doing here???
Update
I did update SabaKuchHomeActivity
and ProfileSettingFragment
The problem is that you are implementing onActivityResult in your Fragment and calling getActivity().startActivityForResult(...). Because you are launching Activity from Activity, the onActivityResult(...) method call goes to the Activity that launches new Activity.
So all you need to do is remove the getActivity() part and your onActivityResult(...) will be called in your Fragment!
EDIT: As you can see from GrepCode, the code in Fragment's startActivityForResult is different from Activity's startActivityForResult. That sure ain't coincidence....
You should not use
getActivity().startActivityForResult(...)
Simply use
startActivityForResult(...)
This way the onActivityResult
in your fragment will be called.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With