我有兩個片段,片段A和片段B.片段A使用搖動手勢切換到片段B和片段B使用不同的手勢來切換回片段A.因此,當我在片段A的時候,我註冊手勢A與SensorManager配合使用,當檢測到晃動時,我取消註冊手勢A,切換到片段B,並向SensorManager註冊手勢B.Android Wear SensorManager中的潛在錯誤?
片段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註冊的所有手勢一次,檢查不同碎片/手勢不是理想的解決方案,因爲它變得非常混亂和複雜。有誰知道「清理」SensorManager的方法,以便它丟失對之前註冊/未註冊的偵聽器的所有引用?或者這只是Android Wear中的一個錯誤。我使用的設備是Moto360。謝謝。
你有沒有考慮重構代碼以使用狀態模式或命令模式,因爲很多你的代碼似乎是多餘的,你的問題可以很好地隱藏起來,苦苦追尋? –
我可能最終不得不使用狀態模式,但是,只要註冊和註銷監聽器就簡單多了。它在Android手機上正常工作沒有問題。 – Highway62