Проблема в том, что единственная реализация Window
(PhoneWindow
) использует LayoutInflater
в своем методе setFeatureInt
и создает экземпляр новый макет с inflate
и attachToRoot=true
. Следовательно, когда вы вызываете setFeatureInt
, новые макеты не заменяются , а прикрепляются к внутреннему контейнеру заголовка и, таким образом, отображаются поверх друг друга.
Вы можете обойти это, используя следующий вспомогательный метод вместо setFeatureInt
. Помощник просто удаляет все представления из внутреннего контейнера заголовка до того, как будет установлена новая функция пользовательского заголовка:
private void setCustomTitleFeatureInt(int value) {
try {
// retrieve value for com.android.internal.R.id.title_container(=0x1020149)
int titleContainerId = (Integer) Class.forName(
"com.android.internal.R$id").getField("title_container").get(null);
// remove all views from titleContainer
((ViewGroup) getWindow().findViewById(titleContainerId)).removeAllViews();
// add new custom title view
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, value);
} catch(Exception ex) {
// whatever you want to do here..
}
}
Я не уверен, предназначено ли текущее setFeatureInt
поведение, но оно определенно не задокументировано так или иначе, поэтому я отнесу это к разработчикам Android;)
EDIT
Как указано в комментариях, вышеупомянутый обходной путь не идеален. Вместо того, чтобы полагаться на константу com.android.internal.R.id.title_container
, вы можете просто скрыть старый пользовательский заголовок всякий раз, когда вы устанавливаете новый.
Предположим, у вас есть два пользовательских макета заголовков:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/custom_title_1" ...
и
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/custom_title_2" ...
и вы хотите заменить custom_title_1
на custom_title_2
, вы можете скрыть первое и использовать setFeatureInt
, чтобы добавить второе:
findViewById(R.id.custom_title_1).setVisibility(View.GONE);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_2);