Пользовательский макет с ActionBar в appcompat вызывает совпадение содержимого с панелью действий

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

 public class DoneBarActivity { public interface OnSaveActionListener { public void onSave(); } public static void setupActionBar(final ActionBarActivity activity, final OnSaveActionListener listener) { // Inflate a "Done/Cancel" custom action bar view. final LayoutInflater inflater = (LayoutInflater) activity .getSupportActionBar().getThemedContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View customActionBarView = inflater.inflate( R.layout.actionbar_custom_view_done_cancel, null); customActionBarView.findViewById(R.id.actionbar_done) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // "Done" (or "Save") if (listener != null) { listener.onSave(); } activity.finish(); } }); customActionBarView.findViewById(R.id.actionbar_cancel) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // "Cancel" activity.finish(); } }); // Show the custom action bar view and // hide the normal Home icon and title. final ActionBar actionBar = activity.getSupportActionBar(); actionBar.setDisplayOptions( ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); actionBar.setCustomView(customActionBarView, new ActionBar.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) ); } } 

Моя активность – это просто тупая ActionBarActivity которая загружает фрагмент в FrameLayout . Вот фрагмент кода:

 @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { // ... DoneBarActivity.setupActionBar((ActionBarActivity) getActivity(), new DoneBarActivity.OnSaveActionListener() { @Override public void onSave() { saveIssueChangesAndClose(); } }); return v; } 

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

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:divider="?attr/dividerVertical" android:showDividers="middle" android:dividerPadding="12dp"> <include layout="@layout/include_cancel_button"/> <include layout="@layout/include_done_button"/> </LinearLayout> 

Вот две кнопки:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" style="?actionButtonStyle" android:id="@+id/actionbar_cancel" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"> <TextView style="?actionBarTabTextStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingRight="20dp" android:drawableLeft="@drawable/ic_action_cancel" android:drawablePadding="8dp" android:gravity="center_vertical" android:text="@android:string/cancel"/> </FrameLayout> 

а также

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" style="?actionButtonStyle" android:id="@+id/actionbar_done" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"> <TextView style="?actionBarTabTextStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingRight="20dp" android:drawableLeft="@drawable/ic_action_done" android:drawablePadding="8dp" android:gravity="center_vertical" android:text="@string/save"/> </FrameLayout> 

Вот результат в Jelly Bean против Gingerbread (Galaxy Nexus для первого, эмулятор для последнего):

ActionBar совместим с ошибкой перекрытия Gingerbread

Извините за качество, анимированный PNG не работает должным образом, поэтому я переключился на анимированный GIF.

Как вы можете видеть, макет содержимого перемещается по пользовательскому макету панели действий (обратите внимание на синее переполнение в JB и положение полосы прокрутки).

Использование нестандартной панели действий корректно работает как на JB, так и на GB.

Оверлей возникает из-за использования другого идентификатора ресурса, который используется для ссылки на просмотр контента в разных версиях Android. Более подробную информацию см . На странице Shellom . Между тем, следующий фрагмент должен помочь вам определить соответствующую часть вашего кода.

 // http://code.google.com/p/android/issues/detail?id=58108 private static int getContentViewCompat() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH ? android.R.id.content : R.id.action_bar_activity_content; } 

Обновление: переключатель больше не нужен. Вы можете обновить appcompat-v7 до версии 19.0.0. Или новее, а затем ссылаться на android.R.id.content на все версии Android.

Intereting Posts
Построить путь неполным только в некоторых рабочих пространствах (Android) Как ограничить EditTextPreference до диапазона 1024: 65535 Почему Android сменяет «компилировать» задачу на «реализацию» в градиентной сборке? Как получить все контакты из телефонной книги и SIM-карты в Android? WebView, добавьте локальный файл .CSS на HTML-страницу? Сила Закрыть приложение программно Проверить, что Android apk не был повторно упакован? VFY: невозможно решить статический метод 10876: Android Могу ли я создавать собственные глобальные методы в своем классе Android-приложений? Как работать с последовательным портом в Android-мобиле? Boost Asio deadline_timer на Android-устройстве не запускается с истечением срока, но на более позднем этапе Как применить угловой радиус к LinearLayout Как изменить цвет фона выбранных элементов в ListView? Не удалось найти метод com.google.android.gms.common.GooglePlayServicesUtil Как передать параметры кампании GooglePlay с помощью Intent из Android Chrome