2015-05-08 60 views
2

我試圖切換顯示/隱藏操作欄上活動的用戶點擊,所以我在活動中實現這一功能是這樣的:動作欄隱藏,並且之後立即顯示

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    Log.d("ACTION BAR", "triggered"); 

    super.dispatchTouchEvent(ev); 

    ActionBar actionBar = getSupportActionBar(); 
    actionBar.hide(); 

    if (actionBar.isShowing()) { 
     actionBar.hide(); 
    } else { 
     actionBar.show(); 
    } 

    return true; 
} 

然而,問題是當點擊活動時,操作欄會被隱藏,然後立即再次顯示。我已經添加了日誌記錄,看起來這個方法被觸發了兩次,爲什麼呢?

回答

4

我想dispatchTouchEvent可能叫下來兩個時間上的觸摸和後續行動所以採取一個布爾標誌和顯示操作欄前檢查此標誌值:

private boolean isManuallyHideShownActionBar; 

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    super.dispatchTouchEvent(ev); 

    ActionBar actionBar = getSupportActionBar(); 

    if(!isManuallyHideShownActionBar){ 
     if (actionBar.isShowing()) { 
      actionBar.hide(); 
     } else { 
      actionBar.show(); 
     } 
     isManuallyHideShownActionBar = true; 
    }else{ 
     isManuallyHideShownActionBar = false; 
    } 

    return true; 
} 
+0

感謝,現在它的一半工作:)。當我觸摸一個活動時,操作欄會隱藏起來 - 所以在這裏可以,但是當我再次觸摸時,操作欄會立即顯示,然後立即隱藏,下一次觸摸就會正常工作並顯示操作欄。爲什麼這樣?我也在想,也許我採取了錯誤的做法,因爲我需要在點擊時顯示操作欄,但不需要在longclick上顯示 - 您可以根據我正在使用的方法正確性來評論意見嗎?你將如何實現它? –

+0

現在,我嘗試糾正我的代碼,你可以請檢查更新的代碼? –

+0

是的,現在工作正常,謝謝,但正如我所說,我認爲我從一開始就選擇了錯誤的方法。我需要確定它是否是第一次長時間點擊,如果它不只是顯示操作欄。任何想法如何做到這一點? –