Android Lollipop, AppCompat ActionBar özel görünümü tüm ekran genişliğini kaplamıyor


97

Bu nedenle, kod tabanımı Lollipop olarak güncelledim ve İşlem Çubuğu ile ilgili sorunlar yaşıyorum. AppCompat ve ActionBarActivity kullanıyorum ve özel bir görünümü şişiriyorum. Görünüşe göre özel görünüm artık ekranın tüm genişliğini kaplamıyor ve solda ince bir şerit bırakıyor

19 ile Bina Eskiden göründüğü gibi

21 ile Bina Şimdi göründüğü gibi

Bu, Eylem Çubuğunu kurmak için kullandığım kod. Herhangi bir fikri olan var mı?

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();
        }
    });
}

Düzenle

Özel görünümü çıkarmak ve arka planı değiştirmek artık tüm genişliği kaplıyor. Öyleyse sorun şu ki, bir CustomView'un ActionBar'ın tüm genişliğini almasını nasıl sağlayabiliriz?


Özel görünüm bölümlerini geçici olarak yorumlarsanız, daha iyi davranır mı? Olmazsa, belki de temanızdan gelen buna eğilirim.
CommonsWare

Özel görünümü kaldırdım ve arka planını
ActionBar'ın

Hiyerarşi Görünümü'nde, hem özel görünümle hem de özel görünüm olmadan etkinliğinize göz atabilir ve özel görünümün bir sonucu olarak hangi düzen kurallarının değiştiğini belirleyip belirleyemeyeceğinizi görebilirsiniz. Bunun yenide bir hata olması mümkündür appcompat-v7.
CommonsWare

Bana öyle geliyor ki orası ayrılmış yer ImageView. Yeni başlayanlar için devre dışı bırakmayı deneyin.
Nikola Despotoski

1
Merhaba, özel görünümün tüm genişliği alması için bu iyi bir çözüm gibi görünüyor. Düzen ağırlıkları ayarlanmış olsa bile genişlemediğini tecrübe ediyordum. buraya bakın: stackoverflow.com/a/20794736/581574
ratana

Yanıtlar:


111

Görünüşe göre bu, ActionBarson appcompat-v7güncellemedeki en son değişikliklerden kaynaklanıyor . İşlem çubuklarını nasıl kullanmanız gerektiğine dair önemli değişiklikler var gibi görünüyor.

Aynı sorunla karşılaştım ve ActionBarbelgeleri okuduktan sonra ve özellikle aşağıdaki alıntıyı bir çözüm buldum.

Android L (API seviyesi 21) ile başlayarak, eylem çubuğu, uygulama düzeni içindeki herhangi bir Araç Çubuğu widget'ı tarafından temsil edilebilir. Uygulama, Aktiviteye hangi Araç Çubuğunun Aktivitenin eylem çubuğu olarak değerlendirilmesi gerektiğini işaret edebilir. Bu özelliği kullanan etkinlikler sağlanan .NoActionBar temalarından birini kullanmalı, windowActionBar özniteliğini false olarak ayarlamalı veya başka bir şekilde pencere özelliğini istememelidir.

Benim görüşüme göre, AppCompattemalar değiştirildi ve bir yandan birkaç şeyi bozarken diğer yandan çok daha fazla esneklik sağlıyor gibiydi. Şu adımları izlemenizi tavsiye ederim:

  1. .NoActionBarYukarıdaki alıntıda açıklandığı gibi aktivitenizde stil kullanın
  2. android.support.v7.widget.ToolbarEtkinlik düzeninize bir ekleyin
  3. app:contentInsetStart="0dp"Özniteliği ayarlayın . Sorunuzda açıkladığınız marjla ilgili ana sorun budur
<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>

Genellikle bunu ayrı bir düzen dosyasında includeyapmanız ve etkinlik düzeninizde kullanmanız önerilir , böylece birden çok etkinlikte kullanılıyorsa Araç Çubuğunu yalnızca tek bir yerde özelleştirmeniz gerekir.

<include layout="@layout/view_action_bar" />
  1. Kullanın findViewByIdve setSupportActionBarFaaliyetinizdeki onCreateiçinsignal to the Activity which Toolbar should be treated as the Activity's action bar
Toolbar actionBar = (Toolbar) findViewById(R.id.actionBar);
setSupportActionBar(actionBar);
  1. Bunu yaptığınızda, eklenen tüm eylemler onCreateOptionsMenuaraç çubuğuna eklenecek ve etkinlik eylem çubuğu olarak değerlendirilecektir.
  2. Araç Çubuğunu istediğiniz gibi daha fazla özelleştirin (Alt görünümler ekleyin vb.)

1
Araç Çubuğu'nu gezinme çekmecesi ile kullanmaya çalışıyorum ancak hata alıyorumError inflating class fragment
Ahmed Nawaz

İlgili tüm kod cevapta paylaşılır. Farklı bir sorun gibi göründüğünden, durumunuz için yeni bir soru başlatmanız gerekiyor gibi görünüyor.
Muzikant

Teşekkürler. Eylem çubuğunu Araç Çubuğu ile değiştirerek sorunu çözdüm.
Ahmed Nawaz

9
Ad alanı bildirimlerinde açık paket adları kullanmamalısınız. Kullanımxmlns:app="http://schemas.android.com/apk/res-auto"
Liminal

1
Gerek yok setCustomView. Araç çubuğunuza eklemek istediğiniz widget'ları içeren bir düzen dosyası oluşturun (örneğin, cevabın 3. bölümünde açıklanan yerleşim dosyasına alt görünümler ekleyin)
Muzikant

51

Müzikant'ın bahsettiği kadar çok iş yapmak ve bu cevabı sevmek yerine

    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

Sorununuzu çözmek için yalnızca son iki kod satırını eklemelisiniz.

Umarım bu size ve başkalarına yardımcı olabilir.

GÜNCELLEME: Üzerinde biraz araştırma yaptıktan sonra, bu çözümün bazı durumlarda işe yaramayacağını öğrendim. Sol taraftaki boşluk (HOME veya BACK) bununla kaldırılacak, ancak sağ taraftaki boşluk (MENU) olduğu gibi kalacaktır. Bu durumlarda çözüm aşağıdadır.

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

Sağ taraftaki boşluğun da destek eylem çubuğundan kaldırılması için bu dört satırı yukarıdaki koda ekleyin.


Teşekkürler! Teşekkürler! son 2 satır aradığım şeydi!
digitalmidges

Bu satırları nereye ekliyoruz? Araç Çubuğu bölümünden sonra mı?
Zen

1
@summers evet bunları araç çubuğu kodunun hemen sonrasına ekleyin.
Amrut Bidri

31

Bunu stillerde de yapabileceğinizi düşünüyorum. bunu dene. kitkat'ta test etti

<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>

1
Bu cevap yanlış: android: contentInsetStart için API seviyesi 21 gerekiyor (şu anki dakika 14)
mr.boyfox

Ama deyim çok iyi! API 21 ve eski sürümler için ayrı ayrı yazma stiline ihtiyacınız var.
mr.boyfox

Hala varsayılan eylem çubuğunu kullanıyorsanız, sol kenar boşluğunu kaldırmak için bu doğru yanıttır.
Tooroop

Bu gerçekten işe yarıyor! Destek kütüphanesinin en son sürümü ile, öznitelikleri iki kez bildirmenize gerek olmadığını düşünüyorum (android: olanlar gerekli değildir).
Yönetim Kurulu

Bu problemi arıyordum ve cevabınızı bulduğumda onu zaten yükseltmiş olduğumu görüyorum! Yani iki kez teşekkürler.
user1732313

8

Ben, gerçek AppCompat v7 stilleri bir göz attım bulundu böylece diğer cevapların hiçbiri benim için çalıştı burada .

Base.Widget.AppCompat.ActionBar stiline bakarsanız, şu özelliklere sahiptir:

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

Açıkçası, bu özellikleri kendi eylem çubuğu stilimizde geçersiz kılmamız gerekiyor:

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

Bu benim için harika çalıştı, umarım başkalarına da yardımcı olur.


Evet, seçilen yanıtın belirttiği gibi, anahtar ActionBar / Araç Çubuğunun contentInsetStart ve contentInsetEnd öznitelikleridir. Kendi stilinizi tanımlamak için geçerlidir, ancak bunları xml'nizdeki Araç Çubuğunun özniteliklerinde 0dp olarak da ayarlayabilirsiniz
Stevie Kideckel

1

Kafamı monitöre çok vurduktan sonra, bu benim için çalıştı

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

GetCustomView (). GetParent () hile yaptı


0

Bugün de bu sorunla karşılaştım, sonra res/values-v21/styles.xmlAndroid Studio tarafından otomatik olarak oluşturulan projemin içinde yaşadığımı öğrendim ve nedeni bu.

Neden?

Çünkü res/values-v21/styles.xmliçeriğimin içeriği:

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

Ve şöyle bir res/values/styles.xmlşey içeriyordu:

<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>

Sonra uygulamamı Lollipop'ta çalıştırdığımda res/values-v21/styles.xml, kullanıldı ve bu, OP'nin sahip olduğu tam soruna neden oldu. Bu yüzden basit bir düzeltmeye geldim, sadece silme:

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

içinde res/values-v21/styles.xml


0

diyeceğim şey şu ki:

 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);

doğru araç çubuğunu içe aktardığınızdan emin olun - android.support.v7.widget.Toolbar;


0

Bu iki satırı kodunuza ek olarak yazın

Toolbar toolbar=(Toolbar)viewActionBar.getParent();
toolbar.setContentInsetsAbsolute(0,0);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.