андроид.Р.ИД.содержание как контейнер для фрагмент

моя ситуация-это действие 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

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/android/support/v7/app/ActionBarActivityDelegateBase.java/#228

вы можете видеть, что они заменяют старый R. id.action_bar_activity_content со стандартом android.R.id.содержание (и старый андроид.R.id.содержание с NO_ID) для лучшей совместимости! Поэтому, если вы используете поддержку Lib r19 или выше (или просто собственную структуру), вы можете просто android.R.id.содержание в обоих вариантах