Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Creación y vinculación de programas de Android Spinners en MvvmCross

Estoy construyendo una aplicación multiplataforma que requiere dinámicamente generar y enlazar controles de Spinner. Yo era capaz de hacer eso en iOS y plataformas Windows, pero tienen problemas con Android. Si lo entiendo correctamente, tengo que pasar algunos argumentos al constructor de MvxSpinner – context y attrs, pero no soy capaz de averiguar cómo puedo hacer eso y lo que debería pasar allí. Además, no sé cómo entonces enlazar el ItemsSource y SelectedItem. Supongo que un nuevo conjunto de vinculación tiene que ser creado (de forma similar a la versión de iOS), pero no soy capaz de averiguarlo en Android. ¿Puedes darme algunas direcciones?

Aquí está mi código fuente de la versión de Windows:

  • Android MapView se superpone a DrawerLayout
  • Crear tema personalizado descargable y aplicarlo durante el tiempo de ejecución
  • ¿Por qué se eliminó el soporte de los Trabajadores Web HTML5 del navegador de Android en las versiones 2.2 y superiores?
  • TabStripEnabled para TabWidget en la API más antigua
  • Cómo cambiar el idioma Google Map V2 android
  • FindViewByID devuelve null
  • private void InputColourAtlasChangedMessageHandler( InputColourAtlasChangedMessage message ) { ColourAtlas selected = message.SelectedColourAtlas; var vm = ViewModel as ColorMatchViewModel; List<ComboBox> newComboboxes = new List<ComboBox>(); var currentCount = ColourPickersContainer.Children.Count; for ( int i = currentCount; i < message.ColourCodePartCount; i++ ) { ComboBox cb = new ComboBox { Margin = new Thickness( 0, 0, 10, 0 ), PlaceholderText = "choose" }; Binding itemsSourceBinding = new Binding(); itemsSourceBinding.Path = new PropertyPath( "ColourPartLists[" + i + "]" ); Binding selectedItemBinding = new Binding(); selectedItemBinding.Path = new PropertyPath( "SelectedColourCodeParts[" + i + "]" ); selectedItemBinding.Mode = BindingMode.TwoWay; cb.Tag = i; ColourPickersContainer.Children.Add( cb ); cb.SetBinding( ComboBox.ItemsSourceProperty, itemsSourceBinding ); cb.SetBinding( ComboBox.SelectedItemProperty, selectedItemBinding ); cb.SelectionChanged += cb_SelectionChanged; BindingOperations.SetBinding( cb, ComboBox.SelectedItemProperty, selectedItemBinding ); newComboboxes.Add( cb ); } while ( ColourPickersContainer.Children.Count > message.ColourCodePartCount ) { ColourPickersContainer.Children.RemoveAt( ColourPickersContainer.Children.Count - 1 ); } _comboboxes = newComboboxes; } void cb_SelectionChanged( object sender, SelectionChangedEventArgs e ) { var cb = sender as ComboBox; int changedIndex = ( int )cb.Tag; if ( e.AddedItems.Count > 0 ) { ( DataContext as ColorMatchViewModel ).ColourCodePartChangedCommand.Execute( changedIndex ); } } 

    Y aquí está la versión de iOS (haciendo más o menos lo mismo – aunque acaba de eliminar los hiladores existentes en lugar de reutilizarlos):

     private void InputColourAtlasChangedMessageHandler( InputColourAtlasChangedMessage message ) { ColourAtlas selected = message.SelectedColourAtlas; ClearPickers(); var currentSet = this.CreateBindingSet<ColorMatchView, ColorMatchViewModel>(); for ( int i = 0; i < message.ColourCodePartCount; i++ ) { var j = i; UIPickerView picker = new UIPickerView(); var pickerViewModel = new MvxPickerViewModel( picker ); picker.Model = pickerViewModel; picker.ShowSelectionIndicator = true; pickerViewModel.SelectedItemChanged += vm_SelectedItemChanged; var textView = new PaddedUITextField( new RectangleF( 10, 50 + i * 40, 300, 30 ) ); Add( textView ); textView.InputView = picker; _pickers.Add( picker ); _textViews.Add( textView ); currentSet.Bind( textView ).For( t => t.Text ).To( "SelectedColourCodeParts[" + i + "]" ); currentSet.Bind( pickerViewModel ).For( p => p.ItemsSource ).To( "ColourPartLists[" + i + "]" ); currentSet.Bind( pickerViewModel ).For( p => p.SelectedItem ).To( "SelectedColourCodeParts[" + i + "]" ); currentSet.Bind( pickerViewModel ).For( p => p.SelectedChangedCommand ).To( vm => vm.ColourCodePartChangedCommand ).CommandParameter( j ); } currentSet.Apply(); UpdateLayout( View.Frame.Size ); } private void ClearPickers() { foreach ( var picker in _pickers ) { var vm = picker.Model as MvxPickerViewModel; vm.SelectedItemChanged -= vm_SelectedItemChanged; picker.RemoveFromSuperview(); } foreach ( var textView in _textViews ) { textView.RemoveFromSuperview(); } _pickers.Clear(); _textViews.Clear(); } 

    Esquema parcial (y no funcional) para la versión de Android que tengo ahora es la siguiente:

     private void InputColourAtlasChangedMessageHandler( InputColourAtlasChangedMessage message ) { ColourAtlas selected = message.SelectedColourAtlas; var layout = FindViewById<LinearLayout>( Resource.Id.spinnerList ); ClearPickers(); for ( int i = 0; i < message.ColourCodePartCount; i++ ) { MvxSpinner spinner = new MvxSpinner( Context??, Attrs??); MvxAdapter adapter = new MvxAdapter( this ); spinner.ItemSelected += spinner_ItemSelected; layout.AddView( spinner ); _spinners.Add( spinner ); } } void spinner_ItemSelected( object sender, AdapterView.ItemSelectedEventArgs e ) { var changedIndex = _spinners.IndexOf( sender as MvxSpinner ); ( DataContext as ColorMatchViewModel ).ColourCodePartChangedCommand.Execute( changedIndex ); } private void ClearPickers() { var layout = FindViewById<LinearLayout>( Resource.Id.spinnerList ); foreach ( var spinner in _spinners ) { spinner.ItemSelected -= spinner_ItemSelected; } layout.RemoveAllViews(); _spinners.Clear(); } 

  • Android, Detectar cuándo se lanzan otras aplicaciones
  • La conversión al formato de Dalvik falló con error 1 ¿Solución?
  • No se reciben los caracteres unicode GCM de Android
  • Pasar a los oyentes a través de Bundle en AlertDialogFragment - ¿es posible?
  • Picasso no puede cargar imagen dentro del método onSuccess de StorageReference
  • No se puede generar APK firmado en Android Studio, porque proguard-rules.txt está ausente
  • One Solution collect form web for “Creación y vinculación de programas de Android Spinners en MvvmCross”

    He aquí un ejemplo de cómo crear un mvxspinner por código en Activity.OnCreate:

     _bindingContext = new MvxAndroidBindingContext(this, new LayoutInflaterProvider(LayoutInflater), _viewModel); var view = (LinearLayout)_bindingContext.BindingInflate(Resource.Layout.Main, null); SetContentView(view); var spinner = new MvxSpinner(this, null, new MvxAdapter(this, _bindingContext)); view.AddView(spinner); 

    Entonces si usted quisiera que su LayoutInflaterProvider pudiera parecer algo similar:

     public class LayoutInflaterProvider : IMvxLayoutInflater { public LayoutInflaterProvider(LayoutInflater layoutInflater) { LayoutInflater = layoutInflater; } public LayoutInflater LayoutInflater { get; private set; } } 

    Inicialmente estaba estudiando este tutorial .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.