0
votes

Appel d'une méthode à partir d'une classe différente qui utilise des variables en dehors de la méthode

J'ai un problème. J'ai une méthode dans une classe comme celle-ci:

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";
        }
    }
}

Maintenant, dans une autre classe, j'appelle cette méthode comme ceci:

new ActionBar_Setup().UpdateActionBar(CurrentFragmentNum);

Mais comme vous an voir j'utilise les 2 variables: btnBack et btnNext Ces variables sont nulles lorsque j'appelle la méthode à partir d'une classe différente, car alors les variables ne sont pas définies. Mais je ne peux pas déplacer les lignes qui attribuent une valeur à ces variables car il utilise une variable de vue. Voici le code pour montrer ce que je veux dire:

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";
    }
}

Comment puis-je résoudre ce problème, afin que je puisse appeler la fonction dans une classe différente?


2 commentaires

Quels résultats voulez-vous lorsque vous appelez cette méthode à partir d'une classe externe? La solution la plus simple consiste simplement à vérifier si les contrôles sont définis et à quitter la méthode s'ils ne le sont pas, c'est-à-dire: if (btnBack == null || btnNext == null) return;


Ils seront toujours nuls alors. Je souhaite modifier la visibilité de ces boutons lorsque j'appelle la méthode en dehors de la classe. J'ai donc besoin de quelque chose qui définit à nouveau la valeur à l'intérieur de la méthode!


3 Réponses :


0
votes

vous pouvez passer des paramètres à vos événements de bouton à partir de la vue en tant que valeurs GET ou POST sur le bouton et attribuer les valeurs à votre méthode directement à partir des vues


1 commentaires

Pouvez-vous me fournir un échantillon?



0
votes

Il existe plusieurs façons de réaliser ce que vous voulez selon ce que dit Ahmed Moawad. Une autre solution possible serait d'ajouter un btnBack et un champ btnNext dans la classe. Attribuez ensuite les valeurs aux champs. Une fois que vous exécutez la méthode. Vous devriez pouvoir saisir les champs dans la méthode d'appel.

Je dirais que séparez la méthode UpdateActionBar des actions du formulaire. Ainsi, vous aurez votre UpdateActionBar dans une classe distincte comme vous le faites. Mais vos champs btnBack et btnNext devraient probablement être nommés autrement. Ensuite, dans la méthode d'appel, attribuez les résultats de vos champs à btnNext et btnBack.


0 commentaires

1
votes

vous pouvez créer votre ActionBar_Setup singleton:

ActionBar_Setup.Instance.UpdateActionBar(3);

puis lorsque vous créez le ActionBar_Setup comme ceci:

ActionBar_Setup fActionBarSetup = ActionBar_Setup.NewInstance();

enfin appeler la méthode UpdateActionBar dans une autre classe comme celle-ci:

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;
    }
    ...
}


4 commentaires

Ouais, mais je dois appeler UpdateActionBar dans une classe différente. Pas dans ActionBar_Setup.cs, ou je ne comprends pas ce que vous voulez dire !?


vous pouvez appeler comme ceci ActionBar_Setup.Instance.UpdateActionBar (3); dans une classe différente, pas dans ActionBar_Setup.cs.


vous pouvez l'essayer et laissez-moi savoir si vous avez des questions


Je l'ai ajouté à mon code, mais lorsque j'appelle la méthode, btnBack et btnNext sont toujours null ?!