C# 从使用方法外部变量的其他类调用方法
我有个问题。我在这样的类中有一个方法:C# 从使用方法外部变量的其他类调用方法,c#,android-fragments,xamarin.android,C#,Android Fragments,Xamarin.android,我有个问题。我在这样的类中有一个方法: public void UpdateActionBar(int CurrentFragmentNum) { if (CurrentFragmentNum == 1) { btnBack.Visibility = ViewStates.Invisible; btnNext.Visibility = ViewStates.Invisible; } else { btnBac
public void UpdateActionBar(int CurrentFragmentNum)
{
if (CurrentFragmentNum == 1)
{
btnBack.Visibility = ViewStates.Invisible;
btnNext.Visibility = ViewStates.Invisible;
}
else
{
btnBack.Visibility = ViewStates.Visible;
btnNext.Visibility = ViewStates.Visible;
}
if (CurrentFragmentNum == 3)
{
btnNext.Text = "Finish";
}
else
{
btnNext.Text = "Next";
}
}
ActionBar_Setup fActionBarSetup = ActionBar_Setup.NewInstance();
ActionBar_Setup.Instance.UpdateActionBar(3);
现在在另一个类中,我这样调用此方法:
new ActionBar_Setup().UpdateActionBar(CurrentFragmentNum);
但正如您所见,我使用了两个变量:btnBack
和btnNext
当我从另一个类调用该方法时,这些变量为null,因为没有定义这些变量。但是我不能移动为这些变量赋值的行,因为它使用了视图变量。下面是代码来说明我的意思:
public class ActionBar_Setup : Android.Support.V4.App.Fragment
{
Button btnBack;
Button btnNext;
public int CurrentFragmentNum = 1;
public int PreviousFragmentNum = 1;
public string Direction;
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.Inflate(Resource.Layout.setup_nav_bar, container, false);
btnBack = view.FindViewById<Button>(Resource.Id.btnBack);
btnNext = view.FindViewById<Button>(Resource.Id.btnNext);
btnBack.Click += btnBack_Click;
btnNext.Click += btnNext_Click;
UpdateActionBar(CurrentFragmentNum);
return view;
}
public void btnBack_Click(object sender, EventArgs e)
{
if (CurrentFragmentNum > 1)
{
PreviousFragmentNum = CurrentFragmentNum;
CurrentFragmentNum -= 1;
Direction = "Backwards";
UpdateActionBar(CurrentFragmentNum);
(Activity as MainActivity)?.ShowFragment(CurrentFragmentNum, PreviousFragmentNum, Direction);
}
}
public void btnNext_Click(object sender, EventArgs e)
{
if (CurrentFragmentNum < 3)
{
PreviousFragmentNum = CurrentFragmentNum;
CurrentFragmentNum += 1;
Direction = "Forwards";
UpdateActionBar(CurrentFragmentNum);
(Activity as MainActivity)?.ShowFragment(CurrentFragmentNum, PreviousFragmentNum, Direction);
}
}
public void UpdateActionBar(int CurrentFragmentNum)
{
if (CurrentFragmentNum == 1)
{
btnBack.Visibility = ViewStates.Invisible;
btnNext.Visibility = ViewStates.Invisible;
}
else
{
btnBack.Visibility = ViewStates.Visible;
btnNext.Visibility = ViewStates.Visible;
}
if (CurrentFragmentNum == 3)
{
btnNext.Text = "Finish";
}
else
{
btnNext.Text = "Next";
}
}
}
公共类ActionBar\u设置:Android.Support.V4.App.Fragment
{
按钮btnBack;
按钮btnNext;
public int CurrentFragmentNum=1;
public int PreviousFragmentNum=1;
公共字符串方向;
创建时公共覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态)
{
视图=充气机。充气(Resource.Layout.setup\u导航栏,容器,false);
btnBack=view.findviewbyd(Resource.Id.btnBack);
btnNext=view.findviewbyd(Resource.Id.btnNext);
btnBack.Click+=btnBack\u Click;
btnNext.Click+=btnNext\u Click;
UpdateActionBar(CurrentFragmentNum);
返回视图;
}
公共无效btnBack\u单击(对象发送者,事件参数e)
{
如果(CurrentFragmentNum>1)
{
PreviousFragmentNum=当前FragmentNum;
CurrentFragmentNum-=1;
方向=“向后”;
UpdateActionBar(CurrentFragmentNum);
(活动作为主活动)?.ShowFragment(CurrentFragmentNum、PreviousFragmentNum、Direction);
}
}
public void b单击下一步(对象发送者,事件参数e)
{
如果(CurrentFragmentNum<3)
{
PreviousFragmentNum=当前FragmentNum;
CurrentFragmentNum+=1;
方向=“向前”;
UpdateActionBar(CurrentFragmentNum);
(活动作为主活动)?.ShowFragment(CurrentFragmentNum、PreviousFragmentNum、Direction);
}
}
public void UpdateActionBar(int CurrentFragmentNum)
{
如果(CurrentFragmentNum==1)
{
btnBack.Visibility=ViewStates.Invisible;
btnNext.Visibility=ViewStates.Invisible;
}
其他的
{
btnBack.Visibility=ViewStates.Visible;
btnNext.Visibility=ViewStates.Visible;
}
如果(CurrentFragmentNum==3)
{
btnNext.Text=“完成”;
}
其他的
{
btnNext.Text=“下一步”;
}
}
}
如何解决这个问题,以便在不同的类中调用该函数?您可以将参数作为GET或POST值从视图传递给按钮事件,并直接从视图将值分配给方法。根据Ahmed Moawad的说法,它们有多种方法可以实现您想要的结果。另一种可能的解决方案是在类中添加btnBack和btnNext字段。然后将值分配给字段。一旦你执行了这个方法。您应该能够获取调用方法中的字段
我想说的是将UpdateActionBar方法与表单操作分开。因此,您将像以前一样将UpdateActionBar放在一个单独的类中。但是您的btnBack和btnNext字段可能应该命名为其他名称。然后在调用方法中,将字段的结果分配给btnNext和btnBack。您可以进行操作栏设置单例:
public class ActionBar_Setup : Android.Support.V4.App.Fragment
{
public static ActionBar_Setup Instance;
public static ActionBar_Setup NewInstance()
{
if (Instance== null)
{
Instance= new ActionBar_Setup();
}
return Instance;
}
...
}
然后,当您创建ActionBar\u设置时,如下所示:
public void UpdateActionBar(int CurrentFragmentNum)
{
if (CurrentFragmentNum == 1)
{
btnBack.Visibility = ViewStates.Invisible;
btnNext.Visibility = ViewStates.Invisible;
}
else
{
btnBack.Visibility = ViewStates.Visible;
btnNext.Visibility = ViewStates.Visible;
}
if (CurrentFragmentNum == 3)
{
btnNext.Text = "Finish";
}
else
{
btnNext.Text = "Next";
}
}
ActionBar_Setup fActionBarSetup = ActionBar_Setup.NewInstance();
ActionBar_Setup.Instance.UpdateActionBar(3);
最后在其他类中调用UpdateActionBar方法,如下所示:
public void UpdateActionBar(int CurrentFragmentNum)
{
if (CurrentFragmentNum == 1)
{
btnBack.Visibility = ViewStates.Invisible;
btnNext.Visibility = ViewStates.Invisible;
}
else
{
btnBack.Visibility = ViewStates.Visible;
btnNext.Visibility = ViewStates.Visible;
}
if (CurrentFragmentNum == 3)
{
btnNext.Text = "Finish";
}
else
{
btnNext.Text = "Next";
}
}
ActionBar_Setup fActionBarSetup = ActionBar_Setup.NewInstance();
ActionBar_Setup.Instance.UpdateActionBar(3);
从外部类调用此方法时,您希望得到什么结果?最简单的修复方法是简单地检查控件是否已设置,如果未设置,则退出该方法,即:
if(btnBack==null | | btnNext==null)返回代码>它们将始终为空。我想在类外调用该方法时更改这些按钮的可见性。所以我需要一些东西来再次定义方法中的值!你能给我一个例子吗?是的,但我需要在另一个类中调用UpdateActionBar。不是在ActionBar_Setup.cs中,或者我不明白你的意思!?您可以这样调用ActionBar\u Setup.Instance.UpdateActionBar(3);在不同的类中,而不是在ActionBar_Setup.cs中。您可以尝试一下,如果您有任何问题,请告诉我。我已将其添加到我的代码中,但当我调用该方法时,btnBack
和btnNext
仍然是null
?!