Xamarin 在同一解决方案中运行来自其他项目的活动

Posted

技术标签:

【中文标题】Xamarin 在同一解决方案中运行来自其他项目的活动【英文标题】:Xamarin run activity from other project in same solution 【发布时间】:2020-10-07 05:57:27 【问题描述】:

我有一个包含两个 android 项目的 xamarin 解决方案。我想在 project2 中的 project1 中运行 android 活动。我看过与这个主题相关的线程(比如How to call an activity in another project? Call activity from another project) 并尝试了许多建议的解决方案,但最后我总是得到“Android.Content.ActivityNotFoundException: 'Unable to find explicit activity class companyname.project2/companyname.project2.Droid.View.LoginView;您是否在 AndroidManifest.xml 中声明了此活动?'”错误。如果可以,这在 xamarin 中是否可行?难道我做错了什么?这是我的源代码:

项目1:

namespace BigAppManager 

    [Activity (MainLauncher = true, Name = "com.companyname.bigappmanager.MainActivity", Label = " Logowanie", ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize, NoHistory = true, LaunchMode = LaunchMode.SingleInstance)]
    public class MainActivity : MvxActivity<MainActivityViewModel> 

        protected override void OnCreate (Bundle savedInstanceState) 
            base.OnCreate (savedInstanceState);
            Xamarin.Essentials.Platform.Init (this, savedInstanceState);
            
            SetContentView (Resource.Layout.activity_main);
            Button button = FindViewById<Button> (Resource.Id.button);

            button.Click += ClickButton;
        

        private void ClickButton (object sender, EventArgs e) 
  
            //Intent intent = new Intent("companyname.project2.Droid.View.LoginView");
            //StartActivity(intent);
            Intent intent = new Intent (Intent.ActionMain);
            intent.AddCategory (Intent.CategoryLauncher);
            // intent.SetClassName("companyname.project2", "companyname.project2.Droid.View.LoginView");
            intent.SetComponent (new ComponentName ("companyname.project2", "companyname.project2.Droid.View.LoginView"));
            StartActivity (intent);

        

        public override void OnRequestPermissionsResult (int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) 
            Xamarin.Essentials.Platform.OnRequestPermissionsResult (requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult (requestCode, permissions, grantResults);
        
    

项目2:

    

[Activity(Name = "companyname.project2.Droid.View.LoginView", Label = " Logowanie", ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize, NoHistory = true, LaunchMode = LaunchMode.SingleInstance)]
    public class LoginView : MvxActivity<LoginViewModel>
    
        protected override void OnCreate(Bundle savedInstanceState)
        
            base.OnCreate(savedInstanceState);

            SetContentView(Resource.Layout.LoginView);

        
    

项目 2 android manifest intent 过滤器:

<activity android:name="companyname.project2.Droid.View.LoginView">
      <intent-filter>
        <action android:name="companyname.project2.View.LoginView"></action>
        <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
    </activity>

【问题讨论】:

【参考方案1】:

我认为默认情况下不会合并清单。因此,如果您在构建时查看 obj/Debug/android 中生成的 AndroidManifest.xml,您可能会注意到缺少 LoginView 条目。

您可以尝试将以下 NuGet 包添加到您的 App 项目中,看看是否会合并清单:https://www.nuget.org/packages/Xamarin.Android.ManifestMerger/1.0.0-preview03

否则,您将需要在您的应用清单中为 LoginView 手动添加相同的条目。

编辑:

确保您使用正确的意图。这对我来说很好:

var intent = new Intent(this, typeof(LoginView));

【讨论】:

谢谢你,但不幸的是它似乎不起作用。仍然得到同样的错误。我已经尝试将提到的 nuget 包添加到第一个、第二个和两个项目中。尝试将手动相同的意图过滤器添加到第一个项目。在位于 obj/Debug/android 的 AndroidManifest.xml 中,手动添加的活动都是可见的。 经过几次尝试,我成功了。似乎必须安装其他应用程序才能从其他项目开始活动。我需要在没有安装的情况下从其他项目开始活动,所以我将第二个项目作为库。感谢您的帮助,我会将其标记为已接受的答案。

以上是关于Xamarin 在同一解决方案中运行来自其他项目的活动的主要内容,如果未能解决你的问题,请参考以下文章

在 Xamarin 表单中显示来自另一个项目的图像

Xamarin 不在同一页面中显示来自第二个 CollectionView 的内容

如何一次在一个解决方案中编写多个项目中的代码? [Visual Studio / Xamarin]

来自 PCL 的 Xamarin WebAPI 调用

XCode 在打开项目时崩溃

Xamarin IOS 蓝牙 LE 广告