C# 无法访问外部类型的非静态成员。。。通过嵌套类型
为什么会出现这个错误 错误CS0038:无法访问外部类型的非静态成员C# 无法访问外部类型的非静态成员。。。通过嵌套类型,c#,xamarin,xamarin.android,C#,Xamarin,Xamarin.android,为什么会出现这个错误 错误CS0038:无法访问外部类型的非静态成员 JsonFeedParserTabs.MainActivity'通过嵌套类型 JsonFeedParserTabs.MainActivity.SampleTabFragment'(CS0038) (JsonFeedParserTabs) 我试图将包含json数据的ListView放在选项卡中 这是我的代码: using System; using Android.App; using Android.Content; usin
JsonFeedParserTabs.MainActivity'通过嵌套类型
JsonFeedParserTabs.MainActivity.SampleTabFragment'(CS0038)
(JsonFeedParserTabs)
我试图将包含json数据的ListView放在选项卡中
这是我的代码:
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Threading.Tasks;
using System.Net.Http;
using Newtonsoft.Json;
using System.Linq;
namespace JsonFeedParserTabs
{
[Activity (Label = "Feed Reader", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
ListView listView;
// ProgressBar progressBar;
RootObject result;
string url = "http://javatechig.com/api/get_category_posts/?dev=1&slug=android";
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource.
SetContentView (Resource.Layout.Main);
this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;
AddTab (" Tab 1", new SampleTabFragment ());
// AddTab (" Tab 2", new SampleTabFragment2 ());
if (bundle != null)
this.ActionBar.SelectTab(this.ActionBar.GetTabAt(bundle.GetInt("tab")));
}
protected override void OnSaveInstanceState(Bundle outState)
{
outState.PutInt("tab", this.ActionBar.SelectedNavigationIndex);
base.OnSaveInstanceState(outState);
}
void AddTab (string tabText, Fragment view)
{
var tab = this.ActionBar.NewTab ();
tab.SetText (tabText);
// Must set event handler before adding tab.
tab.TabSelected += delegate(object sender, ActionBar.TabEventArgs e) {
var fragment = this.FragmentManager.FindFragmentById(Resource.Id.fragmentContainer);
if (fragment != null)
e.FragmentTransaction.Remove(fragment);
e.FragmentTransaction.Add (Resource.Id.fragmentContainer, view);
};
tab.TabUnselected += delegate(object sender, ActionBar.TabEventArgs e) {
e.FragmentTransaction.Remove(view);
};
this.ActionBar.AddTab (tab);
}
class SampleTabFragment : Fragment
{
public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
base.OnCreateView (inflater, container, savedInstanceState);
var view = inflater.Inflate (Resource.Layout.Tab, container, false);
// Initializing listView.
listView = view.FindViewById<ListView> (Resource.Id.listView); // <-- Error!
listView.ItemClick += OnListItemClick; // <-- Error!
// progressBar = view.FindViewById<ProgressBar> (Resource.Id.progressBar);
//
// // Showing loading progressBar.
// progressBar.Visibility = ViewStates.Visible;
// Download and display data in url.
downloadJsonFeedAsync (url); // <-- Error!
return view;
}
}
// class SampleTabFragment2 : Fragment
// {
// public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
// {
// base.OnCreateView(inflater, container, savedInstanceState);
//
// var view = inflater.Inflate(Resource.Layout.Tab, container, false);
// var sampleTextView = view.FindViewById<TextView>(Resource.Id.sampleTextView);
//
// sampleTextView.Text = "Sample fragment text 2.";
//
// return view;
// }
// }
public async void downloadJsonFeedAsync(String url)
{
var httpClient = new HttpClient();
Task<string> contentsTask = httpClient.GetStringAsync(url);
// Await! control returns to the caller and the task continues to run on another thread.
string content = await contentsTask;
Console.Out.WriteLine("Response Body: \r\n {0}", content);
// Convert string to JSON object.
result = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject> (content);
// Update listview.
RunOnUiThread (() => {
listView.Adapter = new CustomListAdapter(this, result.posts);
// progressBar.Visibility = ViewStates.Gone;
});
}
void OnListItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
Post item = result.posts.ElementAt (e.Position);
// Passing object form one activity to other.
Intent i = new Intent(Application.Context, typeof(FeedDetailsActivity));
i.PutExtra("item", JsonConvert.SerializeObject(item));
StartActivity(i);
}
}
}
使用系统;
使用Android.App;
使用Android.Content;
使用Android.Runtime;
使用Android.Views;
使用Android.Widget;
使用Android.OS;
使用System.Threading.Tasks;
使用System.Net.Http;
使用Newtonsoft.Json;
使用System.Linq;
命名空间JsonFeedParserTables
{
[活动(Label=“提要阅读器”,MainLauncher=true,Icon=“@drawable/Icon”)]
公共课活动:活动
{
列表视图列表视图;
//ProgressBar ProgressBar;
根对象结果;
字符串url=”http://javatechig.com/api/get_category_posts/?dev=1&slug=android";
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
//从“主”布局资源设置视图。
SetContentView(Resource.Layout.Main);
this.ActionBar.NavigationMode=ActionBarNavigationMode.Tabs;
AddTab(“tab1”,新的SampleTabFragment());
//AddTab(“Tab 2”,新样本tabfragment2());
if(bundle!=null)
this.ActionBar.SelectTab(this.ActionBar.gettab(bundle.GetInt(“tab”));
}
受保护的覆盖无效OnSaveInstanceState(包超出状态)
{
outState.PutInt(“tab”,this.ActionBar.SelectedNavigationIndex);
base.OnSaveInstanceState(超出状态);
}
void AddTab(字符串选项卡文本,片段视图)
{
var tab=this.ActionBar.NewTab();
tab.SetText(tabText);
//必须在添加选项卡之前设置事件处理程序。
tab.TabSelected+=委托(对象发送者,ActionBar.TabEventArgs e){
var fragment=this.FragmentManager.FindFragmentById(Resource.Id.fragmentContainer);
if(片段!=null)
e、 碎片事务。删除(碎片);
e、 FragmentTransaction.Add(Resource.Id.fragmentContainer,视图);
};
tab.TabUnselected+=委托(对象发送者,ActionBar.TabEventArgs e){
e、 碎片事务。删除(视图);
};
this.ActionBar.AddTab(tab);
}
类SampleTabFragment:Fragment
{
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态)
{
base.OnCreateView(充气机、容器、保存状态);
var视图=充气机。充气(Resource.Layout.Tab,container,false);
//正在初始化listView。
listView=view.FindViewById(Resource.Id.listView);//它准确地告诉您它不能做什么。无法从MainActivity
类型中声明的片段类型访问MainActivity
成员。因此,当您尝试调用downloadJsonFeedAsync(url);
时,它会失败,因为它不是静态(类)方法。片段(尽管在类型中声明)不存在于MainActivity
类型的实例中
除非有令人信服的理由让它们保留在MainActivity类型中,否则我会将它们移出。它们还应该有一个对MainActivity类型的引用,这样您就可以对其调用downloadJsonFeedAsync(string)
另一方面(我很欣赏这是一篇非常不请自来的评论:)你可能想考虑使用一个MVVM模式。看起来你正在混合演示、应用程序控制和业务数据。如果这个应用程序超过一两页,你会发现隔离职责有很大的和平。它会非常有帮助。你告诉我们到底是哪一行造成了错误。ment
class?我想这实际上是一个循环引用。listView是MainActivity中的一个私有字段;SampleTabFragment(一个单独的嵌套类)无法访问it@Jason这是带有“错误!”注释的三行文字。好的,谢谢你的帮助和提示。今天有机会我会调查的。:)
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Threading.Tasks;
using System.Net.Http;
using Newtonsoft.Json;
using System.Linq;
namespace JsonFeedParserTabs
{
[Activity (Label = "Feed Reader", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
ListView listView;
// ProgressBar progressBar;
RootObject result;
string url = "http://javatechig.com/api/get_category_posts/?dev=1&slug=android";
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource.
SetContentView (Resource.Layout.Main);
this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;
AddTab (" Tab 1", new SampleTabFragment (this));
// AddTab (" Tab 2", new SampleTabFragment2 ());
if (bundle != null)
this.ActionBar.SelectTab(this.ActionBar.GetTabAt(bundle.GetInt("tab")));
}
protected override void OnSaveInstanceState(Bundle outState)
{
outState.PutInt("tab", this.ActionBar.SelectedNavigationIndex);
base.OnSaveInstanceState(outState);
}
void AddTab (string tabText, Fragment view)
{
var tab = this.ActionBar.NewTab ();
tab.SetText (tabText);
// Must set event handler before adding tab.
tab.TabSelected += delegate(object sender, ActionBar.TabEventArgs e) {
var fragment = this.FragmentManager.FindFragmentById(Resource.Id.fragmentContainer);
if (fragment != null)
e.FragmentTransaction.Remove(fragment);
e.FragmentTransaction.Add (Resource.Id.fragmentContainer, view);
};
tab.TabUnselected += delegate(object sender, ActionBar.TabEventArgs e) {
e.FragmentTransaction.Remove(view);
};
this.ActionBar.AddTab (tab);
}
class SampleTabFragment : Fragment
{
private MainActivity context;
public SampleTabFragment(MainActivity _context) : base()
{
this.context = _context;
}
public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
base.OnCreateView (inflater, container, savedInstanceState);
var view = inflater.Inflate (Resource.Layout.Tab, container, false);
// Initializing listView.
context.listView = view.FindViewById<ListView> (Resource.Id.listView);
context.listView.ItemClick += context.OnListItemClick;
// progressBar = view.FindViewById<ProgressBar> (Resource.Id.progressBar);
//
// // Showing loading progressBar.
// progressBar.Visibility = ViewStates.Visible;
// Download and display data in url.
context.downloadJsonFeedAsync (context.url);
return view;
}
}
// class SampleTabFragment2 : Fragment
// {
// public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
// {
// base.OnCreateView(inflater, container, savedInstanceState);
//
// var view = inflater.Inflate(Resource.Layout.Tab, container, false);
// var sampleTextView = view.FindViewById<TextView>(Resource.Id.sampleTextView);
//
// sampleTextView.Text = "Sample fragment text 2.";
//
// return view;
// }
// }
public async void downloadJsonFeedAsync(String url)
{
var httpClient = new HttpClient();
Task<string> contentsTask = httpClient.GetStringAsync(url);
// Await! control returns to the caller and the task continues to run on another thread.
string content = await contentsTask;
Console.Out.WriteLine("Response Body: \r\n {0}", content);
// Convert string to JSON object.
result = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject> (content);
// Update listview.
RunOnUiThread (() => {
listView.Adapter = new CustomListAdapter(this, result.posts);
// progressBar.Visibility = ViewStates.Gone;
});
}
void OnListItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
Post item = result.posts.ElementAt (e.Position);
// Passing object form one activity to other.
Intent i = new Intent(Application.Context, typeof(FeedDetailsActivity));
i.PutExtra("item", JsonConvert.SerializeObject(item));
StartActivity(i);
}
}
}