Загружать макет в зависимости от ширины фрагмента вместо ширины экрана

В моем приложении у меня есть несколько фрагментов, которые используются в нескольких действиях. В зависимости от размера экрана действия используют разные макеты, в которых их фрагменты могут располагаться друг над другом вертикально и/или горизонтально, мозаично выстраиваться в виде таблицы со строками и столбцами или отображаться почти в полноэкранном режиме под панелью вкладок.

Для каждого фрагмента также есть несколько макетов, например

  1. res/layout/articles_list_fragment.xml
  2. res/layout-w590dp/articles_list_fragment.xml

В моем классе фрагментов я загружаю макет следующим образом:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    rootView = inflater.inflate(R.layout.articles_list_fragment, container, false);
    // (...)
}

Теперь, конечно, когда фрагмент имеет ширину менее 590dp, я бы хотел, чтобы он использовал первый макет, и когда для фрагмента доступно больше (или точно) ширины 590dp, я хочу второй макет быть использованным.

Но система ресурсов Android, похоже, загружает эти макеты только на основе ширины , доступной для все мое окно активности. Это не соответствует моим потребностям. Например, когда мое окно активности имеет ширину 1024 dp, левый фрагмент получит 2/5 этой ширины, что составляет 409 dp. В любом случае загружается второй ресурс макета, которому требуется ширина 590dp.

Конечно, в этом простом примере я мог бы вычислить точную ширину окна активности, при которой мой левый фрагмент достигает 590dp: 590dp * 5 / 2 = 1475dp, и, таким образом, переименовать res/layout-w590dp/articles_list_fragment.xml в res/layout-w1475dp/articles_list_fragment.xml. Однако в моем реальном случае отношение между шириной окна активности и шириной фрагмента намного сложнее, и статическое/ручное определение минимальной ширины кажется неуместным.

Итак, теперь мне интересно, есть ли какой-либо синтаксис настройки/взлома/библиотеки/классификатора, который я могу использовать, чтобы изменить способ, которым андроид определяет загружаемый ресурс.


person Lena Schimmel    schedule 17.03.2014    source источник


Ответы (1)


У меня была аналогичная проблема, и у меня сложилось впечатление, что Android намеренно хочет заставить разработчика проектировать полноэкранный макет (включая все фрагменты) для каждого размера экрана, вместо того, чтобы размещать фрагменты в зависимости от размера фрагмента.

Наконец, я решил решить эту проблему, не используя повторно одинаковые фрагменты для мест разного размера. Вместо этого я подклассифицировал свой фрагмент, переопределяя метод onCreateView, чтобы я мог раздувать разные макеты для разных подфрагментов.

К сожалению, это приводило к дублированию макетов. Чтобы избежать этого, можно сделать обходной путь, чтобы поместить все макеты непосредственно в папку макетов и программно определить правильную версию макета из размеров экрана.

person Jörg Eisfeld    schedule 17.05.2014