андроид.Р.ИД.содержание как контейнер для фрагмент
моя ситуация-это действие A, которое содержит фрагмент B. Я всегда реализую его так.
макет для действия A:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
макет для фрагмента B:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_title"
android:layout_centerInParent="true"
android:background="@drawable/green_button"
android:textColor="@android:color/white"/>
</RelativeLayout>
Это отлично работает, но если мы откроем Android Device monitor и посмотрим на иерархию просмотра:
Итак, мне не нравится, что в моей иерархии есть два одинаковых бесполезных FrameLayouts, и я могу вырезать свой R. id.контейнер. Я делаю это, как ... это:
onCreate(Bundle args) реализация в моей деятельности A:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction()
.add(android.R.id.content, FragmentB.newInstance()).commit();
}
Я просто не устанавливаю контент для своей деятельности и прикрепляю свой фрагмент B к системному контейнеру android.R.id.довольна. Это отлично работает для меня. Я удалил один бесполезный include.
мой вопрос, это хорошая практика, чтобы сделать это "рубить". Может ли он разбить мое приложение в любом случае и какие проблемы могут возникнуть после этой реализации? Может быть у кого-то есть полезный опыт в этой вопрос?
спасибо всем за хорошие ответы.
1 ответов
в этом нет ничего плохого. Как вы сказали: Вы не нужны ваши ИД Р..макет содержимого так... просто не добавляйте его с помощью setContentView. Об этом даже упоминается в официальной документации ActionBar:http://developer.android.com/guide/topics/ui/actionbar.html#Tabs
альтернативно, если содержимое вкладки заполнит макет действия, то ваша деятельность не нуждается в макете вообще (вам даже не нужно вызов setContentView()). Вместо этого вы можете поместить каждый фрагмент в корневое представление по умолчанию, на которое можно ссылаться с помощью андроид.R.id.идентификатор контента
Если вы разрабатываете только для 14+ (из-за родной ActionBar) все должно быть в порядке с ним, но если вы используете поддержку lib, пожалуйста, прочитайте пункты ниже.
I. Если вы используете версию библиотеки поддержки ниже 19:
важно то, что: каков ваш минимальный уровень API, для которого вы разрабатываете?
Если ваше приложение поддержка API android.R.id.содержание является частью экрана, где ваше приложение должно отображать его содержимое.
На собственном API 14+ это только часть ниже ActionBar, потому что эта часть должна отображать содержимое активности.
В AppCompat, где нет собственной поддержки ActionBar. андроид.Р.ИД.содержание - это контейнер на весь экран приложение. Это означает, в том числе ActionBar, потому что ActionBar эмулируется там и добавляется как стандартная иерархия представлений. Чтобы решить эту проблему, вы должны проверить, находитесь ли вы на API ниже 14 и использовать другой id: R. id.action_bar_activity_content
Можно создать вспомогательный метод, чтобы получить правильный код:
public static int getContentViewId() {
return Build.VERSION.SDK_INT>=Build.VERSION_CODES.ICE_CREAM_SANDWICH ? android.R.id.content : R.id.action_bar_activity_content;
}
поэтому, если вы разрабатываете для 14+, это прекрасное решение. Если вы используете пользовательскую реализацию ActionBar (например, AppCompat) , вы должны сделать это уловка.
II. Если вы используете библиотеку поддержки версии 19 (или выше):
похоже, что это поведение было исправлено в версии библиотеки поддержки 19: https://code.google.com/p/android/issues/detail?id=58108#c21
вы можете видеть, что они заменяют старый R. id.action_bar_activity_content со стандартом android.R.id.содержание (и старый андроид.R.id.содержание с NO_ID) для лучшей совместимости! Поэтому, если вы используете поддержку Lib r19 или выше (или просто собственную структуру), вы можете просто android.R.id.содержание в обоих вариантах