在Android Xamarin Visual Studio中将事件中的字符串传递给MainActivity

时间:2017-11-21 23:16:40

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

该项目在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));
    }
}

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

在此处传递上下文:

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

我没有检查语法,但是这样的事情应该有效。

答案 1 :(得分:0)

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

感谢大家试图帮忙。非常感谢