Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Extract函数,用于启动新活动并用于许多不同的活动_C#_Android_Xamarin - Fatal编程技术网

C# Extract函数,用于启动新活动并用于许多不同的活动

C# Extract函数,用于启动新活动并用于许多不同的活动,c#,android,xamarin,C#,Android,Xamarin,几天前我开始学习Xamarin,现在我面临一个重构问题 目前,我有多个屏幕布局和底部导航栏,用于选项卡在屏幕之间切换。每个活动的布局都在底部添加BottomNavigationBarView,每个活动的.cs在其OnCreate方法中初始化NavigationItemSelected,方法如下: var bottomNavigationBar = FindViewById<BottomNavigationView>(Resource.Id.bottomNavigationBar);

几天前我开始学习Xamarin,现在我面临一个重构问题

目前,我有多个屏幕布局和底部导航栏,用于选项卡在屏幕之间切换。每个活动的布局都在底部添加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;
    }
};
var bottomNavigationBar=findviewbyd(Resource.Id.bottomNavigationBar);
bottomNavigationBar.SelectedItemId=Resource.Id.navigationBarMain//每个活动的id都不同
bottomNavigationBar.NavigationItemSelected+=(发件人,e)=>
{
开关(例如Item.ItemId)
{
案例资源.Id.navigationBarMain:
启动性(类型(主要活动));
打破
案例资源.Id.navigationBarHistory:
StartActivity(类型(历史活动));
打破
案例资源.Id.navigationBarSettings:
起始触感(类型(设置触感));
打破
}
};
我想将这段代码提取到外部函数中,并仅使用Resource.Id从每个活动调用它。。。参数

我该怎么做呢?

您可以创建一个“BaseActivity”,它继承自Android activity类,并且您的所有活动都继承自。然后,您可以在基本活动中放置一个方法来执行您想要的操作。如果将活动设置为从此活动继承,则可以轻松调用它

您的基本活动如下所示:

 [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)在这里提出的继承。相反,我会考虑使用作文。这样,您就不会意外地创建一个基类的“上帝”对象,而这个基类是您开始从任何地方继承的

相反,制定一个战略:

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);
}

通过这种方式,您可以轻松地跨类共享代码,而无需继承,也无需将自己局限于使用基类来完成所有工作。

“最好的方法是什么?”这是一个基于观点的答案。一个人可能会给你他们对最佳方式的意见,而另一个人可能会给你另一种意见。你想过什么是“最好的”方法吗?谢谢你的帮助!这对我很管用。我是C语言中的新手,目前我有C++的经验,我不知道这样可以把上下文传递给另一个类:谢谢帮助。