2013-05-15 1 views
1

내 응용 프로그램에서 일부 사용자 정의 ActionMode를 사용합니다. 액션 모드가 닫히면 관련된 뷰를 닫거나 변경 사항을 업데이트하는 등의 하우스 키핑을합니다. OnDestroyActionMode에서 닫힌 액션 모드를 감지합니다.ActionMode 중첩 감지

제 문제는 내 ActionMode 중 일부에서 사용자가 다른 시스템 actionmode (텍스트 복사/붙여 넣기/선택)를 트리거 할 수 있다는 것입니다. 이 경우 onDestroyActionMode가 호출되고 사용자가 실수로 "스택"기능을 구현하는 대신 첫 번째 actionmode를 수행하게됩니다. 따라서이 onDestroyActionMode를 무시하고 사용자가 텍스트를 편집/잘라내어 변경할 수있게 한 다음 다시 엽니 다. 완료되면 이전 actionmode.

어떻게하면됩니까?

답변

0

허니 콤 이전에 TextView에서 longPress를 사용하면 '단어 선택', '모두 선택', '사전 추가'등의 옵션이있는 팝업 창이 나타납니다. 표시 될 때와 닫을 때 모두 기존 ActionMode에 영향을줍니다 (뒤로 누름). 그래서 이것은 실제로 벌집 벌레 문제가 아닙니다.

HTC Sense에 대한 더 많은 조명 : Sense는 텍스트 선택 기능에 ActionMode를 사용하지 않으므로 TextView.setCustomSelectionActionModeCallback()을 존중하지 않습니다. 물론 나머지 지역에서도 가능합니다. 그래서이 문제는 그 상황에서 다른 냄새가 있습니다. (저는 Sense에서 다음과 같은 해결책을 테스트하지 않았기 때문에 어떻게 행동 할 것인지 잘 모릅니다).

해결책은 사용자 지정 ActionMode.Callback을 만들어 운영 체제를 대체하고 원하는 TextView 및/또는 EditText의 setCustomSelectionActionModeCallback()에서 적용합니다 (장치가 벌집 이상을 실행하는 경우에만 가능). custom onTextSelectionCABDestroyed 콜백 인터페이스를 사용자 정의 ActionMode.Callback에 전달하고 onDestroyActionMode 메소드에서 호출합니다.

public interface YourCallbackInterface { 
    public void onTextSelectionCABDestroyed(); 
} 

새로운 클래스를 만들 :

첫째 인터페이스를 만들고 원래 ActionMode의 휴양을 처리 할 위치를 구현 (또는 당신은 오토 같은과 버스 이벤트를 사용할 수 있습니다) :

public final class CustomTextSelectionActionModeCallback implements ActionMode.Callback { 
WeakReference<YourCallbackinterface> mYourCallbackinterface; 
public CustomTextSelectionActionModeCallback(YourCallbackinterface yourCallbackInterface) { 
    mYourCallbackinterface = new WeakReference<YourCallbackinterface>(yourCallbackInterface); 
} 
@Override 
public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
    return false; 
} 
@Override 
public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
    return true; //returning true will create the ActionMode 
} 
@Override 
public void onDestroyActionMode(ActionMode mode) { 
    //this is the magic where we actually capture the destroy event for TextSelectionCAB and can subsequently do things like recreate the ActionMore that TextSelectionCAB greedily destroyed! 
    mYourCallbackinterface.get().onTextSelectionCABDestroyed(); 
} 
@Override 
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
    return false; 
} 

}

그리고의 onDestroyActionMode에서 ActionMode을 다시 할 때있는 StackOverflowException을 방지하기 위해 기억 Reopen ActionMode (or CAB) after onDestroyActionMode is called

마지막을, 당신이 당신의 CustomTextSelectionActionModeCallback 오히려 com.actionbarsherlock.view보다 android.view.ActionMode.Callback를 구현 있는지 확인 ActionBarSherlock의를 사용하는 경우 : N ActionMode, 나는 여기에 설명이 같은 핸들러에의 Runnable을 postDelayed. ActionMode.Callback.

참고 : ActionBarCompat를 사용 해본 적이 없으므로이 모든 것이 어떻게 적용되는지 잘 모르겠습니다. 누군가가 알고 있으면 의견으로 게시하십시오!

+0

답장을 보내 주셔서 감사합니다. 마지막으로 onDestroyActionMode가 사용자 상호 작용에 의해 호출되었는지 또는 다른 actionmode를 열기 위해 시스템에서 신뢰할 수있는 방법을 찾지 못했기 때문에 전체 상황을 피하기 위해 응용 프로그램 구조를 변경하기로 결정했습니다. 내 응용 프로그램은 수십개의 중첩 된 액션 모드가있는 복잡한 논리를 가지고 있기 때문에 끔찍한 까다로운 일이 있습니다 ... 어쨌든 actionmode의 흥미로운 기능을 보여주기 때문에 대답을 수락합니다. – rupps

+0

이 문제로 인해 많은 사람들이 ActionMode라는 고통의 위험한 협곡을 피할 수 있다고 생각합니다. 그러나 해결책이 지금 있습니다. – straya