如何向特定膨胀元素的子元素添加元素?

时间:2017-02-23 16:08:39

标签: c# android xamarin layout-inflater

我正在处理一个简单的时间表应用程序,我将线性布局和主题表示为按钮。我想通过通货膨胀以编程方式生成日期和主题,所以我为一天元素和主题创建了2个axm:

标题日:

dist

主题:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/linearLayoutDay"
android:layout_margin="20px">
<Button
android:text="Day"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/IDDay"
android:textAlignment="center"
android:layout_marginBottom="20px" />
</LinearLayout>

我可以为任意数量的新日元素充气,以便将它们添加到预定义的线性布局中,然后我可以使用以下代码添加主题:

   <?xml version="1.0" encoding="utf-8"?>
   <Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:text="Large Text1"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/textView" />

我的问题是我想将按钮添加到表示日期的axml的线性布局子项,类似于(day.Id.specificElement)。我可以直接引用infalted day元素的 Linear Layout 子元素:

//adding a new day element
View day = LayoutInflater.Inflate(Resource.Layout.DayElement, FindViewById<LinearLayout>(Resource.Id.linearLayoutTimeTable));

//adding a subject to the day
View subject = LayoutInflater.Inflate(Resource.Layout.SubjectEntry, FindViewById<LinearLayout>(day.Id));

但是这样所有的butons都被添加到第一天的元素中,我需要一个方法来将这个infalted按钮元素添加到先前膨胀的元素的子元素中。我该怎么做呢?

更新

我还尝试将上下文设置为第二天元素,但按钮被添加到第一个元素中:

View subject = LayoutInflater.Inflate(Resource.Layout.SubjectEntry, FindViewById<LinearLayout>(Resource.Id.linearLayoutDay));

更新

关于 LinearLayout layout 的代码似乎并不意味着在指定的父视图的视图中找到具有指定ID 的视图(在本例中为day2) ),正如我先前所怀疑的那样。 来自C#Unity背景,其中每个元素都可以以类似的方式加入,我希望在单独的日元素中有许多这样的元素具有相同的ID(所以day1.linearLayoutDay,day2.linearLayoutDay等)所以我可以访问对他们来说很容易,但这不是C#Xamarin.Android的运作方式。我做错了什么?

1 个答案:

答案 0 :(得分:0)

我想我找到了一个解决方案,虽然它并不优雅,但它现在似乎有效,所以我决定将它发布在这里,万一有人发现它有用。 经过几个小时的谷歌搜索,我意识到我的Xamarin xml知识根本不足以解决这个问题,所以我发掘了我的Unity Code-Behind knoweldge并提出了一些非常简单的东西。以下代码为预先存在的父布局生成5个线性布局,然后使用设计的xml文件中的4个按钮填充它们:

for (int i = 0; i < 5; i++)
        {
            //add new elements to a collection
            week.Add(LayoutInflater.Inflate(Resource.Layout.DayElement, FindViewById<LinearLayout>(Resource.Id.linearLayoutTimeTable)));
            //define new LL
            LinearLayout lin = new LinearLayout(this);
            //assign the new LL the desired xml
            lin = FindViewById<LinearLayout>(Resource.Id.linearLayoutDay);
            //set its ID to smth fathomable
            lin.Id = i;

            //add 4 subjects of the predefined xml to every LL
            for (int j = 0; j < 4; j++)
            {
                View subject = LayoutInflater.Inflate(Resource.Layout.SubjectEntry, FindViewById<LinearLayout>(i));
            }
        }   

这似乎解决了如何使用可以正确引用的唯一ID来扩充相同xml元素的问题。 随意批评这个,我仍然对如何从xml优雅地制作这个(如果有可能)感兴趣。当然,人们不得不对此进行数据绑定。