Mr Nice
Mr Nice

Reputation: 524

Fragment tab viewpager issue

I have a fragment with view pager and three tab like "FragmentOne" "FragmentTwo" etc.

In Each fragment(page) I want to set the image from gallery or from camera.But when I set image(bitmap) in FragmentOne Tab The Bitmap is also displayed in Other fragment. But i want unique selected image should be displayed in Imageview of respective Fragment.

My ViewPager class looks like.

public class MainFragment extends Fragment {
private ViewPager mViewPager;
private SlidingTabLayout mSlidingTabLayout;

// Tabs titles
private String[] tabsTitles = {"One", "Two", "Three"};




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

    View rootView = inflater.inflate(R.layout.new_proj_frag_layout, container, false);
    // ViewPager
    mViewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
    mViewPager.setOffscreenPageLimit(3);
    mViewPager.setAdapter(new ViewPagerAdapter(getChildFragmentManager(), tabsTitles));

    // Sliding tab layout
    mSlidingTabLayout = (SlidingTabLayout) rootView.findViewById(R.id.sliding_tabs);
    mSlidingTabLayout.setViewPager(mViewPager);
    return rootView;
}

FragmentOne

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.white_fragment_layout, container, false);        
    image_one_btn = (ImageView) rootView.findViewById(R.id.image_one_click);       
    image_one_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            selectImage();
        }
    });

    return rootView;
}

private void selectImage() {
    Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    getParentFragment().startActivityForResult(i, 1);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (data != null) {
        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);
        Log.i("ImagePath:","===="+picturePath);

        image_one_btn.setImageBitmap(BitmapFactory.decodeFile(picturePath));

        cursor.close();
    } else {
        Toast.makeText(getActivity(), "Try Again!!", Toast.LENGTH_SHORT).show();
    }
}

ViewPagerAdapter

public class ViewPagerAdapter extends FragmentPagerAdapter {

private String[] tabsTitles;

public ViewPagerAdapter(FragmentManager fm, String[] tabsTitles) {
    super(fm);
    this.tabsTitles = tabsTitles;
}

@Override
public CharSequence getPageTitle(int position) {
    return tabsTitles[position];
}

@Override
public Fragment getItem(int index) {
    switch(index) {
    case 0:
        return new ImageOneFragment();
    case 1:
        return new ImageTwoFragment();
    case 2:
        return new ImageThreeFragment();

    }

    return null;
}

@Override
public int getCount() {
    return tabsTitles.length;
}

}

Upvotes: 1

Views: 520

Answers (2)

Mr Nice
Mr Nice

Reputation: 524

Here is the solution which may help any one facing the same issue.

MainFragment add the following code

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

    List<Fragment> fragments = getChildFragmentManager().getFragments();
    if (fragments != null) {
        for (Fragment fragment : fragments) {
            fragment.onActivityResult(requestCode, resultCode, data);


            Log.i("in activity result","");
        }
    }
}

and in onActivityResult method of ImageOneFragmentcheck the requestCode like

if (requestCode == 1){

// set image to imageview

}

Upvotes: 1

Pinakin Kansara
Pinakin Kansara

Reputation: 2371

Add constructor to your fragment one like mentioned below.

public static ImageOneFragment newInstance() {
ImageOneFragment myFragment = new ImageOneFragment ();

Bundle args = new Bundle();

myFragment.setArguments(args);

return myFragment;}

Then inside you view pager do below edit .

 switch(index) {
case 0:
    return  ImageOneFragment.newInstance();
case 1:
    return  ImageOneFragment.newInstance();
case 2:
    return  ImageOneFragment.newInstance();

}

return null;

This will create new instance of your fragment & each section work as new object.

Also edit this method of image selection

private void selectImage() {
Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, 1);}

remove getparentFragment() cause it will give result to you parent fragment then parent pass it to all child fragments onActivityResult.

Do following edit to get it working

add this method to you ImageOneFragment & move implementation of onActivityResult to that method.

public void handleResult(int requestCode,int resultCode,Intent data){}

Than in your main fragment add new list like this .

private ArrayList<Fragment>pages;
pages=new ArrayList<Fragment>();
pages.add(ImageOneFragment.newInstance());
pages.add(ImageOneFragment.newInstance());
pages.add(ImageOneFragment.newInstance());

pass this list to your view pager and make according change to your view pager. Than when you selectImage from any of fragment it will give result to main fragment and inside of main fragments onActivityResult() manage result as below.

pages.get(viewpager.getselectedItem()).handleresult(requestCode,resultCode,data);

This will make the trick.

Upvotes: 0

Related Questions