0

TLDR : 조각에 메뉴 항목을 추가하면 onTabSelected가 무한대로 호출됩니다.탭과 단편 메뉴가 Android에서 호환되지 않습니까?


Android 4.0 이상용 앱에서 작업 중이며 문제가 있습니다. 현재 ActionBar을 탭으로 사용하고 있습니다. 탭을 클릭하면 onTabSelected(Tab, FragmentTransaction) 메서드가 한 번 호출되고 화면에 표시된 조각을 전환합니다. 방법은 다음과 같습니다.

@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    onTabSelected(tab, ft); 

} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    FragmentManager fragmentManager = getFragmentManager(); 
    switch(tab.getPosition()) { 
     case 0 : 
      fragmentManager.beginTransaction() 
       .replace(R.id.buttons_box, ButtonsFragment.newInstance(0)) 
       .commit(); 

      fragmentManager.beginTransaction() 
       .replace(R.id.container, ControlsFragment.newInstance(0)) 
       .commit(); 
      break; 
     case 1 : 
     ... 
     case 2 : 
     ... 
    } 
} 

조각에 메뉴 항목을 추가하려고 할 때 문제가 발생합니다. ControlsFragment, 나는 다음과 같은 방법 추가 :

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
{ 
    inflater.inflate(R.menu.controls, menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch(item.getItemId()) 
    { 
     case R.id.control_1 : 
     Toast.makeText(getActivity(), "Clicked Control 1", Toast.LENGTH_SHORT).show(); 
     return true; 
     default : 
     return super.onOptionsItemSelected(item); 
    } 

} 

을 그리고 onCreate(Bundle)에서이 라인을 추가 : 응용 프로그램이 실행될 때, 첫 번째 탭이 기본적으로 선택과 방법, 지금은

setHasOptionsMenu(true); 

을 내 활동의 onTabSelected이 반복해서 호출됩니다. 왜 이런 일이 발생합니까? 탭과 단편 메뉴 항목이 호환되지 않습니까?

편집

나는 onTabReselected에서 onTabSelected에 대한 호출을 제거했지만,이 문제가 해결되지 않았다.

+0

그들은 호환되지 안된다. 액션 바 (네이티브 API 레벨 11 AppCompat ActionBarSherlock)와 프래그먼트 (네이티브 API 레벨 11 안드로이드 지원 백 포트)의 구현은 무엇을 사용하고 있습니까? BTW, 거기에 하나의 대신에 두 개의'FragmentTransactions'을 사용하는 이유가 있습니까? – CommonsWare

+0

@CommonsWare 나는 네이티브 모든 것을 사용하고 있습니다 - API 14+. 두 개의 'FragmentTransactions'에 관해서는 - 나는'Fragment'를 많이 사용하지 않았으며, 어떻게 작동하는지 잘 모르고 있습니다. 두 번째 트랜잭션의 첫 번째 트랜잭션에'replace' 라인을 추가하는 것이 좋을까요? – Phil

+0

"두 번째 트랜잭션의 행을 첫 번째 트랜잭션으로 바꾸기 만하면됩니까?" - 조금 더 효율적입니다. 그것이 당신의 문제에 도움이 될지도 모르겠지만, 그것은 저를 놀라게 할 것입니다. 그런 다음 문제 자체가 나를 놀라게합니다. – CommonsWare

답변

0

이 문제로 인해 여러 가지 문제가 발생하여 간단한 해결책을 찾았습니다. 이 간단한 해킹은 이상한 문제를 해결합니다.

  1. 변수를 만듭니다

    private Tab currentTab; 
    
  2. onTabSelected의 맨 위에 다음 줄을 추가합니다

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
        if (currentTab == null) 
         currentTab = tab; 
        else if (currentTab == tab) 
         return; 
        else 
         currentTab = tab; 
        //your code here 
    } 
    
관련 문제