Фрагмент не может найти переменную из другого Фрагмента - PullRequest
0 голосов
/ 10 июня 2019

У меня проблема. У меня есть 2 Android.Support.V4.App.Fragments

В первом Framgent я использую этот код:

AgentSpinnerAdapter = new ArrayAdapter<string>(Context, Android.Resource.Layout.SimpleSpinnerDropDownItem);
AgentSpinner.Adapter = AgentSpinnerAdapter;

foreach (string[] str in NamesArray)
{
    string AgentId = str[0];
    string Owner = str[1];
    string Exchange = str[2];
    string Remark = str[3];

    AgentSpinnerAdapter.Add("Agent " + AgentId + " - " + Owner + " - " + Remark);
}

Во втором фрагменте я называю эту строку:

dbValue = Fragment1.AgentSpinnerAdapter.GetItem(0);

Но это говорит о том, что AgentSpinnerAdapter - пустая ссылка, что странно, потому что она заполнена. Я установил для AgentSpinnerAdapter значение Public static. Также в своей MainActivity я сначала создаю Fragment1, а затем Fragment2 следующим образом:

Fragment1 = Fragment1.NewInstance();            
Fragment2 = Fragment2.NewInstance();

Что я делаю не так?

UPDATE

Вот полный метод Fragment1.cs

public void LoadAgentSpinner()
{
    string json = "";

    try
    {
        string html = string.Empty;
        string url = "https://www.efy.nl/app/getagents.php";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        IgnoreBadCertificates();
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        using (Stream stream = response.GetResponseStream())
        using (StreamReader reader = new StreamReader(stream))
        {
            json = reader.ReadToEnd();
        }
    }
    catch (Exception ex1)
    {
        try
        {
            WebClient client = new WebClient();
            NameValueCollection fields = new NameValueCollection();
            fields.Add("error", ex1.GetBaseException().ToString());
            string url = "https://www.mywebsite.com";
            IgnoreBadCertificates();
            byte[] respBytes = client.UploadValues(url, fields);
            string resp = client.Encoding.GetString(respBytes);

            SelectedQuantity.Text = "";
            SelectedLimit.Text = "";
        }
        catch (Exception ex2)
        {
            string exFullName = (ex2.GetType().FullName);
            string ExceptionString = (ex2.GetBaseException().ToString());
        }
    }

    //Parse json content
    var jObject = JObject.Parse(json);

    //Create Array from everything inside Node:"Coins"
    var agentPropery = jObject["Agents"] as JArray;

    //Create List to save Coin Data
    agentList = new List<agent>();

    //Find every value in Array: coinPropery
    foreach (var property in agentPropery)
    {
        //Convert every value in Array to string
        var propertyList = JsonConvert.DeserializeObject<List<agent>>(property.ToString());

        //Add all strings to List
        agentList.AddRange(propertyList);
    }

    //Get all the values from Name, and convert it to an Array
    string[][] NamesArray = agentList.OrderBy(i => i.AgentId)
        .Select(i => new string[] { i.AgentId.ToString(), i.Owner, i.Exchange, i.Remark })
        .Distinct()
        .ToArray();


    AgentSpinnerAdapter = new ArrayAdapter<string>(Context, Android.Resource.Layout.SimpleSpinnerDropDownItem);
    AgentSpinner.Adapter = AgentSpinnerAdapter;

    foreach (string[] str in NamesArray)
    {
        string AgentId = str[0];
        string Owner = str[1];
        string Exchange = str[2];
        string Remark = str[3];

        AgentSpinnerAdapter.Add("Agent " + AgentId + " - " + Owner + " - " + Remark);  // format your string here
    }

    if(MainActivity.db.CheckExistTableSettings("Default Agent") == true)
    {
        string Value = MainActivity.db.SelectValueFromTableSettings("Default Agent");
        int spinnerPosition = AgentSpinnerAdapter.GetPosition(Value);
        AgentSpinner.SetSelection(spinnerPosition);
    }
    else
    {
        AgentSpinner.SetSelection(0);
    }            
}

1 Ответ

1 голос
/ 10 июня 2019

В некоторых моих приложениях необходимо получить доступ к другим фрагментам из моей основной Деятельности, поэтому мы делаем следующее:

public class MainActivity : AppCompatActivity, BottomNavigationView.IOnNavigationItemSelectedListener 
{
    public static Dictionary<string, Fragment> FragmentList { get; set; }
    private Fragment currentFragment = null;
    private BottomNavigationView navigation;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.layout_mainactivity);

        // create our fragments and initialise them early.
        if (FragmentList == null)
        {
            FragmentList = new Dictionary<string, Fragment>
            {
                { "main", MainFragment.NewInstance() },
                { "bugreport", BugReportFragment.NewInstance() },
                { "settings", SettingsFragment.NewInstance() }
            };
        }

        navigation = FindViewById<BottomNavigationView>(Resource.Id.bottom_nav);
        navigation.SetOnNavigationItemSelectedListener(this);
        navigation.SelectedItemId = Resource.Id.navigation_main;
    }

     public bool OnNavigationItemSelected(IMenuItem item)
    {
        if (!popAction)
        {
            navigationResourceStack.Push(item.ItemId);
        }

        switch (item.ItemId)
        {
            case Resource.Id.navigation_main:
                currentFragment = FragmentList["main"];
                break;
            case Resource.Id.navigation_settings:
                currentFragment = FragmentList["settings"];
                break;
            case Resource.Id.navigation_bugreport:
                currentFragment = FragmentList["bugreport"];
                break;
        }

        if (currentFragment == null)
        {
            return false;
        }
        else
        {
            FragmentManager.BeginTransaction().Replace(Resource.Id.frame_content, currentFragment).Commit();
            return true;
        }
    }   
}

Это означает, что вы можете сделать что-то вроде MainActivity.FragmentList ["main "], а затем вызовите любой открытый метод для фактического инициализированного класса, поскольку указатель на него хранится в словаре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...