Пользовательская строка заголовка без дополнения (Android)
Поэтому я использую методы в этой теме, чтобы использовать собственный фон для моего заголовка. К сожалению, фреймворк размещает мой макет внутри FrameLayout
(title_container
), который имеет отступы, как показано ниже.
(источник: ggpht.com)
Есть ли вообще убрать серые границы? Расположение фрейма определено в com.android.internal.R.id.title_container
, поэтому доступ к фрейму по идентификатору будет хрупким.
Ответы
Ответ 1
Я боролся с этой же проблемой, и теперь у меня есть ответ!
Как вы, вероятно, видели несколько мест, вам нужно создать ресурс themes.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="android:Theme">
<item name="android:windowTitleSize">44dip</item>
<item name="android:windowTitleBackgroundStyle">@style/WindowTitleBackground</item>
</style>
</resources>
Обратите внимание, что на сайтах, которые говорят о настраиваемых заголовках, не часто упоминается, вам нужно выбрать эту тему на уровне представления, активности или приложения. Я делаю это на уровне приложения, добавляя в приложение свойство android: theme:
<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/MyTheme">
Вам также понадобится style.xml для определения WindowTitleBackgroundStyle. В отличие от различных версий этого файла, которые я видел в Интернете, я добавил еще одну строку в файл, который устанавливает дополнение к 0, которое избавляется от отступов, о которых вы жалуетесь:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<style name="WindowTitleBackground">
<item name="android:background">@android:color/transparent</item>
<item name="android:padding">0px</item>
</style>
</resources>
Ответ 2
На самом деле нет необходимости использовать настраиваемый макет для настройки фонового изображения. Следующий код в theme.xml
будет работать:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TitlebarBackgroundStyle">
<item name="android:background">@drawable/header_bg</item>
</style>
<style name="Theme.OTPMain" parent="android:Theme">
<item name="android:windowTitleBackgroundStyle">@style/TitlebarBackgroundStyle</item>
</style>
</resources>
Однако, если вы действительно хотите использовать настраиваемую строку заголовка, тогда следующий код удалит поле:
ViewGroup v = (ViewGroup) findViewById(android.R.id.title);
v.setPadding(0, 0, 0, 0)
title_bar_background
был установлен как идентификатор фонового изображения в XML. Я установил android:scaleType="fitXY"
.
Ответ 3
На anddev.org есть длинный поток, который может помочь вам
http://www.anddev.org/my_own_titlebar_backbutton_like_on_the_iphone-t4591.html
Я последовал за ним и успешно создал свою собственную панель заголовка, которая позволяет мне устанавливать дополнение.
Xml для моей строки заголовка:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/header"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="38px" android:layout_width="fill_parent"
android:background="@drawable/gradient">
<TextView android:id="@+id/title" android:layout_width="wrap_content"
android:gravity="center_vertical" style="@style/PhoneText"
android:layout_alignParentLeft="true"
android:text="New Title" android:background="@android:color/transparent"
android:layout_height="wrap_content" android:layout_alignParentTop="true"
android:padding="5dip" android:layout_marginBottom="7px"/>
<TextView android:id="@+id/time" android:layout_width="wrap_content"
android:gravity="center_vertical" style="@style/PhoneText2"
android:layout_alignParentRight="true"
android:text="Test Text" android:background="@android:color/transparent"
android:layout_height="wrap_content" android:layout_alignParentTop="true"
android:padding="4dip" android:layout_marginBottom="7px"/>
</RelativeLayout>
Вышеупомянутый создает небольшую серо-полоску с текстом, выровненным вправо и влево.
Ответ 4
Я избавился от заполнения, получив контейнер заголовка и установив дополнение на 0. Он работает на Android 4.
titleContainerId = (Integer)Class.forName("com.android.internal.R$id").getField("title_container").get(null);
ViewGroup vg = ((ViewGroup) getWindow().findViewById(titleContainerId));
vg.setPadding(0, 0, 0, 0);
Ответ 5
Как уже упоминалось, dalewking можно изменить Manifest следующим образом:
<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/MyTheme">
Но это не сработало для меня, пока я не добавил
android:theme="@style/MyTheme"
к активности, которой это нравится:
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"
android:theme="@style/CustomTheme" >
</activity>
Ответ 6
Начиная с 4.2 и ADT 21 при создании стандартного размера стандартные размеры добавляются в родительский контейнер:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
</RelativeLayout>
Значения находятся в res/dimens.xml:
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>
Либо удалите их из родителя, либо измените значения dimens.xml на нужные значения.
Ответ 7
Я добавил следующий элемент дополнения AppTheme в styles.xml
<style name="AppTheme" parent="AppBaseTheme">
...
<item name="android:padding">0dp</item>
...
</style>
В манифесте приложения используется эта тема:
<application
...
android:theme="@style/AppTheme" >
...
Это разрешило это для меня.