xamarin 动态添加的视图不可见

zbq4xfa0  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(131)

我试图在运行时将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只在屏幕上绘制以适应第一行。我相信问题的根源是在运行时添加或更改视图时,屏幕会重新绘制或显示视图。

dm7nw8vv

dm7nw8vv1#

我不能重现你的问题。我在一个新的空白www.example.com项目中测试了你的代码xamarin.android,文本视图将显示。
activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
   
<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/myScollLayout"
      android:orientation="vertical">
    </LinearLayout>
    </ScrollView>
</LinearLayout>

my_view.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/text2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/text3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

代码将文本添加到textview:

protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);
            var 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;
        }

结果图像:

另外,我还尝试将有关向textview添加文本的代码放入按钮的click事件中,得到了相同的结果。

相关问题