【问题标题】:Dynamically change a variable TextView id in android在android中动态更改变量TextView id
【发布时间】:2015-06-16 19:38:49
【问题描述】:

是否可以动态更改变量名。我的意思是我有 4 个文本视图,名称为:textView1、textView2、textView3、textView4

我在 for 循环中添加一个计数我想做这样的事情:

for (int i; i<count; i++)
{
  textView+(i).setText(Count)
  //textView1.setText(Count);
  //textView2.setText(Count);
  //textView3.setText(Count);
  //textView4.setText(Count);

  count++
}

我如何实现这一目标?这可能吗?

谢谢!

【问题讨论】:

  • 先明确你的问题。不太清楚。
  • 你不能这样改变变量名。无论如何,它们在编译后都不会使用。您对编程语言的看法不正确。检查here。您应该只使用TextViews 的列表
  • @MD : 而不是 textView1 我希望它是 textView(i) - 我只是 1,2,3,4
  • 将对象放入集合中
  • 使用ArrayList with textView。这有什么问题?

标签: android


【解决方案1】:

无法在运行时更改变量的名称。变量是您作为开发人员用来告诉“计算机”您希望它做什么的工具。这个问题与询问您是否可以编写无需在每个语句末尾添加分号 (;) 的代码一样无效。变量名称只是您调用某些正在使用的元素的名称。这就是 Java 的工作原理。

话虽如此,您可以通过使用一个简单的数组并对其进行迭代来实现您想要做的事情。你可以这样做:

TextView[] textViews = new TextView[] { textView1, textView2, textView3, textView4 };

for (int i = 0; i < textViews.length; i++)
{
    textViews[i].setText("some text");
} 

在这里,您创建一个名为“textViews”的新变量,它是一个TextView 类型数组。在其中,您有 4 个对其他 TextViews 的引用,每个引用由您之前提供的变量名称定义。

编辑:

如果您的 TextViews 在 XML 布局文件中定义,那么您可以在创建数组之前初始化 textView1、textView2、.. 变量,或者您可以直接调用 findViewById 来初始化数组,例如所以:

TextView[] textViews = new TextView[] { 
    (TextView)findViewById(R.id.textView1),
    (TextView)findViewById(R.id.textView2),
    (TextView)findViewById(R.id.textView3),
    (TextView)findViewById(R.id.textView4)
};

【讨论】:

  • 但是我如何将 textView 数组链接到 XML 中的实际数组,因为我已经将 textView 固定在那里。
  • 编辑了我的答案来解决这个问题。
  • 如果不使用id并接收动态呈现int id = getResources().getIdentifier("textView" + i, "id", this.getPackageName()); (TextView)findViewById(id),数组的初始化可以做得更优雅
【解决方案2】:

基本上你想要的不是最佳实践

但如果您可以通过Reflection 实现非常需要它

        String textViewName = "textView";
        String methodName = "setText";
        Class activityClass = this.getClass();
        for(int i = 0; i < count; i++) {
            try {
                Field field = activityClass.getField(textViewName + i);
                if(field != null){
                    Method method = field.getClass().getMethod(methodName, String.class);
                    method.invoke(field, Count);
                }
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        }

【讨论】:

  • 无法通过反射来更改方法中的变量名称。如果每个 TextView 都是其包含的类的一个字段,那么这只是一个可行的答案,即使这样,(公平地说,你确实这么说过),这样做是一个糟糕的主意。
  • 您在哪里看到有人更改了变量名?
  • 这是发帖者提出的问题:“是否可以动态更改变量名”
  • 你看到他在代码中做了什么吗?他按名称迭代并更改TextView中的文本
  • 我想你可能误解了这个问题。张贴者希望能够更改变量的名称。即,如果我有一个名为“int a”的变量,他会询问是否可以在运行时将其更改为“b”。这样的事情在概念上可以通过反射来实现,其中变量名称被描述为一个字符串,但我觉得这里更重要的一点是,发帖人对 Java 的工作原理缺乏基本的了解。
【解决方案3】:

不可能。这就是java的工作原理,你可以称之为语法规则

你可以这样做

拿一个Collectioniterate 吧。你不能懒到 至少初始化变量名!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2011-12-26
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多