Android Studio如何在不重新创建视图的情况下将数据从一个片段发送到另一个片段

问题描述

使用yuriy-budiyev/code-scanner已实现条形码扫描。

布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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"
android:background="@color/white"
android:orientation="vertical"
android:id="@+id/root"
android:padding="10dp">

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.budiyev.android.codescanner.CodeScannerView
        android:id="@+id/scanner_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:autoFocusButtonColor="@android:color/white"
        app:autoFocusButtonVisible="true"
        app:flashButtonColor="@android:color/white"
        app:flashButtonVisible="true"
        app:frameColor="@android:color/white"
        app:frameCorneRSSize="50dp"
        app:frameCornersRadius="0dp"
        app:frameAspectRatioWidth="1"
        app:frameAspectRatioHeight="1"
        app:frameSize="0.75"
        app:frameThickness="2dp"
        app:maskColor="#77000000"/>
</FrameLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

ScanFragment

public class ScanFragment extends Fragment {
private CodeScanner mCodeScanner;

public String scan;

@Override
@Nullable
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    final Activity activity = getActivity();
    View root = inflater.inflate(R.layout.scan,container,false);
    CodeScannerView scannerView = root.findViewById(R.id.scanner_view);
    mCodeScanner = new CodeScanner(activity,scannerView);

    mCodeScanner.setDecodeCallback(result -> {
        activity.runOnUiThread(() -> Toast.makeText(activity,result.getText(),Toast.LENGTH_LONG).show());
                scan = result.getText();
                goBack(scan);

    });
    scannerView.setonClickListener(v -> mCodeScanner.startPreview());
    return root;
}


public void goBack(String scanResult)
{
    Fragment fr=new NewFormFragment();
    FragmentManager fm=getFragmentManager();
    android.app.FragmentTransaction ft=fm.beginTransaction();
    Bundle args = new Bundle();
    args.putString("SCAN",scanResult);
    fr.setArguments(args);
    ft.replace(R.id.fragment_container,fr);
    ft.commit();
}

@Override
public void onResume() {
    super.onResume();
    mCodeScanner.startPreview();
}

@Override
public void onPause() {
    mCodeScanner.releaseResources();
    super.onPause();
}}

我通过我的主要片段称呼上面的片段

 @BindView(R.id.start_scan)
ImageButton startScan;

public class NewFormFragment extends Fragment {
 @Override
public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) {
    if (view == null) {
        view = inflater.inflate(R.layout.new_form_layout,false);
        ButterKnife.bind(this,view);
        bindListners();
        installStatusspinner.setEnabled(false);
        //imsiNo.setVisibility(View.GONE);
        ctRatio.setVisibility(View.GONE);
        btnMaterial.setEnabled(false);
        linearLayoutMaterial.setVisibility(View.GONE);
        linearLayoutimsi.setVisibility(View.GONE);
        linearLayoutSignOff.setVisibility(View.GONE);
        meterType.setVisibility(View.GONE);
        disableTextViews();
        disableMeterGroup();
        setupUI(mScrollView);
    }
    Bundle arguments = getArguments();
    if (arguments != null && arguments.containsKey("install_id")) {
        isNewInstall = false;
        editInstallId = arguments.getString("install_id");
        getActivity().setTitle(getString(R.string.title_fragment_edit_form));
        setEditData();
        //imsiNo.setVisibility(View.GONE);
        linearLayoutimsi.setVisibility(View.GONE);
        linearLayoutSignOff.setVisibility(View.GONE);
        ctRatio.setVisibility(View.GONE);
        resetFormButton.setVisibility(View.GONE);
    } else {
        getActivity().setTitle(getString(R.string.title_fragment_new_form));
    }
    if(getArguments()!=null)
    {
        selectedMeterNo = getArguments().getString("SCAN");
        smartMsnSpinner.setText(selectedMeterNo);
    }

    /*mCoordinatesReceiver = new CoordinatesReceiver();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(Common.GetCoordinatesAction());
    getActivity().registerReceiver(mCoordinatesReceiver,intentFilter);*/
    return view;
}

 public void bindListners()
 {
     startScan.setonClickListener(startScanning);

 } 
 private final View.OnClickListener startScanning = v -> {
    if(v.getId()==R.id.start_scan){
        Fragment fragment = null;
        fragment = new ScanFragment();
        replaceFragment(fragment);
    }
};
public void replaceFragment(Fragment someFragment) {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container,someFragment);
    transaction.addToBackStack(null);
    transaction.commit();
}
}

现在,当我单击扫描按钮时,我可以看到我的扫描片段视图。成功扫描后,我将扫描的文本传递给may NewFormFragment。但是有一个问题,我不想重新创建NewFormFragment视图。我想通过保留以前的视图将扫描的文本传递到NewFormFragment

注意:当我运行我的应用时,将调用NewFormFragment

任何帮助将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)