在Xamarin Android上从另一个Activity启动一个Activity

11

我找到了这段Java代码,可以创建一个通用的方法,从一个活动启动任何活动。

public void gotoActivity(Class activityClassReference)
{
    Intent i = new Intent(this,activityClassReference);
    startActivity(i);
}

我该如何将那段代码转换为适用于Xamarin-Android的C#代码?

先行致谢。

5个回答

19

你可以写:

public void GoToActivity(Type myActivity)
{
            StartActivity(myActivity);
}

并且像这样调用:

 GoToActivity(typeof(ActivityType));

或者只写:

StartActivity(typeof(ActivityType));

6
void btnEntrar_Click(object sender,EventArgs e)
    { 
        var NxtAct= new Intent(this, typeof(Perguntas2));
        StartActivity(NxtAct);
    }

在我的代码中,我做了这个操作


3
Android 11中阅读(Read)应用程序需要使用<queries>元素声明要访问活动的应用程序包名称,因为Android 11引入了与软件包可见性相关的更改changes related to package visibility。否则,您将会收到ActivityNotFoundException错误提示。
<manifest>
....
    <queries>
        <package android:name="com.companyname.yourOtherApp" />
    </queries>
</manifest>

你想要做的第一步是获取PackageManager: PackageManager pm = Android.App.Application.Context.PackageManager; 然后你可以查找一个启动Activity的意图: Intent intent = pm.GetLaunchIntentForPackage(packageName); - 如果这个值是null,你可以编写逻辑将用户带到PlayStore安装该应用程序。
最终代码:
            PackageManager pm = Android.App.Application.Context.PackageManager;

            Intent intent = pm.GetLaunchIntentForPackage(packageName);
            if (intent != null)
            {
                intent.PutExtra(Android.Content.Intent.ExtraPackageName, "com.companyname.callingActivityName");
                intent.SetFlags(ActivityFlags.NewTask);
                Android.App.Application.Context.StartActivity(intent);
            }
            else
            {
                Android.App.Application.Context.StartActivity(new Intent(Intent.ActionView).SetData(Android.Net.Uri.Parse("https://play.google.com/store/apps/details?id=" + packageName)));
            }

注意: 可以在所有代码周围使用try/catch。行intent.PutExtra只是一个添加一些消息到其他活动的示例。您可以在另一侧使用以下内容获取:OnCreatevar text = Intent.GetStringExtra(Android.Content.Intent.ExtraPackageName); 如果您想在OnResume中使用它,以便在重定向后应用程序可以接收消息(在这种情况下,不会触发OnCreate),您必须首先覆盖另一个方法。它将允许您获取更新的值:
    protected override void OnNewIntent(Android.Content.Intent intent)
    {
        base.OnNewIntent(intent);
        // Check not required, implement your own logic. This checks if a message was passed.
        if (intent.Extras != null)
            Intent = intent; // Intent.GetStringExtra now has the new value
    }

现在在OnResume中,您可以使用与以前相同的方法,并且它将包含传递的值:
var text = Intent.GetStringExtra(Android.Content.Intent.ExtraPackageName);

2
这是我在应用程序中的做法。
    public void StartAuthenticatedActivity(System.Type activityType)
    {
        var intent = new Intent(this, activityType);
        StartActivity(intent);
    }

    public void StartAuthenticatedActivity<TActivity>() where TActivity: Activity
    {
        StartAuthenticatedActivity(typeof(TActivity));
    }

您可以添加 where TActivity : YourBaseActivity,其中TActivity是您创建的基本活动。

0

我知道这个问题可能已经过时了,但我有一个不同的方法,使用一个外部类来对任何现有的活动进行通用调用操作:

public static class GeneralFunctions
    {
        public static void changeView(Activity _callerActivity, Type activityType)
        {
            ContextWrapper cW = new ContextWrapper(_callerActivity);
            cW.StartActivity(intent);
        }
    }

Button redirectButton = FindViewById<Button>(Resource.Id.RedirectButton);

redirectButton.Click += delegate
{
    GeneralFunctions.changeView(this, typeof(LoginView));
};

可能对你们中的一些人有所帮助


这不是太复杂了吗?有什么方法可以从中受益?也许可以查看Activity是否隐藏/实例化,但除此之外,它看起来像是反KISS代码。 - Jose Cordero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接