2016-10-01 4 views
0

ExpandableListView에 선택 (짧게 누르기)과 삭제 (길게 누르기)를 구현했습니다. 짧은 목록 항목 클릭 수는 onChildClick()에 의해 처리되고 긴 클릭 수는 onCreateContextMenu()에 의해 처리됩니다.Long-Click은 Listview의 컨텍스트 메뉴와 Android 7 장치의 선택을 모두 트리거합니다.

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 

    ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo; 
    mDeleteItemGroup = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
    mDeleteItemChild = ExpandableListView.getPackedPositionChild(info.packedPosition); 

    menu.setHeaderTitle("some title"); 
    MenuInflater inflater = mActivity.getMenuInflater(); 
    inflater.inflate(R.menu.menu_my_view_context, menu); 
} 

위의 그림은 긴 클릭을 잘 처리 한 컨텍스트 메뉴 코드입니다. 문제는 스타일 가능성이 부족하여 일부 기기에서 더 긴 제목을 자르는 것입니다. 다음과 같이 그래서 표준 컨텍스트 메뉴 대신 사용자 지정 대화 상자를 사용 :

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 

    ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo; 
    mDeleteItemGroup = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
    mDeleteItemChild = ExpandableListView.getPackedPositionChild(info.packedPosition); 

    String title = "some title"; 

    ConfirmDeletePopupFragment confirmDeletePopupFragment = ConfirmDeletePopupFragment.newInstance(title); 
    confirmDeletePopupFragment.setTargetFragment(this, 0); 
    confirmDeletePopupFragment.show(getActivity().getSupportFragmentManager(), "tag"); 
} 

이 여기에 안드로이드 7을 실행하는 넥서스 5 배를 제외한 모든 장치에서 잘 작동, 긴 클릭 상황에 맞는 메뉴와 선택을 모두 트리거 onChildClick을 통해, 분명히 내가 원하는 것은 아닙니다.

내 사용자 지정 대화 상자를 사용하면서 항목을 선택하지 못하게하려면 어떻게해야합니까?

+0

는 플래그는 상황에 맞는 메뉴가 이벤트를 처리하는 동안 선택을 음소거에 사용될 수 있지만 그 잘못 뭔가를 패치처럼 보인다. – jerry

답변

0

상황에 맞는 메뉴를 내 사용자 지정 대화 상자로 바꾸면 문제가있는 부분을 패치하는 현재 최적의 해결책이나 해결 방법을 제공 할 수 있습니다. 삭제 처리가 시작되면 선택 처리를 음소거하고 대화 상자의 콜백에서 음소거를 해제하는 것이 좋습니다.

이 방법이 효과적이지만, 처음에는이 방법을 사용하지 않는 것이 좋습니다. 아마 더 좋은 방법이있을 것입니다. 물론

public class MyListFragment extends ExpandableListFragment implements ConfirmDeletePopupFragment.DialogListener { 

    (...) 

    private boolean mMuteSelection = false; 

    (...) 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 

     mMuteSelection = true; 

     ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo; 
     mDeleteItemGroup = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
     mDeleteItemChild = ExpandableListView.getPackedPositionChild(info.packedPosition); 

     String title = "some title" 

     ConfirmDeletePopupFragment confirmDeleteWeakPopupFragment = ConfirmDeletePopupFragment.newInstance(title); 
     confirmDeletePopupFragment.setTargetFragment(this, 0); 
     confirmDeletePopupFragment.show(getActivity().getSupportFragmentManager(), "tag"); 
    } 

    (...) 

    @Override 
    public boolean onChildClick(ExpandableListView arg0, View arg1, int group, int child, long arg4) { 
     super.onChildClick(arg0, arg1, group, child, arg4); 

     if (!mMuteSelection) { 
      (handle selection) 
     } 
     return false; 
    } 

    (...) 

    @Override 
    public void onDeleteConfirm(boolean delete) { 
     if (delete) { 
      (handle deletion) 
     } 
     mMuteSelection = false; 
    } 
}