c# - 在 Xamarin android 活动之间传递数据
问题描述
我正在尝试使用在两个活动之间传递数据Intents
,但是当我尝试从前一个活动中获取数据时,当我在视图上打印它时它只给我一个值 0。
我已经搜索了很长时间,但我找到的所有内容都不存在或已被弃用:(
第一活动:
using System;
using Android.App;
using Android.Content;
using Android.Media;
using Android.OS;
using Android.Widget;
namespace PayrollCalculator
{
[Activity(Label = "FirstActivity")]
public class FirstActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.first_activity_layout);
//payroll month
Spinner spinner = FindViewById<Spinner>(Resource.Id.monthSpinner);
var adapter = ArrayAdapter.CreateFromResource(this, Resource.Array.month_array, Android.Resource.Layout.SimpleSpinnerItem);
adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
spinner.Adapter = adapter;
int monthsRemaining = 11;
if (spinner.SelectedItem.ToString() == "January")
{
monthsRemaining = 11;
}
if (spinner.SelectedItem.ToString() == "Febuary")
{
monthsRemaining = 10;
}
if (spinner.SelectedItem.ToString() == "March")
{
monthsRemaining = 9;
}
if (spinner.SelectedItem.ToString() == "April")
{
monthsRemaining = 8;
}
if (spinner.SelectedItem.ToString() == "May")
{
monthsRemaining = 7;
}
if (spinner.SelectedItem.ToString() == "June")
{
monthsRemaining = 6;
}
if (spinner.SelectedItem.ToString() == "July")
{
monthsRemaining = 5;
}
if (spinner.SelectedItem.ToString() == "August")
{
monthsRemaining = 4;
}
if (spinner.SelectedItem.ToString() == "September")
{
monthsRemaining = 3;
}
if (spinner.SelectedItem.ToString() == "October")
{
monthsRemaining = 2;
}
if (spinner.SelectedItem.ToString() == "November")
{
monthsRemaining = 1;
}
if (spinner.SelectedItem.ToString() == "December")
{
monthsRemaining = 0;
}
//marital status
Spinner spinner2 = FindViewById<Spinner>(Resource.Id.statusSpinner);
var adapter2 = ArrayAdapter.CreateFromResource(this, Resource.Array.status_array, Android.Resource.Layout.SimpleSpinnerItem);
adapter2.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
spinner2.Adapter = adapter2;
//disabled
RadioButton disabledTrue = FindViewById<RadioButton>(Resource.Id.radioDisabledTrue);
RadioButton disabledFalse = FindViewById<RadioButton>(Resource.Id.radioDisabledFalse);
//spouse disabled
EditText errorView = FindViewById<EditText>(Resource.Id.erroreditview);
RadioButton spouseDisabledTrue = FindViewById<RadioButton>(Resource.Id.radioSpouseDisabledTrue);
RadioButton spouseDisabledFalse = FindViewById<RadioButton>(Resource.Id.radioSpouseDisabledFalse);
spouseDisabledTrue.Click += (sender, e) =>
{
disabledSpouseCan();
};
spouseDisabledFalse.Click += (sender, e) =>
{
disabledSpouseCan();
};
//kidsunder18 or in education 2000
EditText kidsU18 = FindViewById<EditText>(Resource.Id.u18kids);
int.TryParse(kidsU18.Text, out int _kidsU18);
//over 18 HE 8000
EditText over18inHE = FindViewById<EditText>(Resource.Id.over18inHE);
int.TryParse(over18inHE.Text, out int _over18inHE);
//disabled 6000
EditText disabledChildren = FindViewById<EditText>(Resource.Id.disabledChildren);
int.TryParse(disabledChildren.Text, out int _disabledChildren);
//disabled HE 14000
EditText disabledChildreninHE = FindViewById<EditText>(Resource.Id.disabledChildreninHE);
int.TryParse(disabledChildreninHE.Text, out int _disabledChildreninHE);
double disabledDeduction = 0.00;
if (disabledTrue.Checked == true)
{
disabledDeduction = 6000.00;
}
double disabledSpouseDeduction = 0.00;
if (spouseDisabledTrue.Checked == true)
{
disabledSpouseDeduction = 3500.00;
}
double spouseNoIncomeDeduction = 0.00;
if (spinner2.SelectedItem.ToString() == "Married and spouse not working")
{
spouseNoIncomeDeduction = 4000.00;
}
double totalFamilyDeductions = (_kidsU18 * 2000) + (_over18inHE * 8000) + (_disabledChildren * 6000) + (_disabledChildreninHE * 14000) + disabledDeduction + disabledSpouseDeduction + spouseNoIncomeDeduction;
Button _firstContinue = FindViewById<Button>(Resource.Id.continuePayroll1);
_firstContinue.Click += (sender, e) =>
{
if (disabledSpouseCan() == false)
{
Toast toast = Toast.MakeText(this, "Check the error above", ToastLength.Short);
toast.Show();
}
else
{
PlayButton_Click(sender, e);
Intent intent = new Intent(this, typeof(SecondActivity));
intent.PutExtra("totalFamilyDeductions", totalFamilyDeductions);
intent.PutExtra("monthsRemaining", monthsRemaining);
StartActivity(intent);
}
};
void PlayButton_Click(object sender, EventArgs e)
{
MediaPlayer _player = MediaPlayer.Create(this, Resource.Drawable.buttonclick);
_player.Start();
}
bool disabledSpouseCan()
{
if ((spinner2.SelectedItem.ToString() == "Single" | spinner2.SelectedItem.ToString() == "Divorce/Widower/Widow") && (spouseDisabledTrue.Checked == true))
{
errorView.Error = "You don't have a spouse";
return false;
}
else
{
errorView.Error = null;
return true;
}
}
}
}
}
第二活动:
using System;
using System.Text.RegularExpressions;
using Android.App;
using Android.Content;
using Android.Media;
using Android.OS;
using Android.Text;
using Android.Widget;
namespace PayrollCalculator
{
[Activity(Label = "SecondActivity")]
public class SecondActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.second_activity_layout);
//currentmonthremu
EditText currentMonthRemuneration_ = FindViewById<EditText>(Resource.Id.currentMonthRemuneration);
currentMonthRemuneration_.SetFilters(new IInputFilter[] { new DecimalDigitsInputFilter(12, 2) });
double _currentMonthRemuneration = 0.00;
currentMonthRemuneration_.AfterTextChanged += (sender, args) =>
{
double.TryParse(currentMonthRemuneration_.Text, out _currentMonthRemuneration);
};
//EPF
EditText EPFContribution_ = FindViewById<EditText>(Resource.Id.EPFContribution);
EPFContribution_.SetFilters(new IInputFilter[] { new DecimalDigitsInputFilter(12, 2) });
double _EPFContribution = 0.00;
EPFContribution_.AfterTextChanged += (sender, args) =>
{
double.TryParse(EPFContribution_.Text, out _EPFContribution);
Validate(_EPFContribution, 4000, EPFContribution_);
};
//BIK
EditText BIK_ = FindViewById<EditText>(Resource.Id.BIK);
BIK_.SetFilters(new IInputFilter[] { new DecimalDigitsInputFilter(12, 2) });
double _BIK = 0.00;
BIK_.AfterTextChanged += (sender, args) =>
{
double.TryParse(BIK_.Text, out _BIK);
};
//VOLA
EditText VOLA_ = FindViewById<EditText>(Resource.Id.VOLA);
VOLA_.SetFilters(new IInputFilter[] { new DecimalDigitsInputFilter(12, 2) });
double _VOLA = 0.00;
VOLA_.AfterTextChanged += (sender, args) =>
{
double.TryParse(VOLA_.Text, out _VOLA);
};
double _EPFCombined =+ _EPFContribution;
//this is where I try to get the data from the previous activity to display on my layout
double _totalFamilyDeductions = Intent.GetDoubleExtra("totalFamilyDeductions", 0.00);
TextView textView111 = FindViewById<TextView>(Resource.Id.textView111);
textView111.Text = "" + _totalFamilyDeductions;
Button _secondContinue = FindViewById<Button>(Resource.Id.continuePayroll2);
_secondContinue.Click += (sender, e) =>
{
if (Validate(_EPFContribution, 4000, EPFContribution_) == false)
{
Toast toast = Toast.MakeText(this, "Please make sure EPF is below RM4000", ToastLength.Short);
toast.Show();
}
else
{
int _monthsRemaining = Intent.GetIntExtra("monthsRemaining", 11);
PlayButton_Click(sender, e);
Intent intent = new Intent(this, typeof(ThirdActivity));
intent.PutExtra("currentMonthRemuneration", _currentMonthRemuneration);
intent.PutExtra("EPFContribution", _EPFContribution);
intent.PutExtra("BIK", _BIK);
intent.PutExtra("VOLA", _VOLA);
intent.PutExtra("EPFCombined", _EPFCombined);
intent.PutExtra("totalFamilyDeductions", _totalFamilyDeductions);
intent.PutExtra("monthsRemaining", _monthsRemaining);
StartActivity(intent);
}
};
void PlayButton_Click(object sender, EventArgs e)
{
MediaPlayer _player = MediaPlayer.Create(this, Resource.Drawable.buttonclick);
_player.Start();
}
}
bool Validate(double name, double value, EditText editText)
{
if (name > value)
{
editText.Error = "Cannot be greater than " + value;
return false;
}
else
{
return true;
}
}
}
public class DecimalDigitsInputFilter : Java.Lang.Object, IInputFilter
{
readonly string regexStr = string.Empty;
public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero)
{
regexStr = "^[0-9]{0," + digitsBeforeZero + "}([.][0-9]{0," + (digitsAfterZero - 1) + "})?$";
}
public Java.Lang.ICharSequence FilterFormatted(Java.Lang.ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
{
Regex regex = new Regex(regexStr);
if (regex.IsMatch(dest.ToString()) || dest.ToString().Equals(""))
{
if (dest.ToString().Length < 12 && source.ToString() != ".")
{
return new Java.Lang.String(source.ToString());
}
else if (source.ToString() == ".")
{
return new Java.Lang.String(source.ToString());
}
else if (dest.ToString().Length >= 13 && dest.ToString().Length <= 20)
{
return new Java.Lang.String(source.ToString());
}
else
{
return new Java.Lang.String(string.Empty);
}
}
return new Java.Lang.String(string.Empty);
}
}
}
当我尝试_totalFamilyDeductions
在视图上显示时,它只显示 0。
任何帮助表示赞赏!
解决方案
从您上面的代码中,我假设它应该是:
private int _kidsU18;
private int _over18inHE;
private int _disabledChildren;
private int _disabledChildreninHE;
double disabledDeduction = 0.00;
double disabledSpouseDeduction = 0.00;
double spouseNoIncomeDeduction = 0.00;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.first_activity_layout);
//payroll month
Spinner spinner = FindViewById<Spinner>(Resource.Id.monthSpinner);
var adapter = ArrayAdapter.CreateFromResource(this, Resource.Array.month_array, Android.Resource.Layout.SimpleSpinnerItem);
adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
spinner.Adapter = adapter;
int monthsRemaining = 11;
if (spinner.SelectedItem.ToString() == "January")
{
monthsRemaining = 11;
}
if (spinner.SelectedItem.ToString() == "Febuary")
{
monthsRemaining = 10;
}
if (spinner.SelectedItem.ToString() == "March")
{
monthsRemaining = 9;
}
if (spinner.SelectedItem.ToString() == "April")
{
monthsRemaining = 8;
}
if (spinner.SelectedItem.ToString() == "May")
{
monthsRemaining = 7;
}
if (spinner.SelectedItem.ToString() == "June")
{
monthsRemaining = 6;
}
if (spinner.SelectedItem.ToString() == "July")
{
monthsRemaining = 5;
}
if (spinner.SelectedItem.ToString() == "August")
{
monthsRemaining = 4;
}
if (spinner.SelectedItem.ToString() == "September")
{
monthsRemaining = 3;
}
if (spinner.SelectedItem.ToString() == "October")
{
monthsRemaining = 2;
}
if (spinner.SelectedItem.ToString() == "November")
{
monthsRemaining = 1;
}
if (spinner.SelectedItem.ToString() == "December")
{
monthsRemaining = 0;
}
//marital status
Spinner spinner2 = FindViewById<Spinner>(Resource.Id.statusSpinner);
var adapter2 = ArrayAdapter.CreateFromResource(this, Resource.Array.status_array, Android.Resource.Layout.SimpleSpinnerItem);
adapter2.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
spinner2.Adapter = adapter2;
spinner2.ItemSelected += Spinner2_ItemSelected;
//disabled
RadioButton disabledTrue = FindViewById<RadioButton>(Resource.Id.radioDisabledTrue);
disabledTrue.CheckedChange += RadioButton_CheckedChanged;
RadioButton disabledFalse = FindViewById<RadioButton>(Resource.Id.radioDisabledFalse);
//spouse disabled
EditText errorView = FindViewById<EditText>(Resource.Id.erroreditview);
RadioButton spouseDisabledTrue = FindViewById<RadioButton>(Resource.Id.radioSpouseDisabledTrue);
spouseDisabledTrue.CheckedChange += RadioButton_CheckedChanged;
RadioButton spouseDisabledFalse = FindViewById<RadioButton>(Resource.Id.radioSpouseDisabledFalse);
spouseDisabledTrue.Click += (sender, e) =>
{
disabledSpouseCan();
};
spouseDisabledFalse.Click += (sender, e) =>
{
disabledSpouseCan();
};
//kidsunder18 or in education 2000
EditText kidsU18 = FindViewById<EditText>(Resource.Id.u18kids);
kidsU18.TextChanged += EditText_TextChanged;
//over 18 HE 8000
EditText over18inHE = FindViewById<EditText>(Resource.Id.over18inHE);
over18inHE.TextChanged += EditText_TextChanged;
//disabled 6000
EditText disabledChildren = FindViewById<EditText>(Resource.Id.disabledChildren);
disabledChildren.TextChanged += EditText_TextChanged;
//disabled HE 14000
EditText disabledChildreninHE = FindViewById<EditText>(Resource.Id.disabledChildreninHE);
disabledChildreninHE.TextChanged += EditText_TextChanged;
Button _firstContinue = FindViewById<Button>(Resource.Id.continuePayroll1);
_firstContinue.Click += (sender, e) =>
{
if (disabledSpouseCan() == false)
{
Toast toast = Toast.MakeText(this, "Check the error above", ToastLength.Short);
toast.Show();
}
else
{
PlayButton_Click(sender, e);
double totalFamilyDeductions = (_kidsU18 * 2000) + (_over18inHE * 8000) + (_disabledChildren * 6000) + (_disabledChildreninHE * 14000) + disabledDeduction + disabledSpouseDeduction + spouseNoIncomeDeduction;
Intent intent = new Intent(this, typeof(SecondActivity));
intent.PutExtra("totalFamilyDeductions", totalFamilyDeductions);
intent.PutExtra("monthsRemaining", monthsRemaining);
StartActivity(intent);
}
};
void PlayButton_Click(object sender, EventArgs e)
{
MediaPlayer _player = MediaPlayer.Create(this, Resource.Drawable.buttonclick);
_player.Start();
}
bool disabledSpouseCan()
{
if ((spinner2.SelectedItem.ToString() == "Single" | spinner2.SelectedItem.ToString() == "Divorce/Widower/Widow") && (spouseDisabledTrue.Checked == true))
{
errorView.Error = "You don't have a spouse";
return false;
}
else
{
errorView.Error = null;
return true;
}
}
}
private void Spinner2_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
{
if (((Spinner)sender).SelectedItem.ToString() == "Married and spouse not working")
{
spouseNoIncomeDeduction = 4000.00;
}
}
private void RadioButton_CheckedChanged(object sender, CompoundButton.CheckedChangeEventArgs e)
{
RadioButton radioButton = sender as RadioButton;
if (e.IsChecked)
{
switch (radioButton.Id)
{
case Resource.Id.radioDisabledTrue:
disabledDeduction = 6000.00;
break;
break;
case Resource.Id.radioSpouseDisabledTrue:
disabledSpouseDeduction = 3500.00;
break;
default:
break;
}
}
}
private void EditText_TextChanged(object sender, TextChangedEventArgs e)
{
EditText editText = sender as EditText;
switch (editText.Id)
{
case Resource.Id.u18kids:
_kidsU18 = int.Parse(editText.Text);
break;
case Resource.Id.over18inHE:
_over18inHE = int.Parse(editText.Text);
break;
case Resource.Id.disabledChildren:
_disabledChildren = int.Parse(editText.Text);
break;
case Resource.Id.disabledChildreninHE:
_disabledChildreninHE = int.Parse(editText.Text);
break;
default:
break;
}
}
由于不知道你的逻辑,你可能需要自己调整,但有一点要明确的是,如果你在输入或选择的时候改变了数据,你需要在相应的事件中改变数据。
推荐阅读
- aws-lambda - 将 aws lambda 与 java 和 Spring Cloud Functions 用于其他语言是一个好主意吗?
- java - 在 java eclipse 内存分析器中:获取堆转储对话框显示没有要获取的 PID
- reactjs - 使用 Sass (React) 在 Materialise 中更改主题颜色
- sql - 图像中的十六进制字节数组用空格填充,并且 - 在 INSERT 到表 postgresql 之后
- python - 是否可以不让用户关闭 Tkinter 窗口?
- python - 如何使用 Flask-SQLAlchemy 在应用程序上下文中创建和使用会话
- java - 使用 .replaceAll 函数从相反方向将字符串拆分为多个部分?JAVA
- javascript - Typescript 使用 forEach 或 map 丢失未定义的上下文
- javascript - Vue Test Utils 多个输入发出重置值
- python - 我没有从 sqlalchemy 查询中获得任何数据?