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 .
- ¿Cómo puedo codificar caracteres usando UTF-8 en un código QR usando el proyecto Zxing?
- Cómo usar Zxing en android
- Cómo cambiar correctamente el nombre del paquete en AndroidManifest.xml (por ejemplo, en el proyecto zxing / barcodescanner)
- Cómo decodificar datos utilizando Zxing C ++
- Introducción a ZXing en Android
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"); } }
- Uso de zxing en Google Glass
- Resolución fallida de: Lcom / abhi / código de barras / frag / libv2 / R $ string
- Llamar escáner de código de barras en un clic de botón en la aplicación android
- PhoneGap BarcodeScanner - ClassNotFound
- ¿Por qué la vista previa de la cámara gira 90 grados en el emulador de Android?
- No se puede escanear QRCode a través del cliente zxing
- Zxing modo retrato de la cámara y el paisaje en Android
- ¿Cómo importar ZXING a android studio?
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) { }