c# - 如何检索元素父容器的属性
问题描述
我在线性布局中有多个卡片视图,每张卡片中有两个复选框。如何获取我的复选框所在的容器(Cardview)的文本属性?
我浏览了 Xamarin.Android 文档,看看是否有办法访问元素的父级或容器。我看到 Xamarin.Forms 有一个 Element 类,可用于访问元素的父级。
我已尝试从 Cardview 捕获文本并将其放入字符串中,这将不起作用,因为文本可能会因检查复选框的 cardview 而异。
//Here are my initialisers
btnOrder = FindViewById<Button>(Resource.Id.btnOrder);
pancakeTypeSpnr = FindViewById<Spinner>(Resource.Id.pancaketypespnr);
pancakeStyleSpnr = FindViewById<Spinner>(Resource.Id.pancakestylespnr);
pancakeQuantitySpnr = FindViewById<Spinner>(Resource.Id.pancakequantityspnr);
cardSugar = FindViewById<CardView>(Resource.Id.cardSugar);
cardSugar.Click += CardSugar_Click;
cardLemonJuice = FindViewById<CardView>(Resource.Id.cardLemonJuice);
cardLemonJuice.Click += CardLemonJuice_Click;
cardGoldenSyrup = FindViewById<CardView>(Resource.Id.cardGoldenSyrup);
cardGoldenSyrup.Click += CardGoldenSyrup_Click;
cardMarmite = FindViewById<CardView>(Resource.Id.cardMarmite);
cardMarmite.Click += CardMarmite_Click;
cardStrawberries = FindViewById<CardView>(Resource.Id.cardStrawberries);
cardStrawberries.Click += CardStrawberries_Click;
cardChocolateSpread = FindViewById<CardView>(Resource.Id.cardChocolateSpread);
cardChocolateSpread.Click += CardChocolateSpread_Click;
cardBlueberries = FindViewById<CardView>(Resource.Id.cardBlueberries);
cardBlueberries.Click += CardBlueberries_Click;
//Topping checkbox reference
checkToppingSugar = FindViewById<CheckBox>(Resource.Id.checkToppingSugar);
checkToppingLemonJuice = FindViewById<CheckBox>(Resource.Id.checkToppingLemonJuice);
checkToppingGoldenSyrup = FindViewById<CheckBox>(Resource.Id.checkToppingGoldenSyrup);
checkToppingMarmite = FindViewById<CheckBox>(Resource.Id.checkToppingMarmite);
checkToppingStrawberries = FindViewById<CheckBox>(Resource.Id.checkToppingStrawberries);
checkToppingChocolateSpread = FindViewById<CheckBox>(Resource.Id.checkToppingChocolateSpread);
checkToppingBlueberries = FindViewById<CheckBox>(Resource.Id.checkToppingBlueberries);
//Filling checkbox reference
checkFillingSugar = FindViewById<CheckBox>(Resource.Id.checkFillingSugar);
checkFillingLemonJuice = FindViewById<CheckBox>(Resource.Id.checkFillingLemonJuice);
checkFillingGoldenSyrup = FindViewById<CheckBox>(Resource.Id.checkFillingGoldenSyrup);
checkFillingMarmite = FindViewById<CheckBox>(Resource.Id.checkFillingMarmite);
checkFillingStrawberries = FindViewById<CheckBox>(Resource.Id.checkFillingStrawberries);
checkFillingChocolateSpread = FindViewById<CheckBox>(Resource.Id.checkFillingChocolateSpread);
checkFillingBlueberries = FindViewById<CheckBox>(Resource.Id.checkFillingBlueberries);
The following is my Order button code
//Order button... Completes initial check to see if compulsary boxes have been checked, then compiles order
private void BtnOrder_Click(object sender, EventArgs e)
{
if (pancakeTypeSpnr.SelectedItemPosition == 0)
{
Toast.MakeText(this, "You must select a pancake type!",
ToastLength.Short).Show();
}
else if (pancakeStyleSpnr.SelectedItemPosition == 0)
{
Toast.MakeText(this, "You must select a pancake style!",
ToastLength.Short).Show();
}
else if (pancakeQuantitySpnr.SelectedItemPosition == 0)
{
Toast.MakeText(this, "You must order at least one pancake",
ToastLength.Short).Show();
}
else
{
/*This section takes all the checkboxes and checks them to see if they are checked. If they are, they are put into an array of checked boxes*/
CheckBox[] checkBoxesToppings = { checkToppingSugar, checkToppingLemonJuice, checkToppingGoldenSyrup, checkToppingMarmite, checkToppingStrawberries, checkToppingChocolateSpread, checkToppingBlueberries };
toppingsReturned = CheckDetails(checkBoxesToppings);
string toppings = "";
foreach (CheckBox toppingbox in toppingsReturned)
{
toppings = toppings + toppingbox.Tag.ToString() + "\n";
}
CheckBox[] checkBoxesFillings = { checkFillingSugar, checkFillingLemonJuice, checkFillingGoldenSyrup, checkFillingMarmite, checkFillingStrawberries, checkFillingChocolateSpread, checkFillingBlueberries };
fillingsReturned = CheckDetails(checkBoxesFillings);
string fillings = "";
foreach (CheckBox fillingbox in fillingsReturned)
{
fillings = fillings + fillingbox.Text.ToString() + "\n";
}
//This toast is for testing purposes only
string order = "The following has been added to your order:\n" +
pancakeQuantitySpnr.SelectedItem + "\n" +
"Pancake type: " + pancakeTypeSpnr.SelectedItem + "\n" +
"Pancake style: " + pancakeStyleSpnr.SelectedItem + "\n" +
"Fillings: " + "\n" + fillings +
"Toppings: " + "\n" + toppings;
Toast.MakeText(this, order, ToastLength.Long).Show();
}
}
private CheckBox[] CheckDetails(CheckBox[] details)
{
var checkedCheckboxes = new List<CheckBox>();
foreach (CheckBox cb in details)
{
if (cb.Checked == true)
{
checkedCheckboxes.Add(cb);
}
else continue;
}
CheckBox[] ticked = checkedCheckboxes.ToArray();
return ticked;
}
单击订单按钮时,我希望 BtnOrder_Click 方法代码能够判断从哪张卡片(即糖、巧克力酱)中单击了顶部/填充复选框。
解决方案
我已经尝试从 Cardview 捕获文本并将其放入字符串中,这不起作用,因为文本可能会因检查复选框的 cardview 而异。
我可以得到如下cardview的文本。It works well when the checkbox is selected and the text changed.
1.根据你的TextViews的id获取文本
var str = textView.Text;
您提供的代码没有显示如何更改文本,我使用下面的代码进行测试。文本视图在 cardSugar Cardview 中。
var textView = FindViewById<TextView>(Resource.Id.textView);
var checkToppingSugar = FindViewById<CheckBox>(Resource.Id.checkToppingSugar);
checkToppingSugar.Click += (o, e) =>
{
if (checkToppingSugar.Checked)
{
Toast.MakeText(this, "Selected", ToastLength.Short).Show();
textView.Text = "textView Topping Selected";
}
else
{
Toast.MakeText(this, "Not selected", ToastLength.Short).Show();
textView.Text = "textView Topping Not selected";
}
};
2.通过foreach线性布局中的所有元素获取文本。它需要与您定义的布局相匹配。您可以参考我项目中的布局。我在输出窗口上输出结果。
var linearLayout = FindViewById<LinearLayout>(Resource.Id.linearlayout_view);
for (int i = 0; i < linearLayout.ChildCount; i++)
{
View child = linearLayout.GetChildAt(i);
if (child.GetType() == typeof(CardView))
{
var viewGroup = ((ViewGroup)child).GetChildAt(0);
for (int j = 0; j < ((ViewGroup)viewGroup).ChildCount; j++)
{
var viewGroup2 = ((ViewGroup)viewGroup).GetChildAt(j);
if (viewGroup2.GetType() == typeof(TextView))
{
System.Diagnostics.Debug.WriteLine(viewGroup2.GetType().ToString() + ": " + ((TextView)viewGroup2).Text);
}
}
}
}
单击订单按钮时,我希望 BtnOrder_Click 方法代码能够判断从哪张卡片(即糖、巧克力酱)中单击了顶部/填充复选框。
我建议您将复选框放在 Cardview 中,以便我们可以连接它们。当您选中下面的复选框时,您可以获得卡片视图。
for (int i = 0; i < linearLayout.ChildCount; i++)
{
View child = linearLayout.GetChildAt(i);
if (child.GetType() == typeof(CardView))
{
var viewGroup = ((ViewGroup)child).GetChildAt(0);
for (int j = 0; j < ((ViewGroup)viewGroup).ChildCount; j++)
{
var viewGroup2 = ((ViewGroup)viewGroup).GetChildAt(j);
if (viewGroup2.GetType() == typeof(CheckBox))
{
if (((CheckBox)viewGroup2).Checked)
{
System.Diagnostics.Debug.WriteLine(((CardView)child));
}
}
}
}
}
结果:最后一次,carduger 输出两次,因为我检查了 carduger 的两个复选框(Topping 和 Filling)。
您可以从 GitHub 的 Cardview/AndroidDemo 文件夹下载以供参考。 https://github.com/WendyZang/Test.git
推荐阅读
- laravel - Laravel Eloquent“在 null 上调用成员函数 pluck()”错误
- r - 使用 R 将聚合应用于定义的函数
- javascript - 如何在谷歌地图上绘制多个标记?
- php - PHP - 组合数组的折线图
- python - 通过 Paramiko 的 SFTPClient 的无密码连接不起作用
- c# - 检查字典中是否有给定的字符串
- sql - 如何从 PostgresSQL 中的 MAX() 聚合函数中获取两个值
- python - 如何计算熊猫数据框中列值更改的频率
- java - 插入和搜索二叉搜索树
- programming-languages - Ada 如何实现 Packages?