2012-04-10 71 views
3

我使用Actionbarsherlock为我的应用程序,我喜欢在我的代码中切换操作栏覆盖模式。 我有2个片段(其中一个是Mapview,我想要一个半透明的Actionbar)另一个是ListFragment,其中需要一个坚实的Actionbar。Actionbarsherlock开关操作栏覆盖模式编程

我tryed

requestWindowFeature((int) Window.FEATURE_ACTION_BAR & ~Window.FEATURE_ACTION_BAR_OVERLAY); 

问题,这是添加内容之前请求功能只适用。

我使用此样式以实现透明动作条

<style name="TransparentActionbar" parent="@style/Theme.Sherlock" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item name="windowActionBarOverlay">true</item> 
    <item name="windowActionModeOverlay">true</item> 
    <item name="abBackground">#96000000</item> 
    <item name="abDivider">@null</item> 
</style> 

是有办法来设置

<item name="windowActionBarOverlay">true</item> 
<item name="windowActionModeOverlay">true</item> 

到假活性/片段内?

回答

3

编辑:可惜它不适用于ActionBarsherlock和兼容包中的ListFragment。 出于某种原因,上限保证金被添加到底部保证金中。在LayoutListener内左右边距工作正常。

找到此问题的解决方案在Android Developer Example

// Attach a GlobalLayoutListener so that we get a callback when the layout 
// has finished drawing. This is necessary so that we can apply top-margin 
// to the ListView in order to dodge the ActionBar. Ordinarily, that's not 
// necessary, but we've set the ActionBar to "overlay" mode using our theme, 
// so the layout does not account for the action bar position on its own. 
ViewTreeObserver observer = getListView().getViewTreeObserver(); 
observer.addOnGlobalLayoutListener(layoutListener); 

// Because the fragment doesn't have a reliable callback to notify us when 
// the activity's layout is completely drawn, this OnGlobalLayoutListener provides 
// the necessary callback so we can add top-margin to the ListView in order to dodge 
// the ActionBar. Which is necessary because the ActionBar is in overlay mode, meaning 
// that it will ordinarily sit on top of the activity layout as a top layer and 
// the ActionBar height can vary. Specifically, when on a small/normal size screen, 
// the action bar tabs appear in a second row, making the action bar twice as tall. 
ViewTreeObserver.OnGlobalLayoutListener layoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     int barHeight = getActivity().getActionBar().getHeight(); 
     ListView listView = getListView(); 
     FrameLayout.LayoutParams params = (LayoutParams) listView.getLayoutParams(); 
     // The list view top-margin should always match the action bar height 
     if (params.topMargin != barHeight) { 
      params.topMargin = barHeight; 
      listView.setLayoutParams(params); 
     } 
     // The action bar doesn't update its height when hidden, so make top-margin zero 
     if (!getActivity().getActionBar().isShowing()) { 
      params.topMargin = 0; 
      listView.setLayoutParams(params); 
     } 
    } 
}; 
+0

谢谢你的男人。你已经解决了我的问题。 – tasomaniac 2013-05-28 10:39:50

+1

伟大的发现,正是我所需要的。对于那些阅读还有一件事:在示例中,他们还从'onDestroyView()'中的'ViewTreeObserver'中移除了'OnGlobalLayoutListener'。像这样:'getListView()。getViewTreeObserver()。removeGlobalOnLayoutListener(mLayoutListener);'可能很重要。 – 2014-11-08 00:51:34