我试图在运行时将TextViews添加到ScrollView中 Package 的LinearLayout中,但TextViews的可见性最终不会显示在屏幕上,即使它们的可见性标志都设置为Visible
。
myLayout = FindViewById<LinearLayout>(Resource.Id.myScollLayout);
View myView = LayoutInflater.From(this).Inflate(Resource.Layout.my_view, null);
TextView text1 = myView.FindViewById<TextView>(Resource.Id.text1);
TextView text2 = myView.FindViewById<TextView>(Resource.Id.text2);
TextView text3 = myView.FindViewById<TextView>(Resource.Id.text3);
text1.Text = "text 1";
text2.Text = "text 2";
text3.Text = "text 3";
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WrapContent, LinearLayout.LayoutParams.WrapContent);
myLayout.AddView(myView, p);
myView.Visibility = ViewStates.Visible
XML布局
<ScrollView
android:layout_width="match_parent"
android:padding="8dp"
android:layout_marginBottom="16dp"
android:id="@+id/myScrollView"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:visibility="visible"
android:id="@+id/myScrollLayout"
android:orientation="vertical">
</LinearLayout>
</ScrollView>
我说 eventually 是因为有时上面代码中的视图会按预期显示,但最终在后续执行膨胀和添加视图的代码时,添加到膨胀布局的视图在屏幕上不可见。如果我检查所有子视图的可见性,它们都显示Visible
,但在屏幕上,它们似乎显示为Invisible
,因为滚动布局内部仍有空间占用,但为空白。
我已经参考了许多其他文章,讨论使用以下内容:
- View.Invalidate()
- View.RequestLayout()
- View.Post()
- RunOnUiThread()
我还实现了下面的一个函数,试图强制myScrollLayout
的所有子视图可见,但仍然没有影响,因为所有视图都显示为好像它们是Invisible
。
void SetVisibility(View v)
{
if (v.GetType() == typeof(LinearLayout))
{
var view = (LinearLayout)v;
if (view.ChildCount == 0)
{
((Activity)view.Context).RunOnUiThread(() => view.Visibility = ViewStates.Visible);
return;
}
else
{
((Activity)view.Context).RunOnUiThread(() => view.Visibility = ViewStates.Visible);
for (int i = 0; i < view.ChildCount; i++)
{
SetVisibility(view.GetChildAt(i));
}
}
}
else
{
((Activity)v.Context).RunOnUiThread(() => v.Visibility = ViewStates.Visible);
return;
}
}
所以一般来说,什么会导致一个视图不显示在屏幕上,即使视图和它的父视图的可见性都设置为Visible
?
**更新:**上述代码中myLayout
的作用是保存一个可变数量的TextView,根据需要显示(Visible
)或隐藏(Invisible
)。当需要显示新的TextView时,使用View.RemoveAllViews
删除之前的TextView。
**更新#2:**我尝试将myLayout
(LinearLayout)替换为TextView,而不是根据需要膨胀视图,我只是设置TextView
的值。我得到了类似的行为,即使应该有多行数据,TextView也会 * 有时 * 只显示第一行。在这种情况下,周围的ScrollView只在屏幕上绘制以适应第一行。我相信问题的根源是在运行时添加或更改视图时,屏幕会重新绘制或显示视图。
1条答案
按热度按时间dm7nw8vv1#
我不能重现你的问题。我在一个新的空白www.example.com项目中测试了你的代码xamarin.android,文本视图将显示。
activity_main.xml:
my_view.xml:
代码将文本添加到textview:
结果图像:
另外,我还尝试将有关向textview添加文本的代码放入按钮的click事件中,得到了相同的结果。