3

アプリにActionbarsherlockを使用していて、コードでアクションバーオーバーレイモードを切り替えるのが好きです。2つのフラグメントがあります(1つは半透明のアクションバーが必要なMapviewです)、もう1つはソリッドなアクションバーが必要なListFragmentです。

やってみた

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>

アクティビティ/フラグメント内でfalseにするには?

4

1 に答える 1

3

編集:残念ながら、互換性パッケージのActionbarsherlockとListFragmentでは機能しません。なんらかの理由で上マージンが下マージンに追加されます。LayoutListener内で左右のマージンが正常に機能しています。

Android開発者の例でこの問題の解決策を見つけました

// 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);
        }
    }
};
于 2012-04-13T09:27:07.467 に答える