Кнопка изменения экрана в Android Mono с использованием делегатов - PullRequest
1 голос
/ 29 марта 2012

Следующий код взят из части C # моего приложения Android Mono.В конечном итоге это будет GUI для симулятора мультиметра, но сейчас он просто отображает текст.Это довольно просто:

-Нажмите одну из кнопок, чтобы перейти к этому метру (вольтметр, амперметр, омметр) -Нажмите кнопку «повторное сканирование» и TextView скажет вам, сколько раз вы нажали, чтокнопка.-Нажмите одну из других кнопок измерителя или кнопку домой, чтобы переключить представления

Это работает безупречно.К сожалению, как только я переключаю взгляды, кнопки перестают работать.Ниже приведен код кнопки «Ом» и кнопки «Усилитель».Кнопка «Ом» является «полной» кнопкой, которая отображает все остальные экраны.В целях тестирования я собирался на экран усилителя, но когда я туда захожу, кнопка повторного сканирования ничего не делает.Ни одна из кнопок ничего не делает.

Я достаточно уверен, что проблема заключается в том, что я использую команды делегат , но ни одно из моих исследований не привело меня к каким-либопуть к решению.

Я могу предоставить больше основного кода и кода XML, если это необходимо.

ampButton.Click += delegate
            {
                SetContentView(Resource.Layout.AmpScreen);
                Button ampButtonData = FindViewById<Button>(Resource.Id.CurrentButtonamp);
                TextView ampData = FindViewById<TextView>(Resource.Id.ampdata);
                ampButtonData.Click += delegate
                {
                    ampData.Text = string.Format("{0} clicks!", count2++);
                };
                Button amp2volt = FindViewById<Button>(Resource.Id.Amp2VoltButton);
                Button amp2ohm = FindViewById<Button>(Resource.Id.Amp2OhmButton);
                Button amp2home = FindViewById<Button>(Resource.Id.Amp2HomeButton);
            };


            ohmButton.Click += delegate
            {
                SetContentView(Resource.Layout.OhmScreen);
                Button ohmButtonData = FindViewById<Button>(Resource.Id.CurrentButtonohm);
                TextView ohmData = FindViewById<TextView>(Resource.Id.ohmdata);
                ohmButtonData.Click += delegate
                {
                    ohmData.Text = string.Format("{0} clicks!", count3++);
                };

                Button ohm2amp = FindViewById<Button>(Resource.Id.Ohm2AmpButton);
                Button ohm2volt = FindViewById<Button>(Resource.Id.Ohm2VoltButton);
                Button ohm2home = FindViewById<Button>(Resource.Id.Ohm2HomeButton);

                ohm2amp.Click += delegate
                {
                    SetContentView(Resource.Layout.AmpScreen);
                };

                ohm2volt.Click += delegate
                {
                    SetContentView(Resource.Layout.VoltScreen);
                };

                ohm2home.Click += delegate
                {
                    SetContentView(Resource.Layout.Main);
                };

            };

1 Ответ

0 голосов
/ 29 марта 2012

Я думаю, что ваша проблема в том, что вы каждый раз заменяете весь вид, поэтому экземпляры кнопок меняются.

Что происходит внутри SetContentView, так это то, что InflatorService получает запрос на создание нового набора объектов пользовательского интерфейсана основе переданного в XML существующего пользовательского интерфейса стирается, а затем эти новые объекты пользовательского интерфейса помещаются на их место.

Неважно, если новые объекты пользовательского интерфейса имеют те же идентификаторы ресурсов, что и старые объекты, - они все еще являются отдельными экземплярами.

Если вы хотите продолжить использовать свой текущий подход,затем вам нужно переписать все ваши события после каждого SetContentView - например,

        ohm2amp.Click += delegate
            {
                SetContentView(Resource.Layout.AmpScreen);
                RewireEvents();
            };

с

       private void RewireEvents()
       {
           var ohm2home = FindViewById<Button>(Resource.Id.ohm2home);
           ohm2home.Click += { /* todo */ };
           // etc
       }

или, возможно, рассмотреть другой пользовательский интерфейс:

  • напримервы могли бы изменить видимость на разных дочерних макетах вместо вызова SetContentView для замены всего
  • например, или вы могли бы использовать несколько действий (или вкладок) вместо одного действия

Надеюсь, что это поможет

...