微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从代码 Xamarin 将 TextView 添加到 StackView?

如何解决如何从代码 Xamarin 将 TextView 添加到 StackView?

我正在使用 Xamarin StackView,但是当我尝试向它添加一个孩子时,它给了我一个错误 代码: xml:

<StackView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:id="@+id/exchangesstack"
            android:layout_column="0"
            android:layout_row="4"/>

c#:

TextView txt = new TextView(BaseContext);
txt.Text = "TEST";
StackView stck = (StackView)FindViewById(Resource.Id.exchangesstack);
stck.AddView(txt);

错误

java.lang.UnsupportedOperationException: 'addView(View) is not supported in AdapterView'

我试图用谷歌搜索问题和错误,但我一无所获...

解决方法

StackView 是一种可以包含图像的视图,您可以以堆栈形式显示图像,也可以上下滚动图像。您可以在 Adapter 中创建一个新视图,而不是直接将 Textview 添加到 StackView。

型号:

 public class StackItem
{
    public string itemText { get; set; }
    public int itemPhoto { get; set; }
    public StackItem(string text,int photo)
    {
        this.itemPhoto = photo;
        this.itemText = text;
    }
}

适配器:

public class StackItemAdapter : BaseAdapter<StackItem>
{
    private List<StackItem> sList;
    private Context sContext;
    public StackItemAdapter(Context context,List<StackItem> list)
    {

        this.sList = list;
        this.sContext = context;
    }

    public override StackItem this[int position]
    {
        get
        {
            return sList[position];
        }
    }
    public override int Count
    {
        get
        {
            return sList.Count;
        }

    }
    public override long GetItemId(int position)
    {
        return position;
    }

    public override View GetView(int position,View convertView,ViewGroup parent)
    {
        View row = convertView;
        if (row == null)
        {
            row = LayoutInflater.From(sContext).Inflate(Resource.Layout.layout1,null,false);
        }
        var m = sList[position];
        if (m != null)
        {
            TextView text = row.FindViewById<TextView>(Resource.Id.textView1);
            ImageView img = row.FindViewById<ImageView>(Resource.Id.imageView1);
            text.Text = sList[position].itemText;
            img.SetImageResource(sList[position].itemPhoto);
        }
        return row;
    }

}

StackView 的主要布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
android:layout_height="match_parent">
<StackView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/exchangesStack"
        android:layout_column="0"
        android:layout_row="4"/>
</RelativeLayout>

您创建的新视图包含适配器的 TextView:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView1"/>
</FrameLayout >

主要活动:

public class MainActivity : AppCompatActivity
{
    private StackView exchangesStack;
    private List<StackItem> stackItems;
    StackItemAdapter adapter;
    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);

        stackItems = new List<StackItem>();
        stackItems.Add(new StackItem("dog",Resource.Drawable.dog));
        stackItems.Add(new StackItem("pink",Resource.Drawable.pink));
        stackItems.Add(new StackItem("walrus",Resource.Drawable.walrus));
        stackItems.Add(new StackItem("lighthouse",Resource.Drawable.lighthouse));
        stackItems.Add(new StackItem("coffee",Resource.Drawable.coffee));


        exchangesStack = FindViewById<StackView>(Resource.Id.exchangesStack);
        adapter = new StackItemAdapter(this,stackItems);
        exchangesStack.Adapter = adapter;
        exchangesStack.ItemClick += ExchangesStack_ItemClick;

     
    }

    private void ExchangesStack_ItemClick(object sender,AdapterView.ItemClickEventArgs e)
    {
        var select = stackItems[e.Position].itemText;
        Android.Widget.Toast.MakeText(this,select,Android.Widget.ToastLength.Long).Show();
    }

    public override void OnRequestPermissionsResult(int requestCode,string[] permissions,[GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode,permissions,grantResults);

        base.OnRequestPermissionsResult(requestCode,grantResults);
    }
}

截图:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。