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
?!