Can't write onActivityResult function inside fragment class

459 views Asked by At

I have been trying to pick an image from galley and set it to an ImageView. I am successful in going to gallery and picking the image but can't set it to the ImageView. Actually, I can't write the OnActivityResult inside the Fragment class i have written. Below is the code of the class.

public class MainActivity extends FragmentActivity {

// create object of FragmentPagerAdapter
SectionsPagerAdapter mSectionsPagerAdapter;
String imgDecodableString;
ImageView callerPic;// = (ImageView) findViewById(R.id.callerPic);
// viewpager to display pages
ViewPager mViewPager;
final static int cameraData = 0;
private static int RESULT_LOAD_IMG = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.slideview_fragment);

    // Create the adapter that will return a fragment for each of the five
    // primary sections of the app.
    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

}

/**
 * A FragmentPagerAdapter that returns a fragment corresponding to one of
 * the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a DummySectionFragment (defined as a static inner class
        // below) with the page number as its lone argument.

        switch (position + 1) {
            case 1:

                Fragment fragment1 = new Fragment1();
                return fragment1;
            case 2:

                Fragment fragment2 = new Fragment2();
                return fragment2;


            default:
                Fragment fragment = new Fragment1();
                return fragment;
        }
    }

    @Override
    public int getCount() {
        // Show 5 total pages.
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Fake CALL";
            case 1:
                return "Fake SMS";

        }
        return null;
    }
}



public static class Fragment1 extends Fragment {


    public Fragment1() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


        View view = inflater.inflate(R.layout.activity_main, container, false);
//THIS PART OF THE CODE I AM HAVING TROUBLE WITH
        ImageView callerPic = (ImageView) view.findViewById(R.id.callerPic);
        callerPic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent galleryIntent = new Intent(Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                // Start the Intent
                startActivityForResult(galleryIntent, RESULT_LOAD_IMG);

            }
        });

        return view;

    }
}

public static class Fragment2 extends Fragment {

    public Fragment2() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.activity_main2, container, false);

        return view;
    }
 }
}

I have to write the onActivityResult method inside the Fragment1 class but I am not able to write inside it.

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        // When an Image is picked
        if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK
                && null != data) {
            // Get the Image from data

            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

            // Get the cursor
            Cursor cursor = getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            // Move to first row
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            imgDecodableString = cursor.getString(columnIndex);
            cursor.close();

            // Set the Image in ImageView after decoding the String
            callerPic.setImageBitmap(BitmapFactory
                    .decodeFile(imgDecodableString));

        } else {
            Toast.makeText(this, "You haven't picked Image",
                    Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {
        Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
                .show();
    }

}

Can anyone help in fixing this? Thanks.

1

There are 1 answers

0
Diolor On BEST ANSWER

It's generally a good pattern to keep your views separately in Fragments and Activities and not "cross-use" them.

As NilayDani commented above you can do:

getActivity().startActivityForResult(galleryIntent, RESULT_LOAD_IMG);

And the .onActivityResult can be used in your Activity.

However be wary that when you use Fragments views i.e. the ImageView callerPic to make sure that this view is available and the fragment has been created and is active. This can easily lead to crashes if you don't pay attention over the Activity-Fragment lifecycle.

As an advice try to keep your callerPic interacting only into Fragment, if possible of course.