[Android] Implemented material3 support for RadioButton #33468
[Android] Implemented material3 support for RadioButton #33468jfversluis merged 10 commits intodotnet:inflight/currentfrom
Conversation
|
Hey there @@SyedAbdulAzeemSF4852! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed. |
There was a problem hiding this comment.
Pull request overview
This PR implements Material Design 3 support for RadioButton on Android, making the radio button UI consistent with Material3 guidelines when the runtime feature is enabled. The implementation conditionally registers the appropriate handler based on the RuntimeFeature.IsMaterial3Enabled flag.
Changes:
- Added
MaterialRadioButtonHandlerclass that createsMaterialRadioButtonplatform views with proper Material3 theming - Implemented conditional handler registration in
AppHostBuilderExtensions.csto use Material3 handler when feature is enabled - Removed unconditional RadioButton handler registration to prevent duplicate assignments
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| src/Core/src/Handlers/RadioButton/RadioButtonHandler.Android.cs | Added MaterialRadioButtonHandler class that extends RadioButtonHandler and creates MaterialRadioButton with Material3 theming |
| src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs | Added conditional handler registration for Android using RuntimeFeature.IsMaterial3Enabled flag; removed duplicate unconditional registration |
🤖 AI Summary📊 Expand Full Review🔍 Pre-Flight — Context & Validation📝 Review Session — Refactored handler into a separate file ·
|
| File | Change | Purpose |
|---|---|---|
src/Controls/src/Core/Hosting/AppHostBuilderExtensions.cs |
+12/-1 | Conditional handler registration based on Material3 feature flag |
src/Core/src/Handlers/RadioButton/RadioButtonHandler2.Android.cs |
+15/0 (new) | New Material3 RadioButton handler |
Key Technical Notes
RadioButtonHandler2extendsRadioButtonHandlerand overridesCreatePlatformView()to returnMaterialRadioButton- Uses
MauiMaterialContextThemeWrapper.Create(Context)— same pattern asCheckBoxExtensions.cs SoundEffectsEnabled = falsefor consistency (same as other Material3 handlers)- TODO comment:
// TODO: Material3 - make it public in .net 11(class is internal) - New file
RadioButtonHandler2.Android.csis missing a newline at end of file - The PR moves the unconditional
RadioButtonHandlerregistration from line ~120 into the Android#ifblock
PR Discussion
- Only 1 comment from dotnet-policy-service[bot] (automated PR acknowledgement)
- No reviewer feedback yet
- No prior agent reviews
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #33468 | Add RadioButtonHandler2 (Android) overriding CreatePlatformView with MaterialRadioButton; conditionally register in AppHostBuilderExtensions |
⏳ PENDING (Gate) | AppHostBuilderExtensions.cs, RadioButtonHandler2.Android.cs |
Original PR |
🚦 Gate — Test Verification
📝 Review Session — Refactored handler into a separate file · 99cb1d0
Result: ❌ FAILED - No tests exist
Platform: android
Mode: N/A - Tests missing
Findings
- No test files found matching
Issue33467orIssue33468inTestCases.HostApporTestCases.Shared.Tests - The PR introduces a new enhancement (Material3 RadioButton support) with no accompanying tests
- Gate cannot run without tests to verify
Action Required
Tests are missing. The PR author or contributor should use write-tests-agent to create UI tests that verify:
- When Material3 is enabled,
RadioButtonusesMaterialRadioButtonas the platform view (Android) - Visual appearance matches Material3 styling
🔧 Fix — Analysis & Comparison
📝 Review Session — Refactored handler into a separate file · 99cb1d0
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #33468 | Add RadioButtonHandler2 (Android) with MaterialRadioButton; conditionally register based on IsMaterial3Enabled |
⏳ PENDING (no tests) | AppHostBuilderExtensions.cs, RadioButtonHandler2.Android.cs |
Original PR |
Exhausted: N/A — Gate did not pass (no tests exist)
Selected Fix: N/A — Cannot validate without tests
Phase Skipped: Phase 3 (try-fix) skipped because Gate did not pass
📋 Report — Final Recommendation
📝 Review Session — Refactored handler into a separate file · 99cb1d0
⚠️ Final Recommendation: REQUEST CHANGES
Summary
PR #33468 adds Material3 support for RadioButton on Android by introducing a new RadioButtonHandler2 that creates a MaterialRadioButton via MauiMaterialContextThemeWrapper. The approach is architecturally sound and follows existing patterns. However, the PR is missing UI tests, and Gate could not be verified.
Root Cause (Issue #33467)
When UseMaterial3 is enabled, the RadioButton used AppCompatRadioButton instead of the Material3-styled MaterialRadioButton. The fix conditionally registers a new handler (RadioButtonHandler2) that overrides CreatePlatformView() to return a MaterialRadioButton.
Gate Status
❌ FAILED — No UI tests found for Issue #33467 or #33468. The verify-tests-fail-without-fix skill could not run. Phase 3 (try-fix) was skipped as a result.
Code Review Findings
✅ Strengths:
- Handler pattern mirrors how
MauiMaterialContextThemeWrapperis used inCheckBoxHandler.Android.cs - Correct use of
#if ANDROIDguard to ensure non-Android platforms still use the default handler - Removes the duplicate (unconditional)
RadioButtonHandlerregistration correctly SoundEffectsEnabled = falseis consistent with other Material3 handlersinternalvisibility with a TODO for future public API is appropriate for an incremental approach
-
No tests — This is the primary blocker. There are no UI tests verifying that:
- When Material3 is enabled,
RadioButtonusesMaterialRadioButtonas the platform view - The visual appearance matches Material3 styling
- Existing RadioButton functionality is preserved (checked/unchecked states, events)
- When Material3 is enabled,
-
Missing newline at end of file —
RadioButtonHandler2.Android.csis missing a trailing newline (indicated by\ No newline at end of filein the diff). -
Inconsistency with CheckBox —
CheckBoxHandler.Android.csusesMaterialCheckBoxunconditionally (no Material3 flag check). The RadioButton uses a conditional approach. This inconsistency should be documented or reconciled — either CheckBox should also be conditional, or RadioButton should follow CheckBox's unconditional approach.
Fix Quality
The implementation is minimal and correct. The handler2 pattern is consistent with CollectionViewHandler2/CarouselViewHandler2 naming. The conditional registration in AppHostBuilderExtensions.cs is clean. The main gaps are tests and the EOF newline.
Action Required
- Add UI tests (use
write-tests-agent) verifying Material3 RadioButton behavior on Android - Add trailing newline to
RadioButtonHandler2.Android.cs - Clarify or reconcile the Material3 conditional logic vs. CheckBox's unconditional
MaterialCheckBoxusage
📋 Expand PR Finalization Review
Title: ✅ Good
Current: [Android] Implemented material3 support for RadioButton
Description: ✅ Good
Description needs updates. See details below.
✨ Suggested PR Description
[!NOTE]
Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!
Description of Change
Adds Material Design 3 support for RadioButton on Android by introducing a new RadioButtonHandler2 handler (internal, to be made public in .NET 11) that creates a MaterialRadioButton platform view using MauiMaterialContextThemeWrapper.
Android Material Design 3 support:
- Conditional handler registration in
AppHostBuilderExtensions.cs: whenRuntimeFeature.IsMaterial3Enabledistrue,RadioButtonHandler2is registered forRadioButton; otherwise the existingRadioButtonHandleris used. - The unconditional registration of
RadioButtonHandler(previously at the bottom of the handler list) is removed to avoid duplicate registration. - Non-Android platforms continue to use
RadioButtonHandlerunconditionally.
New RadioButtonHandler2 (RadioButtonHandler2.Android.cs):
- Inherits from
RadioButtonHandler, overriding onlyCreatePlatformView(). - Returns a
MaterialRadioButton(fromGoogle.Android.Material.RadioButton) constructed withMauiMaterialContextThemeWrapper.Create(Context)for correct Material3 theming. - Sets
SoundEffectsEnabled = false, consistent with the base handler. - Marked
internalwith a// TODO: Material3 - make it public in .net 11note.
This pattern mirrors the existing CheckBoxHandler approach, which always uses MaterialCheckBox via MauiMaterialContextThemeWrapper.
Material Design 3 spec: RadioButton
Output
| Material2 | Material3 |
|---|---|
![]() |
![]() |
Issues Fixed
Fixes #33467
Code Review: ⚠️ Issues Found
Code Review — PR #33468
🔴 Critical Issues
Missing newline at end of file
- File:
src/Core/src/Handlers/RadioButton/RadioButtonHandler2.Android.cs - Problem: File ends without a trailing newline (
\No newline at end of filein diff). This violates standard C# file conventions and can cause issues with some tooling. - Recommendation: Add a newline after the closing
}.
🟡 Suggestions
Class naming is a placeholder
- File:
src/Core/src/Handlers/RadioButton/RadioButtonHandler2.Android.cs - Note: The class is named
RadioButtonHandler2and isinternalwith a TODO to make it public in .NET 11. This is intentional and acceptable for now, but reviewers should be aware the name is temporary. The TODO comment makes this clear.
GetPlatformRadioButton cast compatibility
- File:
src/Core/src/Handlers/RadioButton/RadioButtonHandler.Android.cs - Note: The base
RadioButtonHandleruseshandler.PlatformView as AppCompatRadioButtoninGetPlatformRadioButton(). SinceMaterialRadioButtonextendsAppCompatRadioButton, this cast works correctly whenRadioButtonHandler2is used. No change needed, but reviewers should be aware of the implicit dependency on the inheritance chain.
No unit/device tests added
- No tests were included for the new
RadioButtonHandler2. Given this is a new handler path that activates under a runtime feature flag, a device test verifying theMaterialRadioButtonplatform view is created whenIsMaterial3Enabledwould be valuable. This is not a blocker but is a gap.
✅ Looks Good
MauiMaterialContextThemeWrapper.Create(Context)is the established pattern (used byMauiMaterialButton,CheckBoxHandler) — correctly adopted here.SoundEffectsEnabled = falseis consistent with the baseRadioButtonHandlerand other Material3 handlers.- The
#if ANDROIDguard inAppHostBuilderExtensions.cscorrectly scopes the conditional registration to Android only. - Non-Android platforms receive the standard
RadioButtonHandlerwith no behavior change. - The overall approach (subclassing handler, overriding
CreatePlatformView) is the same pattern used forCheckBoxHandler'sMaterialCheckBox— good consistency. - Removing the unconditional
RadioButtonHandlerregistration from the bottom of the list prevents duplicate registration on Android.
99cb1d0 to
36cb336
Compare
|
Added UI tests and addressed all valid concerns. |
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
### Description of Change This pull request introduces support for Material Design 3 radio buttons on Android, making the radio button UI consistent with the latest Material guidelines when the Material3 feature is enabled. The changes ensure that the appropriate handler is used depending on the runtime feature flag. **Android Material Design 3 support:** * Conditional registration of radio button handlers in `AppHostBuilderExtensions.cs`, using `MaterialRadioButtonHandler` when Material3 is enabled, and falling back to the default `RadioButtonHandler` otherwise. * Removal of the unconditional registration of the default `RadioButtonHandler` to prevent duplicate handler assignments. **Handler implementation:** * Addition of the new `MaterialRadioButtonHandler` class in `RadioButtonHandler.Android.cs`, which creates a `MaterialRadioButton` platform view with the correct theme wrapper and disables sound effects for consistency. Material Design Spec : [RadioButton](https://m3.material.io/components/radio-button/specs) ### Issues Fixed Fixes #33467 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/a8235fae-c86f-4637-ad9b-e3a802d2ddd1"> | <img src="https://github.com/user-attachments/assets/2b9352f5-bd27-423f-a320-40d0eefceb0d"> | --------- Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
### Description of Change This pull request introduces support for Material Design 3 radio buttons on Android, making the radio button UI consistent with the latest Material guidelines when the Material3 feature is enabled. The changes ensure that the appropriate handler is used depending on the runtime feature flag. **Android Material Design 3 support:** * Conditional registration of radio button handlers in `AppHostBuilderExtensions.cs`, using `MaterialRadioButtonHandler` when Material3 is enabled, and falling back to the default `RadioButtonHandler` otherwise. * Removal of the unconditional registration of the default `RadioButtonHandler` to prevent duplicate handler assignments. **Handler implementation:** * Addition of the new `MaterialRadioButtonHandler` class in `RadioButtonHandler.Android.cs`, which creates a `MaterialRadioButton` platform view with the correct theme wrapper and disables sound effects for consistency. Material Design Spec : [RadioButton](https://m3.material.io/components/radio-button/specs) ### Issues Fixed Fixes #33467 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/a8235fae-c86f-4637-ad9b-e3a802d2ddd1"> | <img src="https://github.com/user-attachments/assets/2b9352f5-bd27-423f-a320-40d0eefceb0d"> | --------- Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
### Description of Change This pull request introduces support for Material Design 3 radio buttons on Android, making the radio button UI consistent with the latest Material guidelines when the Material3 feature is enabled. The changes ensure that the appropriate handler is used depending on the runtime feature flag. **Android Material Design 3 support:** * Conditional registration of radio button handlers in `AppHostBuilderExtensions.cs`, using `MaterialRadioButtonHandler` when Material3 is enabled, and falling back to the default `RadioButtonHandler` otherwise. * Removal of the unconditional registration of the default `RadioButtonHandler` to prevent duplicate handler assignments. **Handler implementation:** * Addition of the new `MaterialRadioButtonHandler` class in `RadioButtonHandler.Android.cs`, which creates a `MaterialRadioButton` platform view with the correct theme wrapper and disables sound effects for consistency. Material Design Spec : [RadioButton](https://m3.material.io/components/radio-button/specs) ### Issues Fixed Fixes #33467 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/a8235fae-c86f-4637-ad9b-e3a802d2ddd1"> | <img src="https://github.com/user-attachments/assets/2b9352f5-bd27-423f-a320-40d0eefceb0d"> | --------- Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
### Description of Change This pull request introduces support for Material Design 3 radio buttons on Android, making the radio button UI consistent with the latest Material guidelines when the Material3 feature is enabled. The changes ensure that the appropriate handler is used depending on the runtime feature flag. **Android Material Design 3 support:** * Conditional registration of radio button handlers in `AppHostBuilderExtensions.cs`, using `MaterialRadioButtonHandler` when Material3 is enabled, and falling back to the default `RadioButtonHandler` otherwise. * Removal of the unconditional registration of the default `RadioButtonHandler` to prevent duplicate handler assignments. **Handler implementation:** * Addition of the new `MaterialRadioButtonHandler` class in `RadioButtonHandler.Android.cs`, which creates a `MaterialRadioButton` platform view with the correct theme wrapper and disables sound effects for consistency. Material Design Spec : [RadioButton](https://m3.material.io/components/radio-button/specs) ### Issues Fixed Fixes dotnet#33467 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/a8235fae-c86f-4637-ad9b-e3a802d2ddd1"> | <img src="https://github.com/user-attachments/assets/2b9352f5-bd27-423f-a320-40d0eefceb0d"> | --------- Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
### Description of Change This pull request introduces support for Material Design 3 radio buttons on Android, making the radio button UI consistent with the latest Material guidelines when the Material3 feature is enabled. The changes ensure that the appropriate handler is used depending on the runtime feature flag. **Android Material Design 3 support:** * Conditional registration of radio button handlers in `AppHostBuilderExtensions.cs`, using `MaterialRadioButtonHandler` when Material3 is enabled, and falling back to the default `RadioButtonHandler` otherwise. * Removal of the unconditional registration of the default `RadioButtonHandler` to prevent duplicate handler assignments. **Handler implementation:** * Addition of the new `MaterialRadioButtonHandler` class in `RadioButtonHandler.Android.cs`, which creates a `MaterialRadioButton` platform view with the correct theme wrapper and disables sound effects for consistency. Material Design Spec : [RadioButton](https://m3.material.io/components/radio-button/specs) ### Issues Fixed Fixes #33467 ### Output | Material2 | Material3 | |----------|----------| | <img src="https://github.com/user-attachments/assets/a8235fae-c86f-4637-ad9b-e3a802d2ddd1"> | <img src="https://github.com/user-attachments/assets/2b9352f5-bd27-423f-a320-40d0eefceb0d"> | --------- Co-authored-by: Gerald Versluis <gerald.versluis@microsoft.com>
## What's Coming .NET MAUI inflight/candidate introduces significant improvements across all platforms with focus on quality, performance, and developer experience. This release includes 46 commits with various improvements, bug fixes, and enhancements. ## Button - [Android] Implemented material3 support for Button by @Dhivya-SF4094 in #33173 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for Button](#33172) </details> ## CollectionView - [Android] Fix RemainingItemsThresholdReachedCommand not firing when CollectionView has Header and Footer both defined by @SuthiYuvaraj in #29618 <details> <summary>🔧 Fixes</summary> - [Android : RemainingItemsThresholdReachedCommand not firing when CollectionVew has Header and Footer both defined](#29588) </details> - [iOS/MacCatalyst] Fix CollectionView ScrollTo for horizontal layouts by @Shalini-Ashokan in #33853 <details> <summary>🔧 Fixes</summary> - [[iOS/MacCatalyst] CollectionView ScrollTo does not work with horizontal Layout](#33852) </details> - [iOS & Mac] Fixed IndicatorView Size doesnt update dynamically by @SubhikshaSf4851 in #31129 <details> <summary>🔧 Fixes</summary> - [[iOS, Catalyst] IndicatorView.IndicatorSize does not update dynamically at runtime](#31064) </details> - [Android] Fix for CollectionView Scrolled event is triggered on the initial app load. by @BagavathiPerumal in #33558 <details> <summary>🔧 Fixes</summary> - [[Android] CollectionView Scrolled event is triggered on the initial app load.](#33333) </details> - [iOS, Android] Fix for CollectionView IsEnabled=false allows touch interactions by @praveenkumarkarunanithi in #31403 <details> <summary>🔧 Fixes</summary> - [More issues with CollectionView IsEnabled, InputTransparent, Opacity via Styles and code behind](#19771) </details> - [iOS] Fix VerticalOffset Update When Modifying CollectionView.ItemsSource While Scrolled by @devanathan-vaithiyanathan in #34153 <details> <summary>🔧 Fixes</summary> - [[iOS]VerticalOffset Not Reset to Zero After Clearing ItemSource in CollectionView](#26798) </details> ## DateTimePicker - [Android] Fix DatePicker MinimumDate/MaximumDate not updating dynamically by @HarishwaranVijayakumar in #33687 <details> <summary>🔧 Fixes</summary> - [[regression/8.0.3] [Android] DatePicker control minimum date issue](#19256) - [[Android] DatePicker does not update MinimumDate / MaximumDate in the Popup when set in the viewmodel after first opening](#33583) </details> ## Drawing - Android drawable perf by @albyrock87 in #31567 ## Editor - [Android] Implemented material3 support for Editor by @SyedAbdulAzeemSF4852 in #33478 <details> <summary>🔧 Fixes</summary> - [Implement Material3 Support for Editor](#33476) </details> ## Entry - [iOS, Mac] Fix for CursorPosition not updating when typing into Entry control by @SyedAbdulAzeemSF4852 in #30505 <details> <summary>🔧 Fixes</summary> - [Entry control CursorPosition does not update on TextChanged event [iOS Maui 8.0.7] ](#20911) - [CursorPosition not calculated correctly on behaviors events for iOS devices](#32483) </details> ## Flyoutpage - [Android, Windows] Fix for FlyoutPage toolbar button not updating on orientation change by @praveenkumarkarunanithi in #31962 <details> <summary>🔧 Fixes</summary> - [Flyout page in Android does not show flyout button (burger) consistently](#24468) </details> - Fix for First Item in CollectionView Overlaps in FlyoutPage.Flyout on iOS by @praveenkumarkarunanithi in #29265 <details> <summary>🔧 Fixes</summary> - [[iOS] CollectionView not rendering first item correctly in FlyoutPage.Flyout](#29170) </details> ## Image - [Android] Fix excessive memory usage for stream and resource-based image loading by @Shalini-Ashokan in #33590 <details> <summary>🔧 Fixes</summary> - [[Android] Unexpected high Bitmap.ByteCount when loading image via ImageSource.FromResource() or ImageSource.FromStream() in .NET MAUI](#33239) </details> - [Android] Fix for Resize method returns an image that has already been disposed by @SyedAbdulAzeemSF4852 in #29964 <details> <summary>🔧 Fixes</summary> - [In GraphicsView, the Resize method returns an image that has already been disposed](#29961) - [IIMage.Resize bugged behaviour](#31103) </details> ## Label - Fixed Label Span font property inheritance when applied via Style by @SubhikshaSf4851 in #34110 <details> <summary>🔧 Fixes</summary> - [`Span` does not inherit text styling from `Label` if that styling is applied using `Style` ](#21326) </details> - [Android] Implemented material3 support for Label by @SyedAbdulAzeemSF4852 in #33599 <details> <summary>🔧 Fixes</summary> - [Implement Material3 Support for Label](#33598) </details> ## Map - [Android] Fix Circle Stroke color is incorrectly updated as Fill color. by @NirmalKumarYuvaraj in #33643 <details> <summary>🔧 Fixes</summary> - [[Android] Circle Stroke color is incorrectly updated as Fill color.](#33642) </details> ## Mediapicker - [iOS] Fix: invoke MediaPicker completion handler after DismissViewController by @yuriikyry4enko in #34250 <details> <summary>🔧 Fixes</summary> - [[iOS] Media Picker UIImagePickerController closing issue](#21996) </details> ## Navigation - Fix ContentPage memory leak on Android when using NavigationPage modally (fixes #33918) by @brunck in #34117 <details> <summary>🔧 Fixes</summary> - [[Android] Modal TabbedPage whose tabs are NavigationPage(ContentPage) is retained after PopModalAsync()](#33918) </details> ## Picker - [Android] Implement material3 support for TimePicker by @HarishwaranVijayakumar in #33646 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for TimePicker](#33645) </details> - [Android] Implemented Material3 support for Picker by @SyedAbdulAzeemSF4852 in #33668 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for Picker](#33665) </details> ## RadioButton - [Android] Implemented material3 support for RadioButton by @SyedAbdulAzeemSF4852 in #33468 <details> <summary>🔧 Fixes</summary> - [Implement Material3 Support for RadioButton](#33467) </details> ## Setup - Clarify MA003 error message by @jeremy-visionaid in #34067 <details> <summary>🔧 Fixes</summary> - [MA003 false positive with 9.0.21](#26599) </details> ## Shell - [Android] Fix TabBar FlowDirection not updating dynamically by @SubhikshaSf4851 in #33091 <details> <summary>🔧 Fixes</summary> - [[Android, iOS] FlowDirection RTL is not updated dynamically on Shell TabBar](#32993) </details> - [Android] Fix page not disposed on Shell replace navigation by @Vignesh-SF3580 in #33426 <details> <summary>🔧 Fixes</summary> - [[Android] [Shell] replace navigation leaks current page](#25134) </details> - [Android] Fixed Shell flyout does not disable scrolling when FlyoutVerticalScrollMode is set to Disabled by @NanthiniMahalingam in #32734 <details> <summary>🔧 Fixes</summary> - [[Android] Shell.FlyoutVerticalScrollMode="Disabled" does not disable scrolling](#32477) </details> ## Single Project - Fix: Throw a clear error when an SVG lacks dimensions instead of a NullReferenceException by @Shalini-Ashokan in #33194 <details> <summary>🔧 Fixes</summary> - [MAUI Fails To Convert Valid SVG Files Into PNG Files (Object reference not set to an instance of an object)](#32460) </details> ## SwipeView - [iOS] Fix SwipeView stays open on iOS after updating content by @devanathan-vaithiyanathan in #31248 <details> <summary>🔧 Fixes</summary> - [[iOS] - Swipeview with collectionview issue](#19541) </details> ## TabbedPage - [Windows] Fixed IsEnabled Property not works on Tabs by @NirmalKumarYuvaraj in #26728 <details> <summary>🔧 Fixes</summary> - [ShellContent IsEnabledProperty does not work](#5161) - [[Windows] Shell Tab IsEnabled Not Working](#32996) </details> - [Android] Fix NavigationBar overlapping StatusBar when NavigationBar visibility changes by @Vignesh-SF3580 in #33359 <details> <summary>🔧 Fixes</summary> - [[Android] NavigationBar overlaps with StatusBar when mixing HasNavigationBar=true/false in TabbedPage on Android 15 (API 35)](#33340) </details> ## Templates - Fix for unable to open task using keyboard navigation on windows platform by @SuthiYuvaraj in #33647 <details> <summary>🔧 Fixes</summary> - [Unable to open task using keyboard: A11y_.NET maui_User can get all the insights of Dashboard_Keyboard](#30787) </details> ## TitleView - Fix for NavigationPage.TitleView does not expand with host window in iPadOS 26+ by @SuthiYuvaraj in #33088 ## Toolbar - [iOS] Fix toolbar items ignoring BarTextColor on iOS/MacCatalyst 26+ by @Shalini-Ashokan in #34036 <details> <summary>🔧 Fixes</summary> - [[iOS 26] ToolbarItem color with custom BarTextColor not working](#33970) </details> - [Android] Fix for ToolbarItem retaining the icon from the previous page on Android when using NavigationPage. by @BagavathiPerumal in #32311 <details> <summary>🔧 Fixes</summary> - [Toolbaritem keeps the icon of the previous page on Android, using NavigationPage (not shell)](#31727) </details> ## WebView - [Android] Fix WebView in a grid expands beyond it's cell by @devanathan-vaithiyanathan in #32145 <details> <summary>🔧 Fixes</summary> - [Android - WebView in a grid expands beyond it's cell](#32030) </details> ## Xaml - ContentPresenter: Propagate binding context to children with explicit TemplateBinding by @HarishwaranVijayakumar in #30880 <details> <summary>🔧 Fixes</summary> - [Binding context in ContentPresenter](#23797) </details> <details> <summary>🔧 Infrastructure (1)</summary> - [Revert] ContentPresenter: Propagate binding context to children with explicit TemplateBinding by @Ahamed-Ali in #34332 </details> <details> <summary>🧪 Testing (6)</summary> - [Testing] Feature Matrix UITest Cases for Shell Flyout Page by @NafeelaNazhir in #32525 - [Testing] Feature Matrix UITest Cases for Brushes by @LogishaSelvarajSF4525 in #31833 - [Testing] Feature Matrix UITest Cases for BindableLayout by @LogishaSelvarajSF4525 in #33108 - [Android] Add UI tests for Material 3 CheckBox by @HarishwaranVijayakumar in #34126 <details> <summary>🔧 Fixes</summary> - [[Android] Add UI tests for Material 3 CheckBox](#34125) </details> - [Testing] Feature Matrix UITest Cases for Shell Tabbed Page by @NafeelaNazhir in #33159 - [Testing] Fixed Test case failure in PR 34294 - [03/2/2026] Candidate - 1 by @TamilarasanSF4853 in #34334 </details> <details> <summary>📦 Other (2)</summary> - Bumps Syncfusion.Maui.Toolkit dependency to version 1.0.9 by @PaulAndersonS in #34178 - Fix crash when closing Windows based app when using TitleBar by @MFinkBK in #34032 <details> <summary>🔧 Fixes</summary> - [Unhandled exception "Value does not fall within the expected range" when closing Windows app](#32194) </details> </details> **Full Changelog**: main...inflight/candidate


Description of Change
This pull request introduces support for Material Design 3 radio buttons on Android, making the radio button UI consistent with the latest Material guidelines when the Material3 feature is enabled. The changes ensure that the appropriate handler is used depending on the runtime feature flag.
Android Material Design 3 support:
AppHostBuilderExtensions.cs, usingMaterialRadioButtonHandlerwhen Material3 is enabled, and falling back to the defaultRadioButtonHandlerotherwise.RadioButtonHandlerto prevent duplicate handler assignments.Handler implementation:
MaterialRadioButtonHandlerclass inRadioButtonHandler.Android.cs, which creates aMaterialRadioButtonplatform view with the correct theme wrapper and disables sound effects for consistency.Material Design Spec : RadioButton
Issues Fixed
Fixes #33467
Output