【问题标题】:Passing a string from an event to MainActivity in Android Xamarin Visual Studio将字符串从事件传递到 Android Xamarin Visual Studio 中的 MainActivity
【发布时间】:2017-11-21 23:16:40
【问题描述】:

该项目在 Visual Studio 中使用 Xamarin 完成并针对 Android。

在我的简单项目中,我有 1 个活动 (MainActivity)。在这里,我创建了一个 Scanner 对象的实例,它将位于后台并监听 iBeacons。创建扫描仪后,我会在扫描仪对象上调用 Start 方法。

在 Scanner 对象的构造函数中,会设置一个 Listener 对象的实例。当检测到信标时调用此实例。

简而言之——我的主要活动是创建一个扫描仪对象的实例。在创建扫描器对象时,会创建一个侦听器对象。当检测到信标时,将激活此侦听器对象。

在我的 MainActivity 中,我有一个多行 TextView。我希望它显示在侦听器对象中找到的信标。

在主活动中将此信标 ID(字符串)传递给 TextView 的最佳方式是什么?

我是在 Android 中编程的新手,所以所有关于块、意图和你拥有什么的不同概念有点令人困惑。我原以为这是直接将数据从侦听器事件传递到 TextView,但事实证明这比预期的要困难。

我不介意放慢速度 - 所以请随时详细说明并认为我是新手:-D

更新: 我已经编辑了代码以使其尽可能短,并将其粘贴在下面。希望这能提供一个想法。

[Activity(Label = "DeviceScanSample", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{

    KontaktScanner scanner;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);

        // Initialize Scanner
        scanner = new KontaktScanner(this);

        // Button actions
        startScanButton.Click += delegate
        {
            if (CheckPermission(Manifest.Permission.AccessCoarseLocation))
            {
                // Start devices scan
                scanner.Start();
            }
            else
            {
                // Ask for permissions if needed
                ...
            }
        };
    }
}

public class KontaktScanner : Java.Lang.Object, IOnServiceReadyListener
{

    IProximityManager proximityManager;

    public KontaktScanner(Context context)
    {
        // Set Space listener
        proximityManager.SetSpaceListener(new KontaktSimpleSpaceListener());
    }

    public void Start()
    {
        proximityManager.Connect(this);
    }
}


class KontaktSimpleSpaceListener : SimpleSpaceListener
{

    public void OnRegionEntered(IBeaconRegion beaconRegion)
    {
        Log.Info(TAG, string.Format("Entered {0} region", beaconRegion.Identifier));
    }

    public void OnRegionAbandoned(IBeaconRegion beaconRegion)
    {
        Log.Info(TAG, string.Format("Abandoned {0} region", beaconRegion.Identifier));
    }
}

【问题讨论】:

  • 显示一些你试图创建对象和你试图传递字符串的代码。
  • @NongthonbamTonthoi - 我现在添加了部分代码。我需要能够将 log.info 文本传递回主要活动。

标签: c# visual-studio xamarin parameter-passing main-activity


【解决方案1】:

试试这样的:

在此处传递上下文:

public KontaktScanner(Activity activity)
{
    // Set Space listener
    proximityManager.SetSpaceListener(new KontaktSimpleSpaceListener(activity));
}

然后:

class KontaktSimpleSpaceListener : SimpleSpaceListener
{
    Activity context
    public KontaktSimpleSpaceListener(Activity activity)
    {
        this.context = activity; 
    }

    public void OnRegionEntered(IBeaconRegion beaconRegion)
    {
        Log.Info(TAG, string.Format("Entered {0} region", beaconRegion.Identifier));
        MainActivity myActivity = (MainActivity) context;
        myActivity.updateTextView("My Data");// pass the string here.
    }

    public void OnRegionAbandoned(IBeaconRegion beaconRegion)
    {
        Log.Info(TAG, string.Format("Abandoned {0} region", beaconRegion.Identifier));
        MainActivity myActivity = (MainActivity) context;
        myActivity.updateTextView("My another data");// pass the string here.
    }
}

然后在MainActivity中创建方法:

public void updateTextView(string s) 
{
    RunOnUiThread(() =>
    {
        yourTextView.Text = s;//set your TextView here
    });
}

我还没有检查语法,但这样的东西应该可以工作。

【讨论】:

  • 我的问题是类和方法是由 iBeacons 的供应商定义的。我正在使用他们的 SDK,所以我无法更改 KontaktSimpleSpaceListner 类的构造函数以包含 Activity。 KontaktScanner 也是如此,您将参数从 Context 更改为 Activity。我认为这是我问题的关键!如何从非我设计的类中的回调/事件中引用主 UI?
  • @public-profile 尝试创建自己的类来扩展 KontaktSimpleSpaceListener 和 KontaktScanner 并在那里创建构造函数,您可以覆盖/实现方法。
  • 好的 - 我会看看这种方法是否可行。但是我还是不明白为什么引用负责处理 UI 的对象这么难。我的意思是 - 有没有没有 UI 的应用程序?无论如何 - 这不是你的问题 :-) 但对我来说这很奇怪,我想这是因为我无法弄清楚 Android 架构中的智能。
【解决方案2】:

如果在此视频中找到答案: https://forums.xamarin.com/discussion/comment/308314#Comment_308314

感谢所有试图提供帮助的人。非常感谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多