簡體   English   中英

再次路由到導體控制器時,浮動按鈕不起作用

[英]Floating button doesn't work when routing to conductor controller a second time

我正在使用指揮和黃油刀。

我有一個BaseController ,在其中執行BN樣板:

    protected ButterKnifeController() { }
    protected ButterKnifeController(Bundle args) {
        super(args);
    }

    protected abstract View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container);

    @NonNull
    @Override
    protected View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
        View view = inflateView(inflater, container);
        unbinder = ButterKnife.bind(this, view);
        onViewBound(view);
        return view;
    }

    protected void onViewBound(@NonNull View view) { }

    @Override
    protected void onDestroyView(@NonNull View view) {
        super.onDestroyView(view);
        unbinder.unbind();
        unbinder = null;
    }
}

我有幾個帶有FAB的控制器,盡管簡單按鈕的問題也一樣。

當我第一次路由到控制器時,onClick()會按預期工作。 但是當我第二次路由到控制器時,onClick()卻沒有。

這是2個控制器的示例,第一個是我想路由回的控制器:

WelcomeController-當我第一次在這里布線時 ,Fab工作正常

public class WelcomeController extends BaseController {
    @BindView(R.id.tv_step_title)
    TextView title;

    @BindView(R.id.tv_step_message)
    TextView message;


    @Override
    protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
        return inflater.inflate(R.layout.controller_base_title_text, container, false);
    }

    @Override
    protected void onViewBound(@NonNull View view) {
        super.onViewBound(view);
        title.setText(getResources().getText(R.string.wizard_welcome_step_title));
        message.setText(getResources().getText(R.string.wizard_welcome_step_message));
    }

    @Override
    protected void onAttach(@NonNull View view) {
        super.onAttach(view);
        requestVideoPermissions();
    }

    @OnClick(R.id.fab_next)
    public void onFabNextClick(){
        getRouter().pushController(RouterTransaction.with(new DiagnosePulseController())
                .pushChangeHandler(new FadeChangeHandler())
                .popChangeHandler(new FadeChangeHandler()));
    }
}

SecondController-單擊allDone Fab路由到WelcomeController,但不會觸發onClick()事件。

public class RecordFingertPulseController extends BaseController {

    private static final String TAG = RecordFingertPulseController.class.getSimpleName();
    public static final String WRIST_PPG_KEY = "wrist_ppg";
    public static final String WRIST_TS_KEY = "wrist_ts";

    private CameraController mCameraController;
    private static final PpgRecordedRxModel PPG_RX_MODEL = PpgRecordedRxModel.getInstance();
    private PulseModel mPulseModel = null;
    private final CameraController.Callback mRxCameraControllerCallback = new CameraController.Callback() {
        @Override
        public void onCameraAccessException() {
            Log.e(TAG, "CameraAccessException");
        }

        @Override
        public void onCameraOpenException(@Nullable OpenCameraException.Reason reason) {
            Log.e(TAG, new OpenCameraException(reason).getMessage());
        }

        @Override
        public void onException(Throwable throwable) {
            Log.e(TAG, throwable.getMessage());
        }
    };

    @BindView(R.id.fab_record_pulse)
    FloatingActionButton mFabRecordPulse;

    @BindView(R.id.fab_all_done)
    FloatingActionButton mFabAllDone;

    @BindView(R.id.tv_step_title)
    MyTextView tv_title;

    @BindView(R.id.tv_step_message)
    MyTextView tv_message;

    public RecordFingertPulseController(Bundle dataBundle) {
        super(dataBundle);
    }

    @Override
    protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
        return inflater.inflate(R.layout.controller_pulse_recording, container, false);
    }

    @NonNull
    @Override
    protected View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
        return super.onCreateView(inflater, container);
    }

    @Override
    protected void onAttach(@NonNull View view) {
        super.onAttach(view);
        setupViews();
        //Analytics screws camera FPS
        FirebaseAnalytics.getInstance(getActivity()).setAnalyticsCollectionEnabled(false);
        startCamera();
        mCameraController.getConductorLifecycle().onAttach();
        subscribeToPpgRecorded();
    }

    private void subscribeToPpgRecorded() {
        PPG_RX_MODEL.getPpgObservable()
                .doOnNext(ppg -> Log.d(TAG, "PulseModel before filter :\t"
                        + ppg.getPulseName() + "\nPulseModel wrist ppg size"
                        + ppg.getWrisrPpgList().size()
                        + "\nPulseModel finger ppg size: " + ppg.getFingerPpgList().size()))
                .filter(ppg -> ppg.getWrisrPpgList().size() > 0
                        && ppg.getFingerPpgList().size() > 0)
                .doOnNext(ppg -> Log.d(TAG, "Got PulseModel() after filter with finger ppg size: "
                        + ppg.getFingerPpgList().size() + "\twrist ppg size: "
                        + ppg.getWrisrPpgList().size()))
                .subscribe(ppg -> finalizeWristRecording(ppg));
    }

    private void finalizeWristRecording(PulseModel ppg) {
//        mFabRecordPulse.setEnabled(true);
        mFabAllDone.setVisibility(View.VISIBLE);
        try {
            mPulseModel = ppg.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        Log.d(TAG, "Got the ppg with size: " + ppg.getWrisrPpgList().size());
    }

    private void startCamera() {
        CameraManager cameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
        String cameraId = null;
        CameraCharacteristics characteristics = null;
        Size videoSize = null;
        try {
            cameraId = cameraManager.getCameraIdList()[0];
            characteristics = cameraManager.getCameraCharacteristics(cameraId);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        StreamConfigurationMap map = characteristics
                .get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
        if (map == null) {
            throw new RuntimeException("Cannot get available preview/video sizes");
        }
        videoSize = MyUtils.chooseVideoSize(map.getOutputSizes(ImageReader.class));
        mCameraController = new CameraController(getActivity(), mRxCameraControllerCallback,
                cameraManager, cameraId, videoSize, CameraController.PpgSource.FINGER);
    }

    @Override
    protected void onDetach(@NonNull View view) {
        mCameraController.getConductorLifecycle().onDetach();
        mCameraController.getCameraClosedObservable().blockingLast();
        super.onDetach(view);
    }

    private void setupViews() {
        mFabAllDone.setVisibility(View.GONE);
        tv_title.setText(R.string.wizard_record_finger_pulse_step_title);
        tv_message.setText(R.string.wizard_record_finger_pulse_step_message);
        mFabAllDone.setImageResource(R.drawable.ic_done_all_white_24dp);

    }

    @OnClick(R.id.fab_record_pulse)
    public void onRecordPulseClick(){
        mFabRecordPulse.setEnabled(false);
        mCameraController.recordPulseClick();
    }

    @OnClick(R.id.fab_all_done)
    public void onAllDoneClick(){
        if(mPulseModel.getFingerPpgList().size() > 0 || mPulseModel.getWrisrPpgList().size() > 0){
            PulseFirebaseRepository.getRepoInstance().create(mPulseModel);
            requestVideoPermissions();      
mPulseModel.savePpg();
    getRouter().pushController(RouterTransaction.with(new WelcomeController())
                        .pushChangeHandler(new FadeChangeHandler())
                        .popChangeHandler(new FadeChangeHandler()));


        }else{
            if(null != getActivity()){
                new AlertDialog.Builder(getActivity())
                    .setMessage(R.string.empty_pulse_error)
                    .setPositiveButton(android.R.string.ok, null)
                    .show();
            }
        }
    }
}

我根本不知道為什么。 感覺就像是BN問題。 任何幫助將不勝感激。

我懷疑您的問題與您如何返回WelcomeController有關。 當調用onAllDoneClick()時,當前代碼將創建一個新的WelcomeController。 最后,您有一個WelcomeController,由RecordFingerPulseController覆蓋,由另一個WelcomeController覆蓋。

您已經在添加了popChangeHandler onFabNextClick()中設置了向后過渡。

返回最簡單的方法是調用getRouter().popCurrentController(); 而不是在RecordFingerPulseController頂部添加新的WelcomeController。 這將只剩下一個WelcomeController。

如果查看路由器實現,您會發現它具有popToRoot(...)方法。 那應該從后堆棧中刪除所有內容。 這是方法及其注釋:

/**
     * Pops all {@link Controller}s until only the root is left
     *
     * @return Whether or not any {@link Controller}s were popped in
     * order to get to the root transaction
     */
    @UiThread
    public boolean popToRoot() {
        ThreadUtils.ensureMainThread();

        return popToRoot(null);
    }

還有其他幾種方法可以解決該問題。

  1. 如果您不打算回溯到后堆棧,則可以更換控制器而不是推新的控制器。
  2. 您可以將use標簽與popToTag(...)一起添加,以將堆棧展開到所需的控制器。
  3. 您可以使用getBackstack()將后堆棧作為列表getBackstack() ,然后使用該信息來操作事物。
  4. 等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM