Android леденец, совместимости приложений панели быстрого доступа настраиваемый вид не занимает весь экран по ширине


Итак, я только что обновил свою кодовую базу до 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();
        }
    });
}

Edit

вынимая пользовательский вид и изменение фона теперь занимает всю ширину. Итак, проблема в том, как мы можем сделать CustomView занимает всю ширину панели действий?

8 95

8 ответов:

похоже, это вызвано последними изменениями на ActionBar в последнее время appcompat-v7 обновление. Похоже, что есть значительные изменения в том, как вы должны обрабатывать панели действий.

я столкнулась с той же проблемой и после прочтения ActionBar документация, и особенно следующая цитата Я нашел решение.

начиная с Android L (уровень API 21), панель действий может быть представлена любым виджетом панели инструментов в пределах макет приложения. Приложение может сигнализировать действию, какую панель инструментов следует рассматривать как панель действий действия. Действия, использующие эту функцию, должны использовать одну из указанных функций .Темы NoActionBar, установите атрибут windowActionBar в значение false или иным образом не запрашивайте функцию окна.

как я это вижу, то AppCompat темы были изменены и, с одной стороны, казалось, сломать несколько вещей, но обеспечивают гораздо большую гибкость, с другой. Я рекомендую следовать этим шаги:

  1. использовать .NoActionBar стиль в вашей активности, как описано в приведенной выше цитате
  2. добавить android.support.v7.widget.Toolbar для вашей деятельности макет
  3. установить . это основная проблема с полями, которые вы описываете в своем вопросе
<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 в вашем макете активности, так что вам нужно будет только настроить панель инструментов в одно место, если используется в нескольких мероприятиях

<include layout="@layout/view_action_bar" />
  1. использовать 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);
  1. как только вы это сделаете, все действия будут добавлены в onCreateOptionsMenu будет добавлен на панель инструментов, и он будет рассматриваться как панель действий activity.
  2. дополнительно настраивать панели инструментов по желанию (добавить вид ребенка и т. д.)

вместо того, чтобы делать так много работы, как упоминалось музикант, а как ответ

    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

вы должны добавить только последние две строки кода, чтобы решить вашу проблему.

Я надеюсь, что это может помочь вам и кому-либо еще.

обновление: после делать некоторые исследования, я обнаружил, что это решение не будет работать в некоторых случаях. Левый боковой зазор (домашний или задний) будет удален с помощью этого, но правый боковой зазор (меню) останется как есть. Ниже приводится решение в этих случаях.

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

добавьте эти четыре строки в код выше, чтобы правый боковой зазор также был удален из панели действий поддержки.

Я думаю, что вы также можете сделать это в стилях. попробовать это. протестировал его на 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, найденные здесь.

Если вы посмотрите на базу.Штучка.Совместимости приложений.Стиль 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>

это отлично сработало для меня, надеюсь, что это поможет и другим.

Я просто столкнулся с этой проблемой сегодня, а затем я узнал, что у меня было res/values-v21/styles.xml внутри моего проекта, который был сгенерирован автоматически Android Studio, и это причина.

почему?

потому что мой 's был:

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

затем, когда я запустил свое приложение на леденец,res/values-v21/styles.xml был использован, и это вызвало точную проблему, что ОП имел. Поэтому я пришел к простому решению-это просто удаление:

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

на res/values-v21/styles.xml

после того, как я сильно ударился головой о монитор, это сработало для меня

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

getCustomView ().getParent () - это то, что сделал трюк

по существу:

 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;

написать эти две строки в коде

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