Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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"); } } 

  • Cómo establecer el tamaño del mapa de bits en ZXing?
  • El fragmento del explorador de código de barras de Zxing se bloquea después de unos minutos
  • ZXing cómo escanear código QR y código de barras 1D?
  • Incorporación de ZXing en la aplicación de Android
  • Vista de cámara personalizada y rotación en Zxing para el código QR?
  • Android con ZXing genera código QR
  • GridLayoutManager spanSizeLookup error
  • Android: la exploración del código de barras de zxing tuvo éxito pero no regresó de la actividad
  • 5 Solutions collect form web for “Zxing onActivityResult no se llama en Fragmento sólo en Actividad”

    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) { } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.