【问题标题】:Values have been retrieved from Firebase, but cannot map onto resources (Xamarin Android)已从 Firebase 检索值,但无法映射到资源 (Xamarin Android)
【发布时间】:2021-03-19 16:01:59
【问题描述】:

我正在尝试根据从 Xamarin Android 上的另一个活动传递的值来检索值。我已经相应地成功检索了数据,它现在位于我的模型类变量中。问题是,我无法将值映射到资源变量(我已将资源 ID 与变量绑定)。它指出“对象引用未设置为对象的实例”。据我了解,我试图将值映射到不存在的对象上。我不知道如何解决这个问题...

p/s 我是 Xamarin Android 的初学者。任何形式的帮助表示赞赏。

这是我的模型类的摘录

'''

public class Questions
    {
        public string answer1 { get; set; }
        public string answer2 { get; set; }
        public string answer3 { get; set; }
.......

'''

这是我在活动中的监听器,用于获取 firebase 中的值并将其映射到我的模型类 '''

public void OnDataChange(DataSnapshot snapshot)
            {
                if (snapshot.Exists())
                {
                    Questions qs = new Questions();
                    var obj = snapshot.Children;
                    foreach (DataSnapshot quest in obj.ToEnumerable())
                    {
                        qs.qid = quest.Key;
                        qs.question = quest.Child("question").Value.ToString();
                        qs.answer1 = quest.Child("answer1").Value.ToString();
                        qs.answer2 = quest.Child("answer2").Value.ToString();
                        qs.answer3 = quest.Child("answer3").Value.ToString();
                        qs.correctanswer = quest.Child("correctanswer").Value.ToString();
}

'''

这是我尝试映射值的地方。在活动课上也是如此。 '''

 private void GetData(Questions qs)
        {
            **this.TxtQs.Text** = qs.question;
            **this.answer1.Text** = qs.answer1;
            **this.answer2.Text** = qs.answer2;
            **this.answer3.Text** = qs.answer3;
        

} ''' 这是我将资源 ID 与变量绑定的地方(将值放入 GetData())。 '''

public class kuizActivity2 : BaseActivity, IQuestionsView 
    {
        #region Declare element view
        [BindView(Resource.Id.soalan)]
        public TextView TxtQs { get; set; }


        [BindView(Resource.Id.choice_a_radio)]
        public Button answer1 { get; set; }
            
        [BindView(Resource.Id.choice_b_radio)]
        public Button answer2 { get; set; }

        [BindView(Resource.Id.choice_c_radio)]
        public Button answer3 { get; set; }

....'''

我从 OnCreate() 中调用了 GetData(qs)。粗体字是错误所在。我调试它,发现它都是空的。这是我的调试图片

debug bold lines

【问题讨论】:

  • 您的所有小部件似乎都为空。您是否调用 FindViewById 从您的布局中获取它们?
  • 我已经将资源与将要使用的变量绑定在一起。我已经修改了问题并添加了代码供您查看。我的看法是我知道我试图将值放入不存在的对象中,但是当我尝试在 onCreate() 上创建对象时,它不会将创建的对象传递给类 GetData()。
  • 那么问题是您要么在初始化最宽的部分之前调用 GetData,要么根本找不到它们。如果没有更多关于 GetData 被调用的位置和 Widget 的位置的上下文,很难判断。
  • 我已经可以解决了!将此更新为答案。

标签: android firebase xamarin


【解决方案1】:

问题已解决!

显然,我试图调用尚未初始化的东西,尽管我对 Cheeseknife(Bind) 函数有点困惑。

我将绑定变量设为静态,然后在 oncreate() 上再次调用它们。而不是调用 GetData();在 oncreate() 上,我从我的听众那里打电话给他们。它立即被调用,没有任何空值!

但是,我仍然遇到侦听器在检索到第一个值后没有分离的问题。它仍然将值传递给 GetData() 但然后返回侦听器方法并执行相同操作,直到它从 firebase 读取所有值。所以 GetData() 被覆盖到最后一个值,然后它才会出现在资源上(在手机屏幕上)。

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 2015-09-12
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多