2014-01-17 2 views
2

MainActivity가 AsyncTask를 호출하여 일부 네트워크 I/O를 수행합니다. AsyncTask가 시작되면 ActionBar의 아이콘을 '밝게'하고 싶습니다. AsyncTask가 완료되면, ActionBar 아이콘을 보이지 않게하고 싶습니다. 예를 들어 AsyncTask 완료시 버튼 클릭이 아닌 아이콘을 표시하고 싶습니다.ActionBar 아이콘을 동적으로 표시/표시하지 않음

이 시점에서 AsyncTask 시작시 ActionBar 아이콘을 성공적으로 표시 할 수 있습니다. AsyncTask 완료시 AsyncTask가 완료되었음을 나타 내기 위해 MainActivity로 다시 브로드 캐스트를 보냅니다. 이 방송을 사용하여 ActionBar 아이콘을 보이지 않게 할 수 있어야합니다. InvalidateMenuOptions()를 사용하여 onPrepareMenuOptions를 다시 만들고 ActionBar 아이콘을 보이지 않게 만들려고 시도했지만 작동하지 않습니다. 여기 내 시도는 지금까지입니다 - 모든 코드가 MainActivity에서 내 MainActivity 클래스

발췌에서 발췌 :

public class MainActivity extends Activity { 
    private static boolean dataXferRunning = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final ActionBar actionBar = getActionBar(); 
     actionBar.setHomeButtonEnabled(true); 

     // broadcast receiver to determine if BasestationTransfer is active 
     basestationBroadcastReceiver = new BasestationBroadcastReceiver(); 
     basestationIntentFilter = new IntentFilter("XFER_RUNNING_ACTION"); 

     boolean hasWifi = CWICUtil.getNetworkState(this); 
     if(hasWifi) { 
      if(dataXferRunning == false) { 
       containerCount = 0; 
       DBAdapter dbAdapter = CWICApplication.dbAdapter(); 
       try { 
        containerCount = (int)dbAdapter.getUnsentContainersCount(); 
       } catch (SQLException e) { 
        Log.e(TAG, "getUnsentContainersCount() failed: " + e.toString()); 
        e.printStackTrace(); 
       } 
       if(containerCount > 0) { 
        invalidateOptionsMenu(); 
        startTransfer(); //AsyncTask 
        invalidateOptionsMenu(); 
       } 
      } 
     } 
    } 
} 

내 BroadcastReciever :

public static class BasestationBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     intent.getAction(); 
     boolean isRunning = intent.getBooleanExtra("XFER_RUNNING", false); 
     if(isRunning) { 
      dataXferRunning = true; 
     } else { 
      dataXferRunning = false; 
     } 
    } 
}; 

내 onPrepareOptionsMenu :

@Override 
public boolean onPrepareMenuOptions(Menu menu) { 
    if(dataXferRunning) { 
     menu.findItem(R.id.action_socketServiceConnected).setVisible(true); 
    } else { 
     menu.findItem(R.id.action_socketServiceConnected).setVisible(false); 
    } 
    return super.onPrepareOptionsMenu(menu); 
} 

요약하면 - AsyncTask에서 공동으로 방송을 성공적으로 수신하고 있습니다. 값을 수정하십시오. buttonClick을 사용하여이 작업을 수행하는 많은 코드를 보았지만 AsyncTask가 완료되면 내 ActionBar 아이콘이 동적으로 보이지 않습니다. 또한 - 이것은 내 첫 번째 게시입니다. 지금 몇 달 동안 나를 잼에서 벗어나게했기 때문에이 커뮤니티 덕분에 문제를 명확히 할 수 있는지 알려 주시기 바랍니다.

답변

2

onCreateOptionsMenu()에서는이 같은 (클래스 변수, 또는 원하는 다른 메커니즘을 통해) 당신의 Menu 객체의 참조에 저장할 수 :

Menu menu; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getSupportMenuInflater().inflate(R.menu.my_menu, menu); 
    this.menu = menu;  

    return true; 
} 

을 그리고, 동적를 원하는 경우 메뉴 항목의 가시성을 조정하면 해당 메뉴 객체 참조를 다시 사용하여 menu.findItem(R.id.myId)으로 호출하여 개별 메뉴 항목을 가져 와서 속성을 동적으로 조정할 수 있습니다.

+0

도움 주셔서 감사합니다. 'onPrepareOptionsMenu (메뉴 메뉴) 및 'menu.findItem (R.id.xxx) .setVisible에서 (거짓에게, 나는 (사실) 'menu.findItem (R.id.xxx) .setVisible을하고 결국); ' in BroadcastReceiver – hooverbox

+0

예, 문제는 내가 방송인 이후에 onCreateOptionsMenu가 호출되어 실제 옵션이 절대로 어떤 이유로 든 활성화되지 않는다는 것입니다. – Maxrunner

관련 문제