2012-03-21 4 views
4

다양한 옵션 목록으로 컨텍스트 메뉴를 여는 버튼이 있습니다. 한 번에 하나의 옵션 만 선택할 수 있으므로 현재 선택된 항목을 강조 표시하는 각 옆에 라디오 버튼을 갖기를 원합니다. 상황에 맞는 메뉴에서 항목을 선택하면 라디오 버튼이 선택되고 닫힙니다. 컨텍스트 메뉴를 열기 위해 버튼을 클릭하면 이전에 선택한 항목이 선택되지 않습니다.안드로이드 체크 가능 컨텍스트 메뉴가 체크되지 않음

이전에 선택한 항목을 기억하도록 상황에 맞는 메뉴를 표시하려면 어떻게합니까?

두 번째로 활동이 처음 생성 될 때 기본 옵션이 선택됩니다. 다른 컨텍스트 메뉴 항목을 선택하면 덮어 쓸 수있는 초기 기본값을 어떻게 설정합니까? XML에 android:checked="true"을 설정할 수 있지만 다른 항목을 선택하면이를 덮어 쓸 수 있습니까?

자바 :

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.browse); 
    Button buttonView = (Button) this.findViewById(R.id.button_view); 
    buttonView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      registerForContextMenu(v); 
      openContextMenu(v); 
     } 
    }); 
} 

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    menu.setHeaderTitle(R.string.menu_title); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context_menu, menu); 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
     case(R.id.item1): 
      if(item.isChecked()) { 
       item.setChecked(false); 
      } else { 
       item.setChecked(true); 
      } 
      break; 
     case(R.id.item2): 
      if(item.isChecked()) { 
       item.setChecked(false); 
      } else { 
       item.setChecked(true); 
      } 
      break; 
     case(R.id.item3): 
      if(item.isChecked()) { 
       item.setChecked(false); 
      } else { 
       item.setChecked(true); 
      } 
      break; 
     default: 
      return super.onContextItemSelected(item); 
    } 
    return true; 
} 

XML :

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <group android:id="@+id/context_menu" android:checkableBehavior="single"> 
     <item android:id="@+id/item1" 
      android:title="@string/context_menu_item1" /> 
     <item android:id="@+id/item2" 
      android:title="@string/context_menu_item2" /> 
     <item android:id="@+id/item3" 
      android:title="@string/context_menu_item3" /> 
    </group> 
</menu> 

이 어떤 도움을 주시면 감사하겠습니다!

답변

14

문제는 항목 메뉴의 표시 사이에 상태를 저장하지 않는 것입니다. 그래서 setChecked를 호출 할 때마다 현재 표시된 메뉴에 대해서만 작동하고 다음에 대해서는 재설정됩니다.

예를 들어 부울 배열과 같은 외부 구조에 선택 상태를 저장해야합니다.

MenuItem mi = menu.findItem(R.id.item2) 
+0

그래서 선택하면 사용자 입력을 저장합니다. 그러면 다음에 컨텍스트 메뉴가 열릴 때이 항목을 선택 항목으로 표시하는 방법은 무엇입니까? – tavocado

+0

답변을 업데이트했습니다. 따라서 onCreateContextMenu를 사용하고 여기에 checked 상태를 설정해야합니다. – asktomsk

+0

이제는 잘 작동합니다! 당신의 도움을 주셔서 감사합니다 :) – tavocado

1

글쎄, 어딘가에 사용자 입력을 저장하고 레이아웃을 부 풀린 다음 명시 적으로 상태를 설정해야합니다. 그런데

, 당신은 선택 스위치과 같이 항목을 작성할 수

switch (item.getItemID()) { 
case R.id.item1: 
case R.id.item2: 
case R.id.item3: 
    item.setChecked(!item.isChecked()); 
} 
+0

각각의 경우가 바로이 있지만 난 그냥 예를 들어이 예전보다 더 포함 메뉴 항목을 검색하기 위해

@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle(R.string.menu_title); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); // loop for menu items for (int i = 0; i < menu.size(); ++i) { MenuItem mi = menu.getItem(i); // check the Id as you wish if (mi.getItemId() == R.id.item2) { mi.setChecked(true); } } } 

은 또한있는 FindItem 기능을 사용할 수 있습니다. 귀하의 단순화 된 setChecked()에 +1! 사용자 입력을 얻으려면 어떻게해야합니까? – tavocado

+0

item.isChecked()는 사용자 입력입니다. Btw,이 질문에 충분히 대답하지 않으면 StackOverflow 당신에게 새로운 질문을 시작할 것이라고 생각합니다 ... – Bondax

관련 문제