Перестаёт дочерние элементы LinearLayout перестает работать при установке новых LayoutParams из кода - PullRequest
1 голос
/ 20 июля 2011

У меня есть HorizontalScrollView в Android, который выглядит следующим образом в xml.

<com.se.myapp.MyScroller
    android:layout_width="fill_parent"
    android:layout_height="110dp"
    android:scrollbars="none">
    <LinearLayout
        android:id="@+id/scroller_layout"
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="fill_parent">
                <include layout="@layout/item_1" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="fill_parent">
                <include layout="@layout/item_2" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="fill_parent">
                <include layout="@layout/item_3" />
        </LinearLayout>                        
    </LinearLayout>
</com.se.myapp.MyScroller>

Вот так выглядит элемент в xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">       
    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true" "/>
</LinearLayout>  

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

public class MyScroller extends HorizontalScrollView 
{
    ...

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) 
    {
        super.onLayout(changed, left, top, right, bottom);
        LinearLayout layout = (LinearLayout) findViewById(R.id.scroller_layout);
        mNoOfItems = layout.getChildCount();

        int itemLayoutWidth = getMeasuredWidth();
        for(int i = 0; i < mNoOfItems; i++)
        {
            View child = (View)layout.getChildAt(i);
            ViewGroup.LayoutParams newLayout = new LinearLayout.LayoutParams(itemLayoutWidth , LinearLayout.LayoutParams.FILL_PARENT);
            child.setLayoutParams(newLayout);
        }
    }
    ...
} 

Элементы, включенные в xml, - это просто LinearLayouts с textviewв нем (они будут более сложными позже).Проблема, с которой я сталкиваюсь, заключается в том, что если я внезапно изменю компоновку LinearLayouts в onLayout, элементы не будут ретранслироваться при изменении текста в текстовых представлениях.Поэтому, если у меня есть текст, например «test», например, в пункте 1, и динамически изменить его на «test123» при запуске приложения, «123» не будет отображаться, поскольку макет текстового представления не обновляется.Странная вещь в том, что если я не изменю макет LinearLayout в onLayout, но, например, установлю жестко закодированный в 540px в xml, textview обновит свой макет при изменении текста.Я даже заметил, что если я жестко закодирую его в 540px в xml, а затем просто получу layoutParams в коде и сразу же снова установлю его, не меняя ничего подобного ниже, он также перестанет работать.

child.setLayoutParams(child.getLayoutParams());

IsЕсть ли разница с настройкой макета LinearLayout из XML, чем из кода?Или как это может произойти?

1 Ответ

0 голосов
/ 22 июля 2011

Я нашел проблему, мне пришлось вызвать super.onLayout (изменено, слева, сверху, справа, снизу); после того, как я вызвал child.setLayoutParams (newLayout); однако я переписал его так, чтобы вместо этого я изменил компоновочные параметры на onSizeChanged, что сработало хорошо.

...