Search code examples
androidconstructorapkdefault

how to pass the list of lists means List<List<Bitmap>> through bundle to the fragment in android


basically i working with fragments and i pass the List to the fragment by creating constructor but when i try to generate the signed apk file i got the error like (This fragment should have a default constructor) after searching i find the method to create the newInstance to to pass the data to another fragment by bundle like this...

public static Fragment newInstance(String arg1, int arg2) {
    Fragment result = new MyFragment();
    Bundle args = new Bundle();
    args.putString("arg1_key", arg1);
    args.putInt("arg2_key", arg2);
    result.setArguments(args); 
    return result;
}

And my code is here please any suggestion.......

import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.annotation.Nullable;
import android.support.design.internal.ParcelableSparseArray;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

import com.google.android.gms.ads.AdView;
import com.nhaarman.listviewanimations.appearance.simple.AlphaInAnimationAdapter;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Transformation;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by waqar on 12/01/2017.
 */

public class splashFragment extends Fragment {

    private int[] HandImages = {R.drawable.hands_1, R.drawable.hands_2, R.drawable.hands_3, R.drawable.hands_4, R.drawable.hands_5,
            R.drawable.hands_6, R.drawable.hands_7, R.drawable.hands_8, R.drawable.hands_9, R.drawable.hands_10,
            R.drawable.hands_11, R.drawable.hands_12, R.drawable.hands_13, R.drawable.hands_14, R.drawable.hands_15,
            R.drawable.foot_15};


    private int[] FootImages = {R.drawable.foot_1, R.drawable.foot_2, R.drawable.foot_3, R.drawable.foot_4, R.drawable.foot_5,
            R.drawable.foot_6, R.drawable.foot_7, R.drawable.foot_8, R.drawable.foot_9, R.drawable.foot_10,
            R.drawable.foot_11, R.drawable.foot_12, R.drawable.foot_13, R.drawable.foot_14,
            R.drawable.foot_15};


    private int[] TatooImages = {R.drawable.tatoos_1, R.drawable.tatoos_2, R.drawable.tatoos_3, R.drawable.tatoos_4, R.drawable.tatoos_5,
            R.drawable.tatoos_6, R.drawable.tatoos_7, R.drawable.tatoos_8, R.drawable.tatoos_9, R.drawable.tatoos_10, R.drawable.tatoos_11};



    private int[] NailImages = {R.drawable.nail_1, R.drawable.nail_2, R.drawable.nail_3, R.drawable.nail_4, R.drawable.nail_5,
            R.drawable.nail_6, R.drawable.nail_7, R.drawable.nail_8, R.drawable.nail_9, R.drawable.nail_10, R.drawable.nail_11};


    ArrayList<Bitmap> HandsBitmapArray = new ArrayList<Bitmap>();
     ArrayList<Bitmap> FootBitmapArray = new ArrayList<Bitmap>();
    ArrayList<Bitmap> TatooBitmapArray = new ArrayList<Bitmap>();
    ArrayList<Bitmap> NailBitmapArray = new ArrayList<Bitmap>();

    ImageView imageView;


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


        View view = inflater.inflate(R.layout.splash_fragment, container, false);
        imageView = (ImageView) view.findViewById(R.id.imageView);


        Picasso.with(getActivity()).load(R.drawable.design_12).transform(new CircleTransform()).into(imageView);

        final AdView mAdView = (AdView) getActivity().findViewById(R.id.adView1);
        mAdView.setVisibility(View.GONE);

        if (HandImages != null && HandImages.length > 0) {
            new BackGroundTask().execute();
        }

        return view;
    }

    public class CircleTransform implements Transformation {
        @Override
        public Bitmap transform(Bitmap source) {
            int size = Math.min(source.getWidth(), source.getHeight());
            float radius = size / 2f;

            final Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));

            Bitmap output = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(output);
            canvas.drawCircle(radius, radius, radius, paint);

            if (source != output) {
                source.recycle();
            }

            return output;
        }

        @Override
        public String key() {
            return "circle";
        }
    }


    public class BackGroundTask extends AsyncTask<Object, Object, List<List<Bitmap>>> {
        ProgressDialog progressDialog;

        List<List<Bitmap>> arrayOfLists = new ArrayList<List<Bitmap>>();

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            /*progressDialog = new ProgressDialog(getActivity());
            progressDialog.setMessage("Loading....");
            progressDialog.setCancelable(false);
            progressDialog.show();*/
        }

        /*@Override
        protected void onProgressUpdate(Integer... values) {

            progressBar.setVisibility(View.VISIBLE);
            progressBar.setProgress(values[0]);
        }*/


        @Override
        protected List<List<Bitmap>> doInBackground(Object... params) {

            if (isAdded() == true) {

                for (int i = 0; i < HandImages.length; i++) {

                    Bitmap handsImaes = BitmapFactory.decodeResource(getActivity().getResources(), HandImages[i]);
                   /* int bytes = byteSizeOf(largeIcon);
                    ByteBuffer buffer = ByteBuffer.allocate(bytes); //Create a new buffer
                    largeIcon.copyPixelsToBuffer(buffer); //Move the byte data to the buffer

                    byte[] array = buffer.array();*/

                  /*  Bitmap b1 = BitmapFactor y.decodeByteArray(b, 0, b.length);
                    Bitmap bitmap = Bitmap.createScaledBitmap(b1, 120, 120, false);*/


                    //Bitmap bitmap = Bitmap.createScaledBitmap(largeIcon, 80, 80, true);
                    Bitmap HandBitmaps = getResizedBitmap(handsImaes, 80, 80);

                    //Bitmap bitmap = Bitmap.createScaledBitmap(largeIcon,(int)(largeIcon.getWidth()*0.1), (int)(largeIcon.getHeight()*0.1), true);
                    //Bitmap bitmap = scaleBitmap(largeIcon, 80, 80);
                   // Bitmap bitmap = decodeSampledBitmapFromResource(getResources(), images[i], 80, 80);
                    HandsBitmapArray.add(HandBitmaps);


                }
                arrayOfLists.add(HandsBitmapArray);


                for (int i = 0; i < FootImages.length; i++){
                    Bitmap footImages = BitmapFactory.decodeResource(getActivity().getResources(), FootImages[i]);
                    Bitmap FootBitmaps = getResizedBitmap(footImages, 80, 80);
                    FootBitmapArray.add(FootBitmaps);

                }
                arrayOfLists.add(FootBitmapArray);

                for (int i = 0; i < TatooImages.length; i++){
                    Bitmap footImages = BitmapFactory.decodeResource(getActivity().getResources(), TatooImages[i]);
                    Bitmap FootBitmaps = getResizedBitmap(footImages, 80, 80);
                    TatooBitmapArray .add(FootBitmaps);
                }
                arrayOfLists.add(TatooBitmapArray);

                for (int i = 0; i < NailImages.length; i++){
                    Bitmap footImages = BitmapFactory.decodeResource(getActivity().getResources(), NailImages[i]);
                    Bitmap FootBitmaps = getResizedBitmap(footImages, 80, 80);
                    NailBitmapArray .add(FootBitmaps);
                }
                arrayOfLists.add(NailBitmapArray);
            }

            return arrayOfLists;
        }


        @Override
        protected void onPostExecute(final List<List<Bitmap>> result) {
            super.onPostExecute(result);


            //progressDialog.dismiss();
            /*new CountDownTimer(2000, 800) {

                public void onTick(long millisUntilFinished) {

                }

                public void onFinish() {*/

                    //MainFragment mainFragment = newInstance(result);

                    MainFragment mainFragment = new MainFragment(result);
                    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                    fragmentTransaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
                    fragmentTransaction.replace(R.id.frame_lay, mainFragment, "mainFragment");
                    fragmentTransaction.commit();
                /*}
            }.start();*/

            /*CustomAdapter adapter = new CustomAdapter(getActivity(), R.layout.custom_grid_row, result);

            AlphaInAnimationAdapter swingRightInAnimationAdapter = new AlphaInAnimationAdapter(adapter);
            swingRightInAnimationAdapter.setAbsListView(grid);
            grid.setAdapter(swingRightInAnimationAdapter);*/
        }
    }


    public static MainFragment newInstance(List<List<Bitmap>> bitmapArray)
    {
        MainFragment fragment = new MainFragment();
        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList("array", bitmapArray);
        fragment.setArguments(bundle);
        return fragment;
    }


    public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) {

       /* BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        o.inSampleSize = 6;*/

        int width = bm.getWidth();
        int height = bm.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // CREATE A MATRIX FOR THE MANIPULATION
        Matrix matrix = new Matrix();
        // RESIZE THE BIT MAP
        matrix.postScale(scaleWidth, scaleHeight);

        // "RECREATE" THE NEW BITMAP
        Bitmap resizedBitmap = Bitmap.createBitmap(
                bm, 0, 0, width, height, matrix, false);
        bm.recycle();
        return resizedBitmap;
    }

    @Override
    public void onResume() {
        super.onResume();
        ((AppCompatActivity)getActivity()).getSupportActionBar().hide();
    }
    @Override
    public void onStop() {
        super.onStop();
        ((AppCompatActivity)getActivity()).getSupportActionBar().show();
    }


}

And my error in in this function......

public static MainFragment newInstance(List<List<Bitmap>> bitmapArray)
    {
        MainFragment fragment = new MainFragment();
        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList("array", bitmapArray);
        fragment.setArguments(bundle);
        return fragment;
    }

Edit my getterSetter class i like...

public class GetterSetterForBitmaps {

    public List<List<Bitmap>> HandsList;
    public List<List<Bitmap>> FootsList;
    public List<List<Bitmap>> TatoosLists;
    public List<List<Bitmap>> NailsLists;

    public List<List<Bitmap>> getHandsList() {
        return HandsList;
    }

    public void setHandsList(List<List<Bitmap>> handsList) {
        HandsList = handsList;
    }

    public List<List<Bitmap>> getFootsList() {
        return FootsList;
    }

    public void setFootsList(List<List<Bitmap>> footsList) {
        FootsList = footsList;
    }

    public List<List<Bitmap>> getTatoosLists() {
        return TatoosLists;
    }

    public void setTatoosLists(List<List<Bitmap>> tatoosLists) {
        TatoosLists = tatoosLists;
    }

    public List<List<Bitmap>> getNailsLists() {
        return NailsLists;
    }

    public void setNailsLists(List<List<Bitmap>> nailsLists) {
        NailsLists = nailsLists;
    }
}

and setting the list in GetterSetter like this..

GetterSetterForBitmaps getterSetterForBitmaps = new GetterSetterForBitmaps();
getterSetterForBitmaps.setHandsList(arrayOfLists);

but when get the list from GetterSetter like this...

GetterSetterForBitmaps getterSetterForBitmaps = new GetterSetterForBitmaps();

        List<List<Bitmap>> list = getterSetterForBitmaps.getHandsList();

it returns null???


Solution

  • Don't do this, you will be wasting great amount of memory in serializing and de-serializing bitmaps as it will create two additional copies of same object and will cost you in longer run.

    I would suggest rather create a DataLayer for passing data among Android Components

    For example

    class MyImageCache
    {
     static List<List<BitMap>> list;
     public static getList(){
        return list;
     }
     public static setList(List<List<BitMap>> list1){
       list=list1;
     }
    }
    

    This would save you from creating multiple copies of same object across app.

    You can modify "ImageCache" class's behavior to have more control over data sharing.