Android 浮动按钮不';第二次布线至导体控制器时,不工作
我用的是指挥家和小刀 我有一个BaseController在那里我做BN样板: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
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上可用,我将很乐意为您构建并调试。