Zxing onActivityResult no se llama en Fragmento sólo en Actividad

Estoy teniendo un problema con zxing onActivityResult ().

Como se puede ver en el código, hice una invocación correcta de la nueva intención, tal como se describe en https://code.google.com/p/zxing/wiki/ScanningViaIntent .

La pregunta es ¿Cómo puedo capturar OnActivityResult () en Fragment, ya que necesito estos datos en mi Fragmnet y no en Activity?

package com.example.testingcodereading; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; public class MainFragment extends Fragment { private Button mButtonXZing; @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){ View v = inflater.inflate(R.layout.fragment_main, parent, false); mButtonXZing = (Button) v.findViewById(R.id.button_xzing); mButtonXZing.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { IntentIntegrator integrator = new IntentIntegrator(getActivity()); integrator.initiateScan(); } }); return v; } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { System.out.println("never here"); IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); if (scanResult != null) { // handle scan result } // else continue with any other code you need in the method } } 

 public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fm = getSupportFragmentManager(); Fragment f = fm.findFragmentById(R.id.fragmentContainer); if(f == null){ f = new MainFragment(); fm.beginTransaction() .add(R.id.fragmentContainer, f) .commit(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); System.out.println("the code is catch"); } } 

Como Martynnw señaló el problema es llamar a fragment.startActivityForResult lugar de activity.startActivityForResult . Así que sólo tiene que usar el siguiente wrapper:

 import android.content.Intent; import android.support.v4.app.Fragment; import com.google.zxing.integration.android.IntentIntegrator; public final class FragmentIntentIntegrator extends IntentIntegrator { private final Fragment fragment; public FragmentIntentIntegrator(Fragment fragment) { super(fragment.getActivity()); this.fragment = fragment; } @Override protected void startActivityForResult(Intent intent, int code) { fragment.startActivityForResult(intent, code); } } 

Si alguien tiene el mismo problema aquí es mi solución.

 package com.example.testingcodereading; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); FragmentManager fm = getSupportFragmentManager(); Fragment f = fm.findFragmentById(R.id.fragmentContainer); if (f == null) { f = MainFragment.newInstance("Start Application"); fm.beginTransaction().add(R.id.fragmentContainer, f).commit(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); System.out.println("the code is catch"); IntentResult scanResult = IntentIntegrator.parseActivityResult( requestCode, resultCode, intent); // handle scan result if (scanResult != null) { FragmentManager fm = getSupportFragmentManager(); Fragment newFrame = MainFragment.newInstance(scanResult.toString()); fm.beginTransaction().replace(R.id.fragmentContainer, newFrame).commit(); } } } 

 package com.example.testingcodereading; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.support.v4.app.Fragment; import android.test.suitebuilder.annotation.MediumTest; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; public class MainFragment extends Fragment { private static final String EXTRA_CODE = "com.example.testingcodereading.code"; private Button mButtonXZing; private TextView mTextView; public static MainFragment newInstance(String code) { Bundle args = new Bundle(); args.putSerializable(EXTRA_CODE, code); MainFragment fragment = new MainFragment(); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){ View v = inflater.inflate(R.layout.fragment_main, parent, false); mTextView = (TextView) v.findViewById(R.id.text_code); mTextView.setText((String) getArguments().getSerializable(EXTRA_CODE)); mButtonXZing = (Button) v.findViewById(R.id.button_xzing); mButtonXZing.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { IntentIntegrator integrator = new IntentIntegrator(getActivity()); integrator.initiateScan(); } }); return v; } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); System.out.println("never here"); IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); if (scanResult != null) { // handle scan result } // else continue with any other code you need in the method } } 

Proyecto Alternativo (ZXing Android Embedded):

 dependencies { compile 'com.journeyapps:zxing-android-embedded:3.3.0@aar' compile 'com.google.zxing:core:3.2.1' } 

E implementar Actividad:

 import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentResult; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); IntentIntegrator.forFragment(this).initiateScan(); } @Override public void onActivityResult(int requestCode, int resultCode,Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case IntentIntegrator.REQUEST_CODE: if (resultCode == Activity.RESULT_OK) { // Parsing bar code reader result IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if (DEBUG) Log.d(TAG, "Parsing bar code reader result: " + result.toString()); } break; } } 

Más información y opciones

Asegúrese de que OnActivityResult en su Activity está llamando a super.OnActivityResult() . Eso debería asegurar que se llama también al Fragment .

Alternativamente, puede modificar el código IntentIntegrator para que llame a StartActivityResult en el Fragment , pasando el fragmento al constructor o pasándolo a initiateScan .

Una solución: Un ejemplo básico de cómo administrarlo

Actividad principal

 public static int tapTrick = 0; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //super.onActivityResult(requestCode, resultCode, data); if(tapTrick!=0 && tapTrick==1) { Tab1.onActivityResult(requestCode, resultCode, data, MainActivity.this); }else if (tapTrick!=0 && tapTrick==2){ //Tab2.onActivityResult(requestCode, resultCode, data, MainActivity.this); } } 

Fragmento 1

 MainActivity.tapTrick=1; // onCreateView or onClick (load images/files) public static void onActivityResult(int requestCode, int resultCode, Intent intent, Context context) { } 

Fragmento 2

 MainActivity.tapTrick=2; public static void onActivityResult(int requestCode, int resultCode, Intent intent, Context context) { } 

Fragmento x

 MainActivity.tapTrick=x; public static void onActivityResult(int requestCode, int resultCode, Intent intent, Context context) { } 
  • Cómo establecer el tamaño del mapa de bits en ZXing?
  • ActionBar bajo notificación / barra de título
  • Android: El código QR generado que usa Zxing tiene márgenes (no es apropiado para el área)
  • Android + biblioteca de escaneo de códigos de barras ZXing - tamaño personalizado y orientación
  • ¿Puedo usar Zxing para fines comerciales?
  • Android: ClassNotFoundException mientras incluye ZXing
  • Utilizar la biblioteca de Zxing en PreviewFrame para aumentar la realidad
  • ¿Cómo abrir la pantalla de escaneo "zxing Barcode" en una pequeña ventana?
  • ¿Es posible mostrar números bajo un código de barras de una dimensión generado por ZXing?
  • Problema en la generación de eventos de calendario utilizando zxing
  • Android Genera código QR y código de barras usando Zxing
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.