0

I have an application with 2 buttons in main activity (Message and scan) clicking on scan opens a fragment with camera in it. clicking on message replaces the scan fragment. Till here all is perfect.

Then when i want to open camera again and clicks onto scan button No response. No exceptions.. Until I click multiple times.. Then camera fragment opens. Are there any issues in proper opening and closing of fragment? below is the main activity code for both buttons on click and scan buttons fragment code too. Any help will be appreciated

public void message(View v)
{


    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    message sms = new message();
    scan scan = new scan();
    if(fragmentManager.findFragmentByTag("scan")!=null) {
       try
       {


           fragmentTransaction.replace(fragmentManager.findFragmentByTag("scan").getId(), sms, "text");
           fragmentTransaction.commit();
           Camera camera = null;
           camera.release();

       }
       catch(Exception exe)
       {
           Toast.makeText(getApplicationContext(), exe.getMessage(),Toast.LENGTH_SHORT);
       }

    }


}



    public void scan(View v)
    {
        FragmentManager fragmentManager = getFragmentManager();
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();


        scan scan = new scan();
        if(fragmentManager.findFragmentByTag("text")!=null) {



            try
            {
                fragmentTransaction.replace(fragmentManager.findFragmentByTag("text").getId(), scan, "scan");
                fragmentTransaction.commit();
            }
            catch(Exception exe)
            {
                Toast.makeText(getApplicationContext(), exe.getMessage(),Toast.LENGTH_SHORT);
            }


        }


    }

Scan button opens a fragment and this is the java class for that fragment

private OnFragmentInteractionListener mListener;

    public scan() {
    }
    @Override
    public void handleResult(Result rawResult) {
       

        Log.e("handler", rawResult.getText()); 
        Log.e("handler", rawResult.getBarcodeFormat().toString()); 

        
        AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
        builder.setTitle("Scan Result");
        builder.setMessage(rawResult.getText());
        number = rawResult.getText().substring(rawResult.getText().length() - 13);

        final EditText input = new EditText(this.getActivity());

        input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        builder.setView(input);


        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                m_Text = input.getText().toString();

               
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        builder.setNegativeButton("NO",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });

        AlertDialog alert1 = builder.create();
        alert1.show();

        zXingScannerView.resumeCameraPreview(this);
    }

    public static scan newInstance(String param1, String param2) {
        scan fragment = new scan();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }

        if(checkCameraHardware(getActivity().getApplicationContext())) {
            zXingScannerView = new ZXingScannerView(this.getActivity().getApplicationContext());
            zXingScannerView.setResultHandler(this);
            zXingScannerView.startCamera();
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_scan, container, false);


        FrameLayout preview =(FrameLayout)view.findViewById(R.id.camera_preview);
        preview.addView(zXingScannerView);
       return view;
    }
@Override
public   void onPause()
{
    super.onPause();
zXingScannerView.stopCamera();
}
    @Override
    public void onResume() {
        super.onResume();
        zXingScannerView.setResultHandler(this); // Register ourselves as a handler for scan results.
        zXingScannerView.startCamera();          // Start camera on resume
    }

    /** Check if this device has a camera */
    public boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            // this device has a camera
            return true;
        } else {
            // no camera on this device
            return false;
        }
    }


    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {

        if (mCamera!= null) {
            mCamera.stopPreview();
           mCamera.release();
            mCamera = null;
        }
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
}
nimra asad
  • 179
  • 6
  • 18
  • For this add fragmentTransaction.addToBackStack(test); and for more information see this SO http://stackoverflow.com/questions/18305945/how-to-resume-fragment-from-backstack-if-exists – Vishal Senjaliya May 16 '17 at 09:57
  • if this is the problem then why is my message fragment opens correctly – nimra asad May 16 '17 at 10:39
  • For replacement of fragment it is generally use. See the offical doc https://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String) – Vishal Senjaliya May 16 '17 at 10:57
  • vishal i am able to replace my first fragment (by my mesage button.) all time correctly.... but when clicking on scan button.. a blank screen comes... camera does not opens second time. :( this is the issue please understand – nimra asad May 16 '17 at 11:00

0 Answers0