繁体   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