How to pass variable from (main activity to another) activity to custom view in Android C#?
我是编程新手,在将变量从活动传递到我的自定义视图时遇到问题。
在我的主要活动中,我使用以下方法将字符串添加到新活动(分析):
1 2 3 |
在分析活动中,我使用以下方法来检索它:
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 |
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 |
6. 到
1 2 |
完整代码
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