我有一个 CollectionView,它有一个类似于下面的 ItemTemplate:
<CollectionView>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0"
Text="{Binding Name}" />
<Label Grid.Column="1"
Text="{Binding Cost}" />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
在 iOS 上,一切似乎都很好,而在 Android 上,特别是我的三星物理设备,每当我点击项目范围内的任何地方时,都会播放默认的“点击”声音。
我可以通过向 ItemTemplate 添加一个空的 TapGestureRecognizer 来禁用声音,如下所示:
<Grid>
<Grid.GestureRecognizers>
<TapGestureRecognizer />
</Grid.GestureRecognizers>
</Grid>
这消除了声音,但看起来像是一个 hack,我真的不想在将来的某个时候回来咬我,所以我更喜欢一个实际的解决方案。
所以,这个问题并不是全面的,似乎只影响某些设备(在我的例子中,三星)。我找到的最佳解决方案是为禁用音效的应用程序创建新样式并将其应用于 MainActivity。为此,我在
Platforms/Android/Resources/values/
下创建了一个新的 styles.xml 文件,其中包含以下内容:
<resources>
<style name="AppTheme" parent="Maui.SplashTheme">
<!-- Tells the Android OS not to play OS-specific SFX -->
<item name="android:soundEffectsEnabled">false</item>
</style>
</resources>
由于 Maui 已经定义了一种令人沮丧的对用户隐藏的样式(见此处),我继续使用
parent
标签从中派生出我的样式。
在那之后,应用样式唯一要做的就是打开 MainActivity.cs 并像这样更新文件顶部附近的 Activity 属性,使用我的样式而不是 Maui 样式:
[Activity(Theme = "@style/AppTheme", ...)]
public class MainActivity : MauiAppCompatActivity
{
// Other app initialization stuff
}
这解决了我看到的问题。我会注意到,如果您愿意,您可以通过将 Application 属性 应用于 MainApplication.cs 文件来覆盖整个应用程序的样式而不是单个 Activity 的样式,但这只有在您的应用程序有多个需要不同样式的 Activity 时才是真正必要的.