该项目在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));
}
}
答案 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
感谢大家试图帮忙。非常感谢