18

Как и на вопрос here, но имеет некоторые ключевые отличия. Наиболее заметно, что принятый ответ сделал до тех пор, пока не будет выпущена последняя версия библиотеки поддержки.Пользовательское представление Android ActionBar не заполняет родителя

Вот пользовательский вид макета:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="#FFDD0000"> 

</LinearLayout> 

Теперь, когда вы пытаетесь установить только пользовательский вид:

ActionBar actionBar = getSupportActionBar(); 
    actionBar.setDisplayShowCustomEnabled(true); 
    actionBar.setCustomView(R.layout.actionbar); 

Вы в конечном итоге с помощью пользовательского макета, который не заполняет весь ширина: enter image description here

Чтобы сделать это более интересно, у меня есть аналогичные установки в другом приложении:

ActionBar actionBar = getSupportActionBar(); 
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
    actionBar.setCustomView(R.layout.actionbar); 
    actionBar.setDisplayHomeAsUpEnabled(false); 
    actionBar.setHomeButtonEnabled(false); 

Этот сделал Работа, пока я не обновил библиотеки поддержки до версии v21. Как только я это сделал, у меня была та же проблема с приложениями, у которых раньше не было этой проблемы.

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

Редактировать После этого еще несколько тестов, я обнаружил, что компиляция с targetSdkVersion/compileSdkVersion установлен в 19 и с v7: 19.0.1 (или v7: 19.1.0) для библиотеки не имеет этой проблемы (есть домашняя иконка, о которой позаботится более поздний код), подтверждая, что это определенно проблема с последней версией.

+0

См. Ответ на дублированный вопрос http://stackoverflow.com/a/26454325/624109 – Muzikant

ответ

26
1 ActionBar actionBar = getSupportActionBar(); 
    actionBar.setDisplayShowHomeEnabled(false); 
    actionBar.setDisplayShowCustomEnabled(true); 
    actionBar.setDisplayShowTitleEnabled(false); 
    View view = getLayoutInflater().inflate(R.layout.actionbar_title_back, 
      null); 
    LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, 
      LayoutParams.MATCH_PARENT); 
    actionBar.setCustomView(view, layoutParams); 
    Toolbar parent = (Toolbar) view.getParent(); 
    parent.setContentInsetsAbsolute(0, 0); 
2 Use Toolbar 


     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     toolbar.setTitle(""); 
     mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title); 
     mTitle.setText(title); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:popupBackground="@color/red" 
     app:popupTheme="@style/PopupTheme" 
     app:theme="@style/ToolbarTheme" > 

     <TextView 
      android:id="@+id/toolbar_title" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="Toolbar Title" 
      android:textColor="@color/white" 
      android:textSize="17.0sp" /> 
    </android.support.v7.widget.Toolbar> 
</LinearLayout> 
+1

Можете ли вы объяснить, как это конкретно касается проблемы с последней версией, о которой спрашивал OP? –

+0

@tuder, но я получаю NPE, когда я пытаюсь запустить приложение в первый раз, а errro находится в этой строке parent.setContentInsetsAbsolute (0, 0); это показывает, что parent имеет значение null – Erum

+0

@Erum проверяет идентификатор вашего макета или версию вашего Actionbar, я использую android.support.v7.appcompat – tuder

6

использование Панель родительского = (панель) customNav.getParent(); parent.setContentInsetsAbsolute (0, 0); он будет работать

5

добавить как это в OnCreate метод

ActionBar action = getSupportActionBar(); 
     action.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 

Toolbar toolbar=(Toolbar)action.getCustomView().getParent(); 
     toolbar.setContentInsetsAbsolute(0, 0); 
     toolbar.getContentInsetEnd(); 
     toolbar.setPadding(0, 0, 0, 0); 
1

В коде XML добавить эти атрибуты:

<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/re_app_toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:contentInsetEnd="0dp" 
    android:contentInsetLeft="0dp" 
    android:contentInsetRight="0dp" 
    android:contentInsetStart="0dp" 
    app:contentInsetEnd="0dp" 
    app:contentInsetLeft="0dp" 
    app:contentInsetRight="0dp" 
    app:contentInsetStart="0dp"> 

он будет соответствовать на всю ширину зрения.