У меня есть 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, чем из кода?Или как это может произойти?