C# Extract函数,用于启动新活动并用于许多不同的活动
几天前我开始学习Xamarin,现在我面临一个重构问题 目前,我有多个屏幕布局和底部导航栏,用于选项卡在屏幕之间切换。每个活动的布局都在底部添加BottomNavigationBarView,每个活动的.cs在其OnCreate方法中初始化NavigationItemSelected,方法如下:C# Extract函数,用于启动新活动并用于许多不同的活动,c#,android,xamarin,C#,Android,Xamarin,几天前我开始学习Xamarin,现在我面临一个重构问题 目前,我有多个屏幕布局和底部导航栏,用于选项卡在屏幕之间切换。每个活动的布局都在底部添加BottomNavigationBarView,每个活动的.cs在其OnCreate方法中初始化NavigationItemSelected,方法如下: var bottomNavigationBar = FindViewById<BottomNavigationView>(Resource.Id.bottomNavigationBar);
var bottomNavigationBar = FindViewById<BottomNavigationView>(Resource.Id.bottomNavigationBar);
bottomNavigationBar.SelectedItemId = Resource.Id.navigationBarMain; //This id is different for every activity
bottomNavigationBar.NavigationItemSelected += (sender, e) =>
{
switch (e.Item.ItemId)
{
case Resource.Id.navigationBarMain:
StartActivity(typeof(MainActivity));
break;
case Resource.Id.navigationBarHistory:
StartActivity(typeof(HistoryActivity));
break;
case Resource.Id.navigationBarSettings:
StartActivity(typeof(SettingsActivity));
break;
}
};
var bottomNavigationBar=findviewbyd(Resource.Id.bottomNavigationBar);
bottomNavigationBar.SelectedItemId=Resource.Id.navigationBarMain//每个活动的id都不同
bottomNavigationBar.NavigationItemSelected+=(发件人,e)=>
{
开关(例如Item.ItemId)
{
案例资源.Id.navigationBarMain:
启动性(类型(主要活动));
打破
案例资源.Id.navigationBarHistory:
StartActivity(类型(历史活动));
打破
案例资源.Id.navigationBarSettings:
起始触感(类型(设置触感));
打破
}
};
我想将这段代码提取到外部函数中,并仅使用Resource.Id从每个活动调用它。。。参数
我该怎么做呢?您可以创建一个“BaseActivity”,它继承自Android activity类,并且您的所有活动都继承自。然后,您可以在基本活动中放置一个方法来执行您想要的操作。如果将活动设置为从此活动继承,则可以轻松调用它
您的基本活动如下所示:
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar")]
public class BaseActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
protected virtual void SetBottomNavigationBar(int id)
{
var bottomNavigationBar = FindViewById<BottomNavigationView>(id);
bottomNavigationBar.SelectedItemId = Resource.Id.navigationBarMain; //This id is different for every activity
bottomNavigationBar.NavigationItemSelected += (sender, e) =>
{
switch (e.Item.ItemId)
{
case Resource.Id.navigationBarMain:
StartActivity(typeof(MainActivity));
break;
case Resource.Id.navigationBarHistory:
StartActivity(typeof(HistoryActivity));
break;
case Resource.Id.navigationBarSettings:
StartActivity(typeof(SettingsActivity));
break;
}
};
}
}
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
public class MainActivity :BaseActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
//other code
SetBottomNavigationBar(Resource.Id.bottomNavigationBar);
}
}而不是大卫·克里斯托弗·雷诺兹(David Christopher Reynolds)在这里提出的继承。相反,我会考虑使用作文。这样,您就不会意外地创建一个基类的“上帝”对象,而这个基类是您开始从任何地方继承的 相反,制定一个战略:
public interface INavigationStrategy
{
void Navigate(int selectedItem);
}
public class BottomBarNavigationStrategy : INavigationStrategy
{
private Context _context;
public BottomBarNavigationStrategy(Context context)
{
_context = context;
}
public void Navigate(int selectedItem)
{
switch(selectedItem)
{
case Resource.Id.navigationBarMain:
_context.StartActivity(typeof(MainActivity));
break;
case Resource.Id.navigationBarHistory:
_context.StartActivity(typeof(HistoryActivity));
break;
case Resource.Id.navigationBarSettings:
_context.StartActivity(typeof(SettingsActivity));
break;
}
}
}
然后您可以在代码中使用它,如:
var navigationStrategy = new BottomBarNavicationStrategy(this);
bottomNavigationBar.NavigationItemSelected += OnItemSelected;
void OnItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
{
navigationStrategy.Navigate(this, e.Item.ItemId);
}
通过这种方式,您可以轻松地跨类共享代码,而无需继承,也无需将自己局限于使用基类来完成所有工作。“最好的方法是什么?”这是一个基于观点的答案。一个人可能会给你他们对最佳方式的意见,而另一个人可能会给你另一种意见。你想过什么是“最好的”方法吗?谢谢你的帮助!这对我很管用。我是C语言中的新手,目前我有C++的经验,我不知道这样可以把上下文传递给另一个类:谢谢帮助。