[英]Extract function which is starting new Activity and is used in many different activities
几天前我开始学习 Xamarin,现在我面临重构问题。
目前我有多个屏幕布局,底部导航栏用于选项卡在屏幕之间切换。 每个 Activity 的布局都在底部添加BottomNavigationBarView ,并且每个 Activity 的.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);
}
}
而不是大卫克里斯托弗雷诺兹在这里建议的继承。 相反,我会考虑使用组合来代替。 这样你就不会意外地创建一个你开始从任何地方继承的基类的“上帝”对象。
相反,制定一个策略:
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);
}
通过这种方式,您可以轻松地跨类共享代码,而无需继承并限制自己对所有内容使用基类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.