android - 我应该使用新的 Activity 还是 fragment 来扫描条形码?

标签 android android-fragments zxing

我有一个 Activity ,用户应该能够通过书写或使用条形码扫描仪通过单击编辑文本旁边的按钮来输入 2 个参数。

ConfigActivity

对于扫描,我将使用 zxing,因为我可以用它找到许多可用的示例。扫描后,扫描值应写入用户的编辑框中。

我的问题是,我不知道是否应该使用 fragment 或新 Activity ,因为我需要与之通信。

fragment 是有意义的,因为我想用相机/扫描仪覆盖整个屏幕,但是建议在 2 个整个屏幕 fragment 之间切换吗?

如果我应该使用 fragment ,对于这种情况最好的方法是什么?

xzing 作为 fragment 的示例:

public class FullScannerActivity extends BaseScannerActivity implements MessageDialogFragment.MessageDialogListener,
    ZXingScannerView.ResultHandler, FormatSelectorDialogFragment.FormatSelectorDialogListener,
    CameraSelectorDialogFragment.CameraSelectorDialogListener {
private static final String FLASH_STATE = "FLASH_STATE";
private static final String AUTO_FOCUS_STATE = "AUTO_FOCUS_STATE";
private static final String SELECTED_FORMATS = "SELECTED_FORMATS";
private static final String CAMERA_ID = "CAMERA_ID";
private ZXingScannerView mScannerView;
private boolean mFlash;
private boolean mAutoFocus;
private ArrayList<Integer> mSelectedIndices;
private int mCameraId = -1;

@Override
public void onCreate(Bundle state) {
    super.onCreate(state);
    if(state != null) {
        mFlash = state.getBoolean(FLASH_STATE, false);
        mAutoFocus = state.getBoolean(AUTO_FOCUS_STATE, true);
        mSelectedIndices = state.getIntegerArrayList(SELECTED_FORMATS);
        mCameraId = state.getInt(CAMERA_ID, -1);
    } else {
        mFlash = false;
        mAutoFocus = true;
        mSelectedIndices = null;
        mCameraId = -1;
    }

    setContentView(R.layout.activity_simple_scanner);
    setupToolbar();

    ViewGroup contentFrame = (ViewGroup) findViewById(R.id.content_frame);
    mScannerView = new ZXingScannerView(this);
    setupFormats();
    contentFrame.addView(mScannerView);
}

@Override
public void onResume() {
    super.onResume();
    mScannerView.setResultHandler(this);
    mScannerView.startCamera(mCameraId);
    mScannerView.setFlash(mFlash);
    mScannerView.setAutoFocus(mAutoFocus);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(FLASH_STATE, mFlash);
    outState.putBoolean(AUTO_FOCUS_STATE, mAutoFocus);
    outState.putIntegerArrayList(SELECTED_FORMATS, mSelectedIndices);
    outState.putInt(CAMERA_ID, mCameraId);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuItem menuItem;

    if(mFlash) {
        menuItem = menu.add(Menu.NONE, R.id.menu_flash, 0, R.string.flash_on);
    } else {
        menuItem = menu.add(Menu.NONE, R.id.menu_flash, 0, R.string.flash_off);
    }
    MenuItemCompat.setShowAsAction(menuItem, MenuItem.SHOW_AS_ACTION_NEVER);


    if(mAutoFocus) {
        menuItem = menu.add(Menu.NONE, R.id.menu_auto_focus, 0, R.string.auto_focus_on);
    } else {
        menuItem = menu.add(Menu.NONE, R.id.menu_auto_focus, 0, R.string.auto_focus_off);
    }
    MenuItemCompat.setShowAsAction(menuItem, MenuItem.SHOW_AS_ACTION_NEVER);

    menuItem = menu.add(Menu.NONE, R.id.menu_formats, 0, R.string.formats);
    MenuItemCompat.setShowAsAction(menuItem, MenuItem.SHOW_AS_ACTION_NEVER);

    menuItem = menu.add(Menu.NONE, R.id.menu_camera_selector, 0, R.string.select_camera);
    MenuItemCompat.setShowAsAction(menuItem, MenuItem.SHOW_AS_ACTION_NEVER);

    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.menu_flash:
            mFlash = !mFlash;
            if(mFlash) {
                item.setTitle(R.string.flash_on);
            } else {
                item.setTitle(R.string.flash_off);
            }
            mScannerView.setFlash(mFlash);
            return true;
        case R.id.menu_auto_focus:
            mAutoFocus = !mAutoFocus;
            if(mAutoFocus) {
                item.setTitle(R.string.auto_focus_on);
            } else {
                item.setTitle(R.string.auto_focus_off);
            }
            mScannerView.setAutoFocus(mAutoFocus);
            return true;
        case R.id.menu_formats:
            DialogFragment fragment = FormatSelectorDialogFragment.newInstance(this, mSelectedIndices);
            fragment.show(getSupportFragmentManager(), "format_selector");
            return true;
        case R.id.menu_camera_selector:
            mScannerView.stopCamera();
            DialogFragment cFragment = CameraSelectorDialogFragment.newInstance(this, mCameraId);
            cFragment.show(getSupportFragmentManager(), "camera_selector");
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void handleResult(Result rawResult) {
    try {
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
        r.play();
    } catch (Exception e) {}
    showMessageDialog("Contents = " + rawResult.getText() + ", Format = " + rawResult.getBarcodeFormat().toString());
}

public void showMessageDialog(String message) {
    DialogFragment fragment = MessageDialogFragment.newInstance("Scan Results", message, this);
    fragment.show(getSupportFragmentManager(), "scan_results");
}

public void closeMessageDialog() {
    closeDialog("scan_results");
}

public void closeFormatsDialog() {
    closeDialog("format_selector");
}

public void closeDialog(String dialogName) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    DialogFragment fragment = (DialogFragment) fragmentManager.findFragmentByTag(dialogName);
    if(fragment != null) {
        fragment.dismiss();
    }
}

@Override
public void onDialogPositiveClick(DialogFragment dialog) {
    // Resume the camera
    mScannerView.resumeCameraPreview(this);
}

@Override
public void onFormatsSaved(ArrayList<Integer> selectedIndices) {
    mSelectedIndices = selectedIndices;
    setupFormats();
}

@Override
public void onCameraSelected(int cameraId) {
    mCameraId = cameraId;
    mScannerView.startCamera(mCameraId);
    mScannerView.setFlash(mFlash);
    mScannerView.setAutoFocus(mAutoFocus);
}

public void setupFormats() {
    List<BarcodeFormat> formats = new ArrayList<BarcodeFormat>();
    if(mSelectedIndices == null || mSelectedIndices.isEmpty()) {
        mSelectedIndices = new ArrayList<Integer>();
        for(int i = 0; i < ZXingScannerView.ALL_FORMATS.size(); i++) {
            mSelectedIndices.add(i);
        }
    }

    for(int index : mSelectedIndices) {
        formats.add(ZXingScannerView.ALL_FORMATS.get(index));
    }
    if(mScannerView != null) {
        mScannerView.setFormats(formats);
    }
}

@Override
public void onPause() {
    super.onPause();
    mScannerView.stopCamera();
    closeMessageDialog();
    closeFormatsDialog();
}

XML:

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment android:name="com.example.registerbutton.FullScannerFragment"
          android:id="@+id/scanner_fragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_gravity="top"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/actionbar_opacity"
    app:theme="@style/TransparentToolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
</FrameLayout>

最佳答案

我建议创建一个新的Activity而不是Fragment。您可以发送数据也可以从中接收数据。

要发送数据,您可以使用 startActivityForResult() 和可选的 intent.putData()

为了接收数据,您可以重写onActivityResult()

关于android - 我应该使用新的 Activity 还是 fragment 来扫描条形码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57286197/

相关文章:

Android 库项目在 Eclipse 中不同步

java - 字钟 - 最有效的报时方法

android - fragment 中的 MapView(蜂窝)

android - 如何在Android中更改PreferenceScreen的文本颜色和背景颜色

java - 如何使用ZXing只提取应用程序中的某些数据?

java - com.android.settings(ICS)有哪些依赖

android - 如何将现有的 android 项目推送到组织的存储库?

java - android: 尝试转换 fragment 时出现 ClassCastException

ios - iOS 上 Xamarin Forms 中的 ZXing 条码扫描器无法读取条码

ios - Zxing示例中的条形码扫描仪