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

本文关键字:活动 另一个 视图 自定义 Android 变量 | 更新日期: 2023-09-27 18:31:33

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

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

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

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

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

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

有人可以告诉我我该怎么做吗?我尝试将字符串声明为静态字符串,但这导致了异常错误。

编辑:

以下是我的自定义视图类的一部分,应要求:

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"的值:

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 类中,我使用以下方法检索值:

string speedvalues = Analysis.s5;

到目前为止,这个有效。这个版本是更好还是更差?

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

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

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

然后传递如下所示的值

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

除了其他答案之外,您还有另一个称为"共享首选项"的选项。

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

例如,通过

谷歌可以找到许多教程,例如

http://androidexample.com/Android_SharedPreferences_Basics/index.php?view=article_discription&aid=126&aaid=146

1. 更改

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

2. 至

List<int> speedvalues  ;

3. 更改

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

4. 至

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

5. 更改

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

6. 至

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

完整代码

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

base (C# Reference) msdn