2016-12-02 2 views
0

Ich möchte die Schriftart der TextView auf eine Schriftart im Ordner Assets festlegen. Der Problemcode ist "var font = Typeface.CreateFromAsset (Assets," Enter-The-Grid.ttf ");" nicht die erste Verwendung, sondern die zweite gegen Ende meines Codes (die rote Linie erscheint unter "Vermögenswerte").Warum kann ich nicht auf diese Weise auf den Assets-Ordner meines Xamarin.Android-Projekts zugreifen?

namespace UndergroundSports.Android 
{ 
[Activity] 
public class CityPage : Activity 
{ 
    Sport[] sports = Sport.Sports; 

    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
     this.SetContentView(Resource.Layout.CityPage); 

     var font = Typeface.CreateFromAsset(Assets, "Enter-The-Grid.ttf"); 

     Button bttJoin = FindViewById<Button>(Resource.Id.bttJoin); 
     bttJoin.Click += (sender, e) => 
     { 
      gotoJoinPage(); 
     }; 

     bttJoin.Typeface = font; 

     ListView lstSports = FindViewById<ListView>(Resource.Id.lstSport); 
     lstSports.Adapter = new SportsAdapter(this, sports); 

     lstSports.ItemClick += (object sender, AdapterView.ItemClickEventArgs e) => 
     { 
      Sport selectedFromList = sports[e.Position]; 
      Global.Instance.CurrentSport = selectedFromList; 
      gotoMembersPage(); 
     }; 
    } 

    private void gotoJoinPage() 
    { 
     var intent = new Intent(this, typeof(JoinPage)); 
     StartActivity(intent); 
    } 

    private void gotoMembersPage() 
    { 
     var intent = new Intent(this, typeof(MembersPage)); 
     StartActivity(intent); 
    } 

    public class SportsAdapter : BaseAdapter<Sport> 
    { 
     Sport[] items; 
     Activity context; 
     public SportsAdapter(Activity context, Sport[] items) : base() 
     { 
      this.context = context; 
      this.items = items; 
     } 
     public override long GetItemId(int position) 
     { 
      return position; 
     } 
     public override Sport this[int position] 
     { 
      get { return items[position]; } 
     } 
     public override int Count 
     { 
      get { return items.Length; } 
     } 
     public override View GetView(int position, View convertView, ViewGroup parent) 
     { 
      View view = convertView; 
      if (view == null) 
       view = context.LayoutInflater.Inflate(global::Android.Resource.Layout.SimpleListItem1, null); 
      TextView txtView = view.FindViewById<TextView>(global::Android.Resource.Id.Text1); 
      var font = Typeface.CreateFromAsset(Assets, "Enter-The-Grid.ttf"); 
      txtView.Text = items[position].Name; 
      txtView.Gravity = GravityFlags.Center; 
      txtView.Typeface = font; 
      return view; 
     } 
    } 
} 

}

Aber als ich versuchte, eine Variable mit der Schriftart ich einen Fehler bekam zu erstellen mir zu sagen:

kann kein nicht-statisches Mitglied des äußeren Typs Zugriff Android.Content.Context' via nested type UndergroundSports.Android.CityPage.SportsAdapter '(CS0038) (UndergroundSportsAndroid) "

Aus verwandten Fragen zu betrachten Ich denke, ich muss entweder eine Instanz des Assets-Objekts erstellen oder es statisch machen.

Ich bin ziemlich neu in C# und verstehe nicht wirklich was los ist. Ich würde es begrüßen, wenn jemand erklären könnte, warum ich in diesem Teil meines Codes nicht auf Assets zugreifen kann. Der Teil, der mich am meisten verwirrt, ist, dass ich die exakt gleiche Codezeile verwende, um früher in derselben Datei auf die Schriftart zuzugreifen, ohne diesen Fehler zu bekommen.

+1

SportsAdapter ist eine in Ihre CityPage-Aktivität eingebettete Klasse. SportsAdapter weiß nicht, was Kontext ist. CityPage tut es. Der einfachste Weg, um dies zu beheben, wäre, Context als Parameter oder Eigenschaft zu übergeben, wenn Sie die Instanz von SportsAdapter erstellen. – Jason

Antwort

1
var font = Typeface.CreateFromAsset(context.Assets, "Enter-The-Grid.ttf"); 

Gehen Sie Ihre Aktivität der Instanz zu Ihrem Adapter über Konstruktor, und verwenden Sie es assests zugreifen

public class SportsAdapter : BaseAdapter<Sport> 
{ 
    Sport[] items; 
    Activity context; 
    public SportsAdapter(Activity context, Sport[] items) : base() 
    { 
     this.context = context; 
     this.items = items; 
    } 

    .... 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     View view = convertView; 
     if (view == null) 
      view = context.LayoutInflater.Inflate(global::Android.Resource.Layout.SimpleListItem1, null); 
     TextView txtView = view.FindViewById<TextView>(global::Android.Resource.Id.Text1); 
     var font = Typeface.CreateFromAsset(context.Assets, "Enter-The-Grid.ttf"); 
     txtView.Text = items[position].Name; 
     txtView.Gravity = GravityFlags.Center; 
     txtView.Typeface = font; 
     return view; 
    } 
} 

Also, stellen Sie sicher, dass Ihre Build-Aktion der .ttf-Datei AndroidAssests gesetzt. Richten Sie die .tff-Datei ein> Build Action> AndroidAsset

+0

Ich habe den Code in Ihrer Antwort mit meinem aktuellen Code verglichen und es ist genau das gleiche. Solltest du die von dir empfohlenen Änderungen einbeziehen? Das wäre hilfreich, wenn Sie es getan hätten. –

+0

var font = Typeface.CreateFromAsset (context.Assets, "Enter-The-Grid.ttf"); Siehe diese Zeile. Es ist Kontext – HeisenBerg

Verwandte Themen