如何将变量从(主要活动到另一个)活动传递到Android C#中的自定义视图?

How to pass variable from (main activity to another) activity to custom view in Android C#?

我是编程新手,在将变量从活动传递到我的自定义视图时遇到问题。

在我的主要活动中,我使用以下方法将字符串添加到新活动(分析):

1
2
3
Intent a = new Intent (this, typeof(Analysis));
a.PutExtra("speedvalues", mapclass.Speed());
StartActivity (a);

在分析活动中,我使用以下方法来检索它:

1
string s = Intent.GetStringExtra("speedvalues");

这一切都很好。但是,我需要将此字符串传递给我在打开新活动时调用的另一个类(我的自定义视图类)。因为我需要这个字符串来使用我的自定义视图类绘制图形/线条。

谁能告诉我我该怎么做?我尝试将字符串 s 声明为静态字符串,但这导致了异常错误。

编辑:

这是我的自定义 View 类的一部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Graph : View
{
    List<int> speedvalues = new List<int>(StringToListInt(VARIABLE FROM ACTIVITY));
    List<PointF> graphpoints = new List<PointF>();
    int padding = 100;

    public Graph(Context c) : base(c)
    {
    this.SetBackgroundColor(Color.White);
    }

    public float MaxSpeed()
    { [...] }

    public static List<int> StringToListInt(string x)
    { [...] }                  

    public void GraphPoints()
    { [...] }                  

    protected override void OnDraw(Canvas cv)
    { [...] }

编辑2:

谢谢大家的回答!我检查了最有帮助的一个。

我自己也找到了解决方案。我创建了一个新的静态字符串和一个静态方法。我使用静态方法将新的静态字符串分配给 "speedvalues" 的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Analysis : Activity

    Graph graph;
    public static string s5;

    protected override void OnCreate (Bundle bundle)
    {
        [...]

        string s4 = Intent.GetStringExtra("speedvalues");
        s5 = StringToG (s4);
        graph = new Graph(this);
    }

    private static string StringToG(string s)
    {
        return s;
    }

当然,在 Graph 类中,我使用以下方法检索值:

1
string speedvalues = Analysis.s5;

到目前为止,这个工作。这个版本是好是坏?


除了其他答案之外,您还有另一个选项,称为 Shared Preferences。

您可以在主活动中存储变量并在任何类中获取它。

有很多通过谷歌找到的教程,比如这个

http://androidexample.com/Android_SharedPreferences_Basics/index.php?view=article_discription


您正在分配值,并且已经调用了 ondraw。
所以为了防止ondraw,请找到下面修改你的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Graph : View
{
    List<int> speedvalues;
    List<PointF> graphpoints = new List<PointF>();
    int padding = 100;
    bool isReady = false;

    public Graph(Context c) : base(c)
    {
    this.SetBackgroundColor(Color.White);
    }

    public float MaxSpeed()
    { [...] }

    public static List<int> StringToListInt(string x)
    { [...] }                  

    public void GraphPoints()
    { [...] }                  

    public void ReadyToDraw(bool ready)
    {
        isReady=ready;
    }

    public static List<int> StringToListInt(string x)
    {
        speedvalues=new List<int>(StringToListInt(x));
    }

    protected override void OnDraw(Canvas cv)
    {
     base.OnDraw(canvas);
    if(ReadyToDraw)
    {
    //Your drawing code
    }
    }
}

然后像下面这样传递值

1
2
3
4
5
6
string s = Intent.GetStringExtra("speedvalues");

Graph g=new Graph(this);
g.StringToListInt(s);//Assign values
g.ReadyToDraw(true);//Set it is ready to draw
g.invalidate(); // Draw


1.改变

1
List<int> speedvalues = new List<int>(StringToListInt(VARIABLE FROM ACTIVITY));

2.到

1
List<int> speedvalues  ;

3.改变

1
2
3
4
public Graph(Context c) : base(c)
{
    this.SetBackgroundColor(Color.White);
}

4.到

1
2
3
4
5
public Graph(Context c , string speedvalues ) : base(c)
{
    this.peedvalues = new List<int>(StringToListInt(speedvalues));
    this.SetBackgroundColor(Color.White);
}

5.改变

1
2
3
 string s4 = Intent.GetStringExtra("speedvalues");
 s5 = StringToG (s4);
 graph = new Graph(this);

6. 到

1
2
 string s4 = Intent.GetStringExtra("speedvalues");
 graph = new Graph(this , StringToG(s4));

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
class Graph : View
{
    List<int> speedvalues  ;

    public Graph(Context c , string speedvalues ) : base(c)
    {

       this.peedvalues = new List<int>(StringToListInt(speedvalues));

       this.SetBackgroundColor(Color.White);

    }
}

基础(C# 参考)msdn