2013-07-29 1 views
3

У меня есть горизонтальный список элементов, которые я хочу разделить доступную ширину экрана одинаково.Есть ли способ получить Mvx.MvxLinearLayout, чтобы уважать android: layout_weight?

Раньше я использовал привязку индекса к каждому элементу и статическому LinearLayout, при этом каждый элемент имел равный макет.

Когда я заменяю статическую LinearLayout связью Mvx.MvxLinearLayout и ItemsSource и перемещаю разметку для элементов в ItemTemplate, layout_weight больше не соблюдается MvxLinearLayout.

Я пробовал различные способы реструктуризации шаблона элемента, и, кажется, нет способа заставить этот элемент управления подчиняться layout_weight при организации своих элементов.

Есть ли способ заставить Mvx.MvxLinearLayout уважать android: layout_weight или любой альтернативный подход, который может дать мне динамический список элементов, которые будут равномерно распределены по границе фиксированных измерений?

Редактировать

Предполагая, что список из 3 предметов, со струнным свойства 'Name'.

Эта разметка работает, как ожидалось, давая 3 текстовые элементы одинаковой ширины:

<LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <TextView 
     android:layout_weight="1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     local:MvxBind="Text Items[0].Name" 
     /> 
    <TextView 
     android:layout_weight="1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     local:MvxBind="Text Items[1].Name" 
     /> 
    <TextView 
     android:layout_weight="1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     local:MvxBind="Text Items[2].Name" 
     /> 
</LinearLayout> 

Этот подход не работает, вес макета правильно не применяется к TextViews:

<Mvx.MvxLinearLayout 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    local:MvxBind="ItemsSource Items" 
    local:MvxItemTemplate="@layout/item_template" /> 

ItemTemplate файл макета:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:layout_weight="1" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    local:MvxBind="Text Name" /> 
+0

Пожалуйста, укажите код, на котором работали ранее и что вы пробовали. И что показывает зритель иерархии как разница? – Stuart

+0

Я добавил запрошенную информацию, может ли кто-нибудь помочь в этом? – Dave

+0

Было ли решение для этой проблемы? В настоящее время я сталкиваюсь с той же проблемой. Имея MvxLinearLayout, который не учитывает layout_weight элементов в нем. – Nexus2k

ответ

0

ли способ получить MvxLinearLayout не уважать android:layout_weight

None, что я знаю - но это звучит, как вы в идеальном положении для отладки и экспериментов.

Чтобы отладить проблемы с макетами, одним очень полезным инструментом является просмотрщик иерархии - http://developer.android.com/tools/debugging/debugging-ui.html - использование этого в обоих макетах может показать вам, какая разница, когда они фактически работают на устройстве.

MvxLinearLayout просто LinearLayout - он наследует от него и просто добавляет связанный с данными Adapter, чтобы добавить/удалить детей динамически - см MvxLinearLayout.cs.

Исходя из этого, одна гипотеза состоит в том, что, может быть, сама LinearLayout не поддерживает layout_weight с такими динамическими детьми. Чтобы исправить это:

  • Вы могли бы попробовать прототипирование пользовательского интерфейса без использования Mvx - делает ли простой LinearLayout "respect layout_weight" при добавлении/удалении детей? Если да, то в чем разница между вашим прототипом и MvxLinearLayout.cs.. Если ответ отрицательный, то вы знаете, что проблема находится в LinearLayout где-то.
  • Вы можете попробовать посмотреть источник LinearLayout - например.http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/widget/LinearLayout.java - это расследование может выявить какой-то путь вперед - например, он может найти какой-то способ, с помощью которого LinearLayout может переоценить, и вы могли бы затем вызвать этот метод «принудительного восстановления» из событий и ChildViewRemoved.

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

Если встроенные макеты не работают для вас, то довольно просто создать свои собственные макеты - например, см http://arpitonline.com/blog/2012/07/01/creating-custom-layouts-for-android/ - после того как вы сделали это, то добавление связывания так просто, как копирование и вставка в ViewGroup связывания кода из MvxLinearLayout.cs.

+0

Возможно ли получить событие клика для элемента линейного макета, чтобы действовать на элемент, который нажал (например, его удаление)? – Telemat

2

Проблема в том, mvvmcross вставляет дополнительный вид при использовании MvxLinearLayout с ItemTemplate. Таким образом, вместо того, чтобы получить иерархию вида:

MvxLinearLayout -> TextView

вы в конечном итоге с:

MvxLinearLayout -> MvxListItemView -> TextView.

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

Место, где происходит действие, находится в MvxViewGroupExtensions (например, Refill), где подвидные объекты добавляются в LinearLayout и метод CreateBindableView в MvxAdapter, где subview упаковывается внутри IMvxListItemView.

Один из способов решения этой проблемы - переопределить методы в MvxViewGroupExtensions и после добавления представлений для обновления свойств макета MvxListItemViews (например, скопировать их из основного представления). Например:

private static void Refill(this ViewGroup viewGroup, IAdapter adapter) { 
    .... // rest of code 
    Invalidate(); 
    for (int j = 0; j < viewGroup.ChildCount; j++) 
    { 
     var child = GetChildAt(j) as MvxListItemView; 
     var param = new LinearLayout.LayoutParams(
        0, ViewGroup.LayoutParams.WrapContent, 1.0f); 
     child.LayoutParameters = param; 
    } 
}