Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 浮动按钮不';第二次布线至导体控制器时,不工作_Android_Butterknife_Conductor - Fatal编程技术网

Android 浮动按钮不';第二次布线至导体控制器时,不工作

Android 浮动按钮不';第二次布线至导体控制器时,不工作,android,butterknife,conductor,Android,Butterknife,Conductor,我用的是指挥家和小刀 我有一个BaseController在那里我做BN样板: protected ButterKnifeController() { } protected ButterKnifeController(Bundle args) { super(args); } protected abstract View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGr

我用的是指挥家和小刀

我有一个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()没有

以下是两个控制器的示例,第一个是我要路由回的控制器:

WelcomeController-当我第一次来这里时,工厂运转良好

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-单击所有完成的晶圆厂路由到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();
            }
        }
    }
}

我就是不明白为什么。这感觉像是一个问题。任何帮助都将不胜感激。

我怀疑您的问题与如何回到WelcomeController有关。调用
onaldoneclick()
时,当前代码将创建一个新的WelcomeController。最后,您有一个WelcomeController,由RecordFingerPulseController覆盖,由另一个WelcomeController覆盖

您已经在添加了
popChangeHandler
onFabNextClick()
中设置了反向转换


返回的最简单方法是调用
getRouter().popCurrentController()而不是在RecordFingerPulseController上添加新的WelcomeController。这只会给您留下一个WelcomeController。

我怀疑您的问题与如何返回WelcomeController有关。调用
onaldoneclick()
时,当前代码将创建一个新的WelcomeController。最后,您有一个WelcomeController,由RecordFingerPulseController覆盖,由另一个WelcomeController覆盖

您已经在添加了
popChangeHandler
onFabNextClick()
中设置了反向转换


返回的最简单方法是调用
getRouter().popCurrentController()而不是在RecordFingerPulseController上添加新的WelcomeController。这将给您留下一个WelcomeController。

如果您查看路由器实现,您将发现它有一个
Poptroot(…)
方法。这将删除后堆栈中的所有内容。以下是方法及其注释:-

/**
     * 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);
    }
还有其他几种方法可以解决这个问题

  • 如果您不打算返回后台堆栈,可以替换控制器,而不是推送一个新的控制器
  • 您可以将use标记与
    popToTag(…)
    一起添加,以将堆栈展开到所需的控制器
  • 您可以使用
    getBackstack()
    以列表的形式获取后堆栈,然后使用该信息进行操作
  • 等等

  • 如果您查看路由器实现,您会发现它有一个
    poptroot(…)
    方法。这将删除后堆栈中的所有内容。以下是方法及其注释:-

    /**
         * 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);
        }
    
    还有其他几种方法可以解决这个问题

  • 如果您不打算返回后台堆栈,可以替换控制器,而不是推送一个新的控制器
  • 您可以将use标记与
    popToTag(…)
    一起添加,以将堆栈展开到所需的控制器
  • 您可以使用
    getBackstack()
    以列表的形式获取后堆栈,然后使用该信息进行操作
  • 等等

  • 我认为,若你们删除了一大堆和你们所问的问题无关的代码,你们可能会得到更多的兴趣和帮助。一般来说,人们在处理问题时会比较容易,因为问题已经简化为最简单的代码来显示问题。我认为,如果你删除了一大堆与你所问问题无关的代码,你可能会获得更多的兴趣和帮助。人们通常更容易回答问题,这些问题已简化为显示问题的最简单代码。我理解代码中不清楚,但RecordFingerPulseController和HomeController之间有几个(比如N个)控制器。我不知道如何将它们全部弹出并回到家中。我从代码中不清楚这一点,但RecordFingerPulseController和HomeController之间有几个(比如N个)控制器。我想不出怎么把它们都打开回家。对不起,这些都不行。看来巴特刀处理onclick的方式有问题。无论我弹出哪个控制器,所有按钮都不响应onclick。如果您的项目,或者更好的简化版本,在GitHub上可用,我将很乐意为您构建并调试。抱歉,这些都不起作用。看来巴特刀处理onclick的方式有问题。无论我弹出哪个控制器,所有按钮都不响应onclick。如果您的项目,或者更好的简化版本,在GitHub上可用,我将很乐意为您构建并调试。