Я пытаюсь использовать библиотеку zxing внутри фрагмента. Я могу заставить сканер работать и захватывать штрих-код, но метод onActivityResult в действии всегда запускается вместо метода onActivityResult в Frament.
Я пробовал различные решения, упомянутые в этом посте но безуспешно.
Это код моей деятельности:
package com.test01.test01_tp2;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.google.android.material.navigation.NavigationView;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
public class MainActivityLibrarian extends AppCompatActivity {
DrawerLayout drawerLayout;
String name;
TextView tvName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_librarian);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawerLayout = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close);
drawerLayout.addDrawerListener(toggle);
toggle.syncState();
NavigationView nav_view = findViewById(R.id.nav_view);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new HomeLibrarianFragment()).commit();
//Get the username and update the name in the drawer
name = getIntent().getStringExtra("name");
View headerView = nav_view.getHeaderView(0);
tvName = headerView.findViewById(R.id.txtNameHeader);
tvName.setText(name);
nav_view.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch(menuItem.getItemId())
{
case R.id.nav_add_loan:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new AddLoanFragment()).commit();
break;
case R.id.nav_list_loans:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ListLoansFragment()).commit();
break;
case R.id.nav_add_readers:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AddReadersFragment()).commit();
break;
case R.id.nav_list_readers:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ListReadersFragment()).commit();
break;
case R.id.nav_add_books:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AddBooksFragment()).commit();
break;
case R.id.nav_list_books:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ListBooksFragment()).commit();
break;
/*case R.id.close:
finish();
break;*/
}
drawerLayout.closeDrawer(GravityCompat.START);
return true;
}
});
}
@Override
public void onBackPressed() {
if(drawerLayout.isDrawerOpen(GravityCompat.START))
drawerLayout.closeDrawer(GravityCompat.START);
else
super.onBackPressed();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
System.out.println("the code is catch");
}
}
А это код моего фрагмента, где я пытаюсь использовать устройство считывания штрих-кода:
package com.test01.test01_tp2;
import android.content.Intent;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
/**
* A simple {@link Fragment} subclass.
*/
public class AddLoanFragment extends Fragment {
//View Objects
private Button btnAdd, btnClear;
private EditText etBarcodeReader, etBarcodeBook;
private ImageButton imBtnBarcodeBook, imBtnBarcodeReader;
//barcode scanner Object
private IntentIntegrator barcodeScanner;
public AddLoanFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_add_loan, container, false);
//View Objects
btnAdd = root.findViewById(R.id.btn_add);
btnClear = root.findViewById(R.id.btn_clear);
imBtnBarcodeBook = root.findViewById(R.id.imageButtonBarcodeBook);
imBtnBarcodeReader = root.findViewById(R.id.imageButtonBarcodeReader);
etBarcodeBook = root.findViewById(R.id.editTextBookBarcode);
etBarcodeReader = root.findViewById(R.id.editTextReaderBarcode);
imBtnBarcodeReader.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
barcodeScanner = new IntentIntegrator(getActivity());
barcodeScanner.forSupportFragment(AddLoanFragment.this).initiateScan();
}
});
// Inflate the layout for this fragment
return root;
}
@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
}
}
Когда я смотрю на консоль, я всегда вижу: код ловится. И я не понимаю: никогда здесь.
Может быть полезно отметить, что на barcodeScanner.forSupportFragment(AddLoanFragment.this).initiateScan();
я получаю предупреждение о том, что Stati c member 'com.google.zxing.integration. android .IntentIntegrator.forSupportFragment (androidx.fragment.app.Fragment) ', доступ к которому осуществляется через ссылку на экземпляр. Я не уверен, что это значит, и если в этом проблема.
Я думаю, что безуспешно попробовал все ответы, предложенные в упомянутом выше посте.
Спасибо за вашу помощь.