簡體   English   中英

提取正在啟動新活動並用於許多不同活動的函數

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM