2012-03-28 1 views
1

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

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

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

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

Я могу предоставить больше основного кода и кода 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); 
       }; 

      }; 

ответ

0

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

Что происходит внутри 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 для замены всего
  • например. или вы можете использовать несколько видов деятельности (или вкладки) вместо одной деятельности

Надежда, что помогает

+0

Большое спасибо Стюарту. Я сделал ваши предложенные изменения и осуществил несколько пробных испытаний и был доволен их успехом. Весь мой GUI теперь завершен с точки зрения получения общей структуры. – Zach