【问题标题】:findViewById Android to return multiple resultsfindViewById Android 返回多个结果
【发布时间】:2014-12-04 22:02:05
【问题描述】:

我创建了一个在滚动视图中包含相对布局的 android 应用程序,但无法使我在 textview 中的链接可点击。为了解决这个问题,我正在使用

TextView TextView = (TextView)findViewById(R.id.textview2);
TextView.setMovementMethod(LinkMovementMethod.getinstance());

所以,我知道 findViewById() 只会返回第一个实例。例如,如果我希望 textView2、textView4 和 textView8 都成为链接,我该怎么办。我假设这里的 for 循环可以解决问题?

【问题讨论】:

  • 我没有看到问题。这些 TextView 中的每一个都不会有唯一的 ID 吗?因此,您只需为每个调用 findViewById 即可。例如TextView TextView4 = (TextView)findViewById(R.id.textview4);
  • findViewById() will only ever return the first instance。只有一个实例。 R.id.xxxx 是唯一的。
  • 下面的行是 'TextView4.setMovementMethod(..)' 对吗?我可以做到这一点,我会为大约 300 个 textViews 做这件事,但是
  • 好的,我明白了问题所在,以及为什么循环是有益的。我有几个想法。我会在一分钟内发布答案...
  • 谢谢--我期待明天早上看到它(前往另一个办公室过夜)

标签: android textview findviewbyid linkify


【解决方案1】:

无论何时声明或创建一个元素,强烈建议指定一个唯一的 id,至少如果它们将在同一个 ViewGroup 中。

在xml中:

<TextView android:id="@+id/txtId1" 
...
/>
<TextView android:id="@+id/txtId2" 
...
/>

或通过调用

View.setId(int id)

在您的情况下,在 xml 中分配这些会更容易,为您的每个 TextViews 都这样做。 一旦你有了这些,你可以手动将它们添加到一个数组中并循环它们:

数组:

int[] viewArray = {R.id.txtId1, R.id.txtId2};

循环:

int size = viewArray.length;
for(int i = 0; i < size; i++) {
    TextView view = (TextView) findViewById(viewArray[i]);
    if(view != null) {
        view.setMovementMethod(LinkMovementMethod.getinstance());
    }
}

确保上面的代码在使你的 xml 膨胀的活动中。例如:

setContentView(R.layout.activity_main);//This xml should contain the TextViews mentioned above.

否则,如果您正在夸大自己的视图调用:

myView.findViewById(viewArray[i]);

有关更多信息,请查看View 类文档。

【讨论】:

  • 这个对我来说很有意义,并且正是我想要的。但是,它没有用。然而,我确实花了几个星期的时间让它工作。非常感谢您的帮助!
  • 再次确保在 XML 中为每个 TextView 定义一个唯一的 id,然后在数组中使用相同的 id。我将更改代码以使其更清晰。
  • 如果这确实是您问题的答案,请务必将其标记为是。
【解决方案2】:

鉴于您有数百个 TextViews 的上述评论,您可以尝试以下操作:

假设这样的布局:

<LinearLayout android:id="container" ...
   <TextView android:id="tv1" ... />
   <TextView android:id="tv2" ... />
   <TextView android:id="tv3" ... />
    ....
   <TextView android:id="tv300" ... />
</LinearLayout>

您可以执行以下操作:

LinearLayout container = (LinearLayout)findViewById(R.id.container);
int count = container.getChildCount();
for (int i=0; i<count; i++) {
    View v = container.getChildAt(i);
    if (v instanceof TextView) {
          TextView tv - (TextView)v;
          tv.setMovementMethod(LinkMovementMethod.getinstance());
    }
}

【讨论】:

  • 这看起来会起作用,但是,我不需要将每个 textView 都设置为链接。如果不是我的所有 textView 都需要链接怎么办?更具体地说,如果我在没有链接的 textview 上有 textview.setMovementMethod(...) ,这会否决我的程序?无论如何都赞成,因为你给我的答案会足够好
  • 在这种情况下,它需要所有的孩子。就像您提到的那样,如果您知道要将哪些设置为链接,更不用说并非所有这些都可能是同一类型,您可以使用我发布的解决方案。
  • 例如,在您的 XML 布局文件中使用“clickableTextView1”、“clickableTextView2”等 id。然后在您的 Java 代码中,检查 textView 的 ID,只有在 ID 开始时才采取行动带有字符串“可点击”
  • 是的。这将起作用。真的,您的第一个答案为我解决了这个问题。为这些经历和添加一些东西到 ID 的困难在于我在 relativelayout 中构建了整个东西,也就是改变一个名字需要在其他几个地方也改变它。但我们生活,我们学习,我认为这是我最后一次也是唯一一次在滚动视图中使用相对布局
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多