试图在Xamarin.Forms上更改android主题变得疯狂

时间:2018-12-10 19:59:09

标签: android xamarin xamarin.forms

请有人可以帮助我。

我已经尝试了四天,以使突出显示的列表视图项目的默认橙色变为其他任何颜色。

我试图将项目的主题设置为Holo,虽然也很轻巧,但是无论我做什么都无法正确实现。

我试图像这样在MainActivity中设置它

 [Activity(Label = "Proj", Icon = "@drawable/icon", Theme = "@style/Theme.Holo.Light.DarkActionBar", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]

我试图像这样在AndroidManifest文件中设置它:

<application android:label="com.proj.app" android:theme="@style/Theme.Holo.Light.DarkActionBar"></application>

我尝试弄乱这些版本并将它们设置为最高版本(9&8.1),并尝试将minsdk和targetdks设置为最新版本。

什么都没用。请有人帮我。

我也尝试实现自定义渲染器,但也无法正确实现。

我要做的就是使下面的列表视图中突出显示的行不是橙色。

 <ListView ItemsSource="{Binding Items}" x:Name="StudentsView" HasUnevenRows="True" SeparatorVisibility="Default">
                    <ListView.Header>
                        <StackLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" >
                            <Image Source="studentsicon.png" Margin="6,10,6,10" ></Image>
                            <Frame BackgroundColor="#222222">
                                <Label Text="Select a student" FontSize="16" TextColor="White"></Label>
                            </Frame>
                            <ActivityIndicator x:Name="actStudents" IsVisible="False" IsRunning="False" Color="#DF304F" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" />
                        </StackLayout>

                    </ListView.Header>
                    <ListView.ItemTemplate>
                        <DataTemplate>
                                <ViewCell>
                                <StackLayout Orientation="Vertical" HorizontalOptions="FillAndExpand">
                                    <Frame BackgroundColor="#222222" CornerRadius="0" Margin="10,10,10,0">
                                        <Frame.GestureRecognizers>
                                        </Frame.GestureRecognizers>
                                        <Grid>
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="*"></RowDefinition>
                                            </Grid.RowDefinitions>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="90"></ColumnDefinition>
                                                <ColumnDefinition Width="*"></ColumnDefinition>
                                            </Grid.ColumnDefinitions>
                                            <StackLayout Grid.Column="0" Grid.Row="0" Orientation="Vertical" VerticalOptions="Fill" HorizontalOptions="FillAndExpand">
                                                <Image Source="{Binding Photo}" Aspect="AspectFit" VerticalOptions="FillAndExpand"></Image>
                                            </StackLayout>
                                            <StackLayout Grid.Column="1" Grid.Row="0" Orientation="Vertical" VerticalOptions="Fill" MinimumHeightRequest="400" HorizontalOptions="FillAndExpand">
                                                <Label Text="{Binding FName}" FontSize="20" HorizontalTextAlignment="Center" TextColor="White"></Label>

                                            </StackLayout>
                                        </Grid>
                                    </Frame>
                                </StackLayout>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

3 个答案:

答案 0 :(得分:0)

创建扩展视单元格,如下所示:

public class ExtendedViewCell : ViewCell
{
    public static readonly BindableProperty SelectedBackgroundColorProperty =
        BindableProperty.Create("SelectedBackgroundColor", 
                            typeof(Color), 
                            typeof(ExtendedViewCell), 
                            Color.Default);

    public Color SelectedBackgroundColor
    {
      get { return (Color)GetValue(SelectedBackgroundColorProperty); }
      set { SetValue(SelectedBackgroundColorProperty, value); }
    }
}

Android自定义渲染器 渲染单元格时,该单元格捕获Android视图单元格的当前(未选择的默认主题)颜色,然后每当Android视图单元格的IsSelected属性从false更改为true时,设置视图单元格背景的颜色。 。然后,当它向后翻转时,将其重置为原始捕获的颜色。

很显然,如果您需要在列表中选择多个项目,这可能会变得稍微复杂一些,但这已经是我寻找解决方案所需要的。

assembly: ExportRenderer(typeof(ExtendedViewCell), typeof(ExtendedViewCellRenderer))]
namespace 
xamformsdemo.Droid.CustomRenderers
 {
   public class ExtendedViewCellRenderer : ViewCellRenderer
  {

private Android.Views.View _cellCore;
private Drawable _unselectedBackground;
private bool _selected;

protected override Android.Views.View GetCellCore(Cell item, 
                                                  Android.Views.View convertView, 
                                                  ViewGroup parent, 
                                                  Context context)
 {
   _cellCore = base.GetCellCore(item, convertView, parent, context);

  _selected = false;
  _unselectedBackground = _cellCore.Background;

  return _cellCore;
}

protected override void OnCellPropertyChanged(object sender, PropertyChangedEventArgs args)
{
  base.OnCellPropertyChanged(sender, args);

  if (args.PropertyName == "IsSelected")
  {
    _selected = !_selected;

    if (_selected)
    {
      var extendedViewCell = sender as ExtendedViewCell;
      _cellCore.SetBackgroundColor(extendedViewCell.SelectedBackgroundColor.ToAndroid());
    }
    else
    {
      _cellCore.SetBackground(_unselectedBackground);
    }
   }
  }
 }
 }

答案 1 :(得分:0)

为视图单元创建Android渲染器,并重写GetCellCore方法。下面的示例代码:

<mat-grid-list cols="4" rowHeight="100px">
  <mat-grid-tile id="left-sidebar">
    <!-- Left Sidebar-->

  </mat-grid-tile>
  <mat-grid-tile id="main-content" colspan="2">
    <!-- Main Content -->
    <app-post></app-post>
    <router-outlet></router-outlet>
  </mat-grid-tile>
  <mat-grid-tile id="right-sidebar">
    <!-- Right Sidebar-->

  </mat-grid-tile>
</mat-grid-list>

答案 2 :(得分:0)

我无需在应用中自定义渲染器即可完成此操作,方法如下:

我的 style.xml 文件(将其放入Resources / values文件夹中,并使用AndroidResource构建操作):

<?xml version="1.0" encoding="utf-8" ?>
<resources>
  <color name="FancyCyanColorOfMine">#00ffff</color>
  <style name="Theme.Main" parent="@android:style/Theme.Holo.Light">
    <item name="android:colorActivatedHighlight">@color/FancyCyanColorOfMine</item>
  </style>
</resources>

然后我在MainActivity声明中使用这样的主题:

[Activity(Theme = "@style/Theme.Main", [OTHER STUFF OF YOURS])]
public sealed class MainActivity : Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
...
}

对于诸如“ colorActivatedHighlight”之类的有色事物,还有许多其他标签,您可以在以下Android文档中进行跟踪:https://developer.android.com/reference/android/R.attr,也许只是搜索单词“ color”