【发布时间】:2016-02-09 14:08:18
【问题描述】:
我有两个片段,片段 A 和片段 B。片段 A 使用摇晃手势切换到片段 B,片段 B 使用不同的手势切换回片段 A。所以当我在片段 A 中时,我向 SensorManager 注册手势 A,当检测到抖动时,我取消注册手势 A,切换到片段 B,然后向 SensorManager 注册手势 B。
片段 A:
public class FragmentA extends Fragment {
private MainWearActivity mMainWearActivity;
private SensorManager mSensorMgr;
private GestureA gestureA;
private OnShakeListener gestureAListener;
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMainWearActivity = (MainWearActivity) getActivity();
mSensorMgr = (SensorManager) mMainWearActivity.getSystemService(Activity.SENSOR_SERVICE);
gestureA = new GestureA();
gestureAListener = new OnShakeListener() {
@Override
public void onShake() {
gestureADetected();
}
};
gestureA.setOnShakeListener(gestureAListener);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_a, container, false);
return view;
}
@Override
public void onResume() {
super.onResume();
startListening();
}
@Override
public void onPause() {
stopListening();
super.onPause();
}
private void gestureADetected(){
mMainWearActivity.replaceFragment(mMainWearActivity.getFrag("B"));
}
private void startListening(){
mMainWearActivity.registerListener(gestureA);
}
private void stopListening(){
mMainWearActivity.unregisterListener(gestureA);
}
}
片段 B:
public class FragmentB extends Fragment {
private MainWearActivity mMainWearActivity;
private FragmentManager fm;
private SensorManager mSensorMgr;
private GestureB gestureB;
private OnShakeListener gestureBListener;
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMainWearActivity = (MainWearActivity) getActivity();
fm = mMainWearActivity.getFragmentManager();
mSensorMgr = (SensorManager) mMainWearActivity.getSystemService(Activity.SENSOR_SERVICE);
gestureB = new GestureB();
gestureBListener = new OnShakeListener() {
@Override
public void onShake() {
gestureBDetected();
}
};
gestureB.setOnShakeListener(gestureBListener);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_b, container, false);
return view;
}
@Override
public void onResume() {
super.onResume();
startListening();
}
@Override
public void onPause() {
stopListening();
super.onPause();
}
private void gestureBDetected(){
fm.popBackStackImmediate();
}
private void startListening(){
mMainWearActivity.registerListener(gestureB);
}
private void stopListening(){
mMainWearActivity.unregisterListener(gestureB);
}
}
如果我运行这个应用程序,并在片段 A 和片段 B 之间不断切换,几次后 SensorManager 会停止检测手势。在此设置工作正常的 Android 手机上,情况并非如此。
这只是我为检查行为是否可以复制而制作的一个小型测试应用程序,但我的实际应用程序要大得多,并且具有更多手势,因此只需使用 SensorManager 注册一次所有手势并检查不同的片段/gestures 不是一个理想的解决方案,因为它变得非常混乱和复杂。有谁知道“清理” SensorManager 以使其丢失对任何以前注册/未注册的侦听器的所有引用的方法?或者这只是 Android Wear 中的一个错误。我使用的设备是 Moto360。谢谢。
【问题讨论】:
-
您是否考虑过重构代码以使用状态模式或命令模式,因为您的许多代码似乎是多余的,而且您的问题可能被很好地隐藏且难以追踪?
-
我可能最终不得不使用状态模式,但是,注册和注销监听器会简单得多。它在 Android 手机上运行良好,没有任何问题。
标签: android wear-os android-sensors