そのため、コードベースをLollipopに更新したばかりで、アクションバーに問題があります。 AppCompatとActionBarActivityを使用し、カスタムビューを拡張しています。カスタムビューが画面の幅全体を占めなくなり、左側に細いストリップが残っているようです
昔の見た目
今の様子
これは、アクションバーを設定するために使用しているコードです。誰にもアイデアはありますか?
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の幅全体を占めるようにするにはどうすればよいかということです。
これは、最近のappcompat-v7
アップデートのActionBar
に対する最新の変更が原因であるようです。アクションバーの処理方法に大きな変更があるようです。
私は同じ問題に直面し、 ActionBar
documentation を読んだ後、特に次の引用文で解決策を見つけました。
Android L(APIレベル21)で始まるアクションバーは、アプリケーションレイアウト内のツールバーウィジェットで表すことができます。アプリケーションは、アクティビティのアクションバーとして扱うツールバーをアクティビティに通知する場合があります。この機能を使用するアクティビティは、提供された.NoActionBarテーマのいずれかを使用し、windowActionBar属性をfalseに設定するか、ウィンドウ機能を要求しないでください。
私の見方では、AppCompat
のテーマが変更され、一方ではいくつかの問題を解決するように見えましたが、他方でははるかに柔軟になりました。次の手順に従うことをお勧めします。
.NoActionBar
スタイルを使用しますAndroid.support.v7.widget.Toolbar
を追加します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" />
findViewById
とsetSupportActionBar
を使用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);
onCreateOptionsMenu
に追加されたすべてのアクションがツールバーに追加され、アクティビティアクションバーとして扱われます。Muzikant や this 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行を追加して、サポートアクションバーから右側のギャップも削除します。
スタイルでもそれができると思います。これを試して。 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>
他の答えはどれも役に立たなかったので、実際の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>
これは私にとってはうまくいきました。他の人にも役立つことを願っています。
モニターに対して頭を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()はトリックをしたものです
あなたのコードに加えてこれらの2行を書きます
Toolbar toolbar=(Toolbar)viewActionBar.getParent();
toolbar.setContentInsetsAbsolute(0,0);
今日もこの問題に遭遇しましたが、Android Studioによって自動的に生成された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
ポイントへ:
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;