[英]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.