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 ответов:
похоже, это вызвано последними изменениями на
ActionBar
в последнее времяappcompat-v7
обновление. Похоже, что есть значительные изменения в том, как вы должны обрабатывать панели действий.я столкнулась с той же проблемой и после прочтения
ActionBar
документация, и особенно следующая цитата Я нашел решение.начиная с Android L (уровень API 21), панель действий может быть представлена любым виджетом панели инструментов в пределах макет приложения. Приложение может сигнализировать действию, какую панель инструментов следует рассматривать как панель действий действия. Действия, использующие эту функцию, должны использовать одну из указанных функций .Темы NoActionBar, установите атрибут windowActionBar в значение false или иным образом не запрашивайте функцию окна.
как я это вижу, то
AppCompat
темы были изменены и, с одной стороны, казалось, сломать несколько вещей, но обеспечивают гораздо большую гибкость, с другой. Я рекомендую следовать этим шаги:
- использовать
.NoActionBar
стиль в вашей активности, как описано в приведенной выше цитате- добавить
android.support.v7.widget.Toolbar
для вашей деятельности макет- установить . это основная проблема с полями, которые вы описываете в своем вопросе
<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" />
- использовать
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
будет добавлен на панель инструментов, и он будет рассматриваться как панель действий activity.- дополнительно настраивать панели инструментов по желанию (добавить вид ребенка и т. д.)
вместо того, чтобы делать так много работы, как упоминалось музикант, а как ответ
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;