アプリケーションに新しいAndroid Navigation Drawerを実装しようとしています。Drawerセットアップとリスナーを処理するBaseActivity.Javaを作成しました。この基本クラスを拡張する2つのサブアクティビティがあります。 2番目のアクティビティでは、次の属性を使用して、異なるアクションバースタイルを使用する予定です。
<item name="Android:windowActionBarOverlay">true</item>
<item name="Android:background">@Android:color/transparent</item>
レイアウトに画像ヘッダーがあるので、アクションバーを透明にし、コンテンツをより豊かにします。
私はそれを達成しましたが、問題は、コンテンツが拡張されてActionBarをオーバーレイとして使用する余分なスペースを利用するため、ナビゲーションドロワー自体も拡張され、ActionBarと重なり、かなりひどいことです。見た目のレイアウト:
私がしたいのは、余分なスペースを占める実際のコンテンツ(フラグメントが入力されるフレームレイアウト)ですが、Playミュージックアプリと同様に、ナビゲーションドロワーをアクションバーの下に置いたままにします。
それを実現するために私が何ができるかについてのアイデアはありますか?
[〜#〜] edit [〜#〜]したがって、Ahmadの支援に従って、marginTop
をListViewのみに設定しました。レイアウトは次のとおりです。
<!-- The navigation drawer -->
<ListView Android:id="@+id/left_drawer"
Android:layout_marginTop="?android:attr/actionBarSize"
<!-- This was added after seeing the crazy effect, but does nothing -->
Android:layout_marginBottom="0dp"
Android:layout_marginLeft="0dp"
Android:layout_marginRight="0dp"
Android:layout_width="240dp"
Android:layout_height="fill_parent"
Android:layout_gravity="start"
Android:choiceMode="singleChoice"
Android:background="?attr/listviewBackground"
/>
そして今、それは上面にうまく機能しますが、何らかの理由でビューの下部にもマージンがあり、それは私にはまったく意味がありません。 これはスクリーンショットです 。
何が原因かわからない:(
誰かがこの質問の別の見方に興味がある場合。これが起こったことです。
次のように、リストビューの上部にマージンのみを設定してみました。
Android:layout_marginTop="?android:attr/actionBarSize"
しかし、編集された質問で述べたように、レイアウトリソースファイルに設定されていなくても、下部にマージンがあるという奇妙な動作がありました。
そのため、私はPlayミュージックアプリを注意深く見ていましたが、実際にはマージンではなく一部のパディングであり、さらに、パディングで指定されたスペースを透明色で塗りつぶすカスタム背景を使用していることに気付きました。
これが私がしたことです:
マージンではなく、ListViewの上部にパディングを設定します。
Android:paddingTop="?android:attr/actionBarSize"
前述のように、寸法はデバイスごとに異なるため、寸法をハードコーディングしないことが重要です。
それは次のように見えます:
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item>
<shape Android:shape="rectangle">
<solid Android:color="#80000000" />
</shape>
</item>
<item Android:top="@dimen/action_bar_default_height">
<shape
Android:shape="rectangle">
<solid Android:color="@color/light_gray" />
</shape>
</item>
ドローアブルで?android:attr/actionBarSize
を使用しようとしたが、アプリが強制終了したことに注意してください。代わりに、grepcodeを検索して、アクションバーのサイズが異なるいくつかのdimenファイルを見つけたので、それらを自分のプロジェクトのdimenファイルに追加しました。
その後、私は見栄えが良いと思います。スクリーンショットで、リストビューとアクションバーが重なっておらず、リストビューの透明部分がちょうどいいサイズであることに注意してください。
これがどのようにして実現するのかと思っていた人を助けることを願っています。
そして今、それは上部側に適していますが、何らかの理由でビューの下部にもマージンがあり、それは私にはまったく意味がありません。こちらがスクリーンショットです。
リストビューの重力をstart | bottomに設定すると、問題が解決します。下部に余白は追加されません。 DrawerLayoutのデフォルトの重力がstart | centerのように見えます
<ListView
Android:id="@+id/left_drawer"
Android:layout_marginTop="?android:attr/actionBarSize"
Android:layout_width="240dp"
Android:layout_height="match_parent"
Android:layout_gravity="start|bottom"/>
レイアウトの上部にマージンを設定して、コンテンツがActionBarの下に描画されるようにすることができます。
これを親レイアウトに追加するだけです:
Android:layout_marginTop="?android:attr/actionBarSize"
属性actionBarSize
は、ご想像のとおり、ActionBar
のサイズを指します。絶対値をマージンとして設定することはできません。これは、ActionBar
がすべてのAndroidデバイス間で常に同じサイズであるとは限らないためです(タブレットでは大きく、携帯電話では小さくなります)。 )。
編集:
マージンをListView
に設定します。
<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<FrameLayout
Android:id="@+id/content_frame"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<ListView
Android:id="@+id/left_drawer"
Android:layout_marginTop="?android:attr/actionBarSize"
Android:layout_width="240dp"
Android:layout_height="match_parent"
Android:layout_gravity="start"/>
</Android.support.v4.widget.DrawerLayout>
Googleミュージックアプリでも同じことができます。
私はpaddingTopを使用してこの問題を解決しました:
<FrameLayout
Android:id="@+id/menu_frame"
Android:layout_width="240dp"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:paddingTop="?attr/actionBarSize" >
<ListView
Android:id="@+id/left_drawer_list"
Android:layout_width="240dp"
Android:layout_height="match_parent" />
</FrameLayout>
それが役に立てば幸い
上記のガイドに従って動作するデモを作成し、2.xから5.xでテストしました
Github からクローンを作成できます
遊ぶのに重要なのはメインアクティビティです
toolbar = (Toolbar) findViewById(R.id.toolbar);
res = this.getResources();
this.setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop)
{
ScrimInsetsFrameLayout scrimInsetsFrameLayout = (ScrimInsetsFrameLayout)
findViewById(R.id.linearLayout);
scrimInsetsFrameLayout.setOnInsetsCallback(this);
}
そしてコールバック
@Override
public void onInsetsChanged(Rect insets) {
Toolbar toolbar = this.toolbar;
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)
toolbar.getLayoutParams();
lp.topMargin = insets.top;
int top = insets.top;
insets.top += toolbar.getHeight();
toolbar.setLayoutParams(lp);
insets.top = top; // revert
}
絶対にV21のテーマが魔法をかける
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- API 21 theme customizations can go here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/accent_material_light</item>
<item name="windowActionModeOverlay">true</item>
<item name="Android:windowDrawsSystemBarBackgrounds">true</item>
<item name="Android:statusBarColor">@Android:color/transparent</item>
<item name="Android:windowTranslucentStatus">true</item>
</style>