web-dev-qa-db-ja.com

Android Lollipop、AppCompat ActionBarカスタムビューは画面幅全体を占有しません

そのため、コードベースをLollipopに更新したばかりで、アクションバーに問題があります。 AppCompatとActionBarActivityを使用し、カスタムビューを拡張しています。カスタムビューが画面の幅全体を占めなくなり、左側に細いストリップが残っているようです

Building with 19 昔の見た目

Building with 21 今の様子

これは、アクションバーを設定するために使用しているコードです。誰にもアイデアはありますか?

final ActionBar actionBar = getSupportActionBar();
if(actionBar != null) {
    actionBar.setDisplayHomeAsUpEnabled(false);
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    actionBar.setCustomView(R.layout.action_bar_content_search_custom_view);
    actionBar.setBackgroundDrawable(null);
    // actionBar.setStackedBackgroundDrawable(null);
    TextView title = (TextView) actionBar.getCustomView().findViewById(R.id.action_bar_title);
    title.setText(R.string.youtube);
    ImageView back = (ImageView) actionBar.getCustomView().findViewById(R.id.action_bar_back);
    back.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

編集

カスタムビューを取り出して背景を変更すると、幅全体が使用されます。問題は、CustomViewがActionBarの幅全体を占めるようにするにはどうすればよいかということです。

96
Stevie Kideckel

これは、最近のappcompat-v7アップデートのActionBarに対する最新の変更が原因であるようです。アクションバーの処理方法に大きな変更があるようです。

私は同じ問題に直面し、 ActionBar documentation を読んだ後、特に次の引用文で解決策を見つけました。

Android L(APIレベル21)で始まるアクションバーは、アプリケーションレイアウト内のツールバーウィジェットで表すことができます。アプリケーションは、アクティビティのアクションバーとして扱うツールバーをアクティビティに通知する場合があります。この機能を使用するアクティビティは、提供された.NoActionBarテーマのいずれかを使用し、windowActionBar属性をfalseに設定するか、ウィンドウ機能を要求しないでください。

私の見方では、AppCompatのテーマが変更され、一方ではいくつかの問題を解決するように見えましたが、他方でははるかに柔軟になりました。次の手順に従うことをお勧めします。

  1. 上記の引用で説明されているように、アクティビティで.NoActionBarスタイルを使用します
  2. アクティビティレイアウトにAndroid.support.v7.widget.Toolbarを追加します
  3. app:contentInsetStart="0dp"属性を設定します。 これは、質問で説明するマージンの主な問題です
<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/actionBar"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    app:contentInsetEnd="0dp"
    app:contentInsetStart="0dp" >
</Android.support.v7.widget.Toolbar>

通常、別のレイアウトファイルでそれを実行し、アクティビティレイアウトでincludeを使用することをお勧めします。複数のアクティビティで使用する場合は、ツールバーを1か所でカスタマイズするだけで済みます。

<include layout="@layout/view_action_bar" />
  1. アクティビティでfindViewByIdsetSupportActionBarを使用onCreateからsignal to the Activity which Toolbar should be treated as the Activity's action bar
Toolbar actionBar = (Toolbar) findViewById(R.id.actionBar);
setSupportActionBar(actionBar);
  1. これを行うと、onCreateOptionsMenuに追加されたすべてのアクションがツールバーに追加され、アクティビティアクションバーとして扱われます。
  2. 必要に応じてツールバーをさらにカスタマイズします(子ビューの追加など)
110
Muzikant

Muzikantthis answer のように多くの作業を行う代わりに

    getSupportActionBar().setDisplayShowHomeEnabled(false);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
    LayoutInflater mInflater = LayoutInflater.from(this);

    View mCustomView = mInflater.inflate(R.layout.action_bar_home, null);
    getSupportActionBar().setCustomView(mCustomView);
    getSupportActionBar().setDisplayShowCustomEnabled(true);
    Toolbar parent =(Toolbar) mCustomView.getParent();//first get parent toolbar of current action bar 
    parent.setContentInsetsAbsolute(0,0);// set padding programmatically to 0dp

問題を解決するには、最後の2行のコードのみを追加する必要があります。

これがあなたと他の誰にも役立つことを願っています。

UPDATE:いくつかの調査を行った後、このソリューションが機能しない場合があることがわかりました。左側のギャップ(HOMEまたはBACK)はこれで削除されますが、右側のギャップ(MENU)はそのまま残ります。これらの場合の解決策を以下に示します。

View v = getSupportActionBar().getCustomView();
LayoutParams lp = v.getLayoutParams();
lp.width = LayoutParams.MATCH_PARENT;
v.setLayoutParams(lp);

上記のコードにこれらの4行を追加して、サポートアクションバーから右側のギャップも削除します。

51
Amrut Bidri

スタイルでもそれができると思います。これを試して。 KitKatでテストしました

<style name="AppTheme" parent="Theme.AppCompat">
  <item name="toolbarStyle">@style/AppThemeToolbar</item>
</style>

<style name="AppThemeToolbar" parent="Widget.AppCompat.Toolbar" >
  <item name="contentInsetStart">0dp</item>
</style>
31
GDA

他の答えはどれも役に立たなかったので、実際のAppCompat v7スタイルを見てみました。 here が見つかりました。

Base.Widget.AppCompat.ActionBarスタイルを見ると、次のものがあります。

<item name="contentInsetStart">@dimen/abc_action_bar_content_inset_material</item>
<item name="contentInsetEnd">@dimen/abc_action_bar_content_inset_material</item>

したがって、明らかに、独自のアクションバースタイルでこれらのプロパティをオーバーライドする必要があります。

<style name="ActionBar" parent="@style/Base.Widget.AppCompat.ActionBar">
        <item name="contentInsetStart">0dp</item>
        <item name="contentInsetEnd">0dp</item>
</style>

これは私にとってはうまくいきました。他の人にも役立つことを願っています。

8
Justin

モニターに対して頭をmuchりつけた後、これは私のために働いた

 Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
        toolbar.setContentInsetStartWithNavigation(0);
        toolbar.setContentInsetEndWithActions(0);
        toolbar.setContentInsetsAbsolute(0, 0);
        toolbar.setPadding(0, 0, 0, 0);

GetCustomView()。getParent()はトリックをしたものです

1
user330844

あなたのコードに加えてこれらの2行を書きます

Toolbar toolbar=(Toolbar)viewActionBar.getParent();
toolbar.setContentInsetsAbsolute(0,0);
0

今日もこの問題に遭遇しましたが、Android St​​udioによって自動的に生成されたres/values-v21/styles.xmlがプロジェクト内にあることがわかりました。それが原因です。

どうして?

私のres/values-v21/styles.xmlのコンテンツは:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="BaseAppTheme" parent="Android:Theme.Material.Light">
    </style>
</resources>

そして、私のres/values/styles.xmlには次のようなものが含まれていました。

<style name="BaseAppTheme" parent="Android:Theme.Holo.Light">
    <!-- Customize your theme here. -->
    <item name="Android:windowContentOverlay">@null</item>
    <item name="Android:soundEffectsEnabled">false</item>
</style>

その後、Lollipopでアプリを実行したときにres/values-v21/styles.xmlが使用されたため、OPで発生した正確な問題が発生しました。だから私は単純な修正に来たのは削除するだけです:

    <style name="BaseAppTheme" parent="Android:Theme.Material.Light">
    </style>

res/values-v21/styles.xml

0
Leo

ポイントへ:

 ActionBar actionBar = getSupportActionBar();
                actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
                actionBar.setCustomView(R.layout.actionbar_layout);
                Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
                    toolbar.setContentInsetsAbsolute(0, 0);
                    toolbar.setPadding(0, 0, 0, 0);

必ず正しいツールバーをインポートしてください-Android.support.v7.widget.Toolbar;

0
Salman Anjum