如何解决提取功能将启动新的Activity,并用于许多不同的Activity
几天前我开始学习Xamarin,现在我面临重构问题。
当前,我有多个屏幕布局,底部导航栏用于TAB在屏幕之间切换。每个活动的布局都在底部添加 BottomNavigationBarView ,每个活动的 .cs 都通过以下方式在其OnCreate方法中初始化 NavigationItemSelected :
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;
}
};
我想将这段代码提取到外部函数中,仅使用Resource.Id ...参数从每个活动中调用它。
我该怎么做?
解决方法
您可以创建一个继承自Android活动类的“ BaseActivity”,您的所有活动均继承自该类。然后,您可以在基本活动中放置一个方法以执行所需的操作。如果您将“活动”设置为从该活动继承,则可以轻松调用它。
您的基本活动如下所示:
[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)建议的继承。我反而会考虑改用合成。这样,您就不会偶然结束创建基类的“上帝”对象的情况,该对象从任何地方开始继承。
请制定策略:
library(data.table)
setDT(a1)[,.(var = if(all(is.na(var))) "None" else unique(var[!is.na(var)])),id]
然后您可以在代码中使用它,例如:
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;
}
}
}
通过这种方式,您可以轻松地在类之间共享代码,而无需继承并且将自己限制为对所有内容使用基类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。