无法以编程方式设置 EditText ID

Posted

技术标签:

【中文标题】无法以编程方式设置 EditText ID【英文标题】:Cannot Programmatically Set EditText ID 【发布时间】:2016-11-10 11:43:13 【问题描述】:

我正在创建动态数量的editText,并希望最终为每个人提取ID,以便在editText上调用.getText()。

但是,我注意到以编程方式设置 ID 很困难,所以我改用 .setTag() 方法:

private void createAnswerChoice(int answerNumber) 
    ViewGroup layout = (ViewGroup) mRootView.findViewById(R.id.create_poll_questions_answer_layout);
    EditText editText = new EditText(getActivity());
    editText.setHint(getResources().getString(R.string.answer_text) + " " + answerNumber);
    editText.setSingleLine(true);
    editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
    String editTextID = ((getResources().getString(R.string.created_answer_editText_id))+String.valueOf(answerNumber));
    editText.setTag(editTextID);
    Toast.makeText(getActivity().getApplicationContext(), editTextID, Toast.LENGTH_SHORT).show();
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    editText.setLayoutParams(layoutParams);
    TextInputLayout newAnswer = new TextInputLayout(getActivity());
    newAnswer.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    newAnswer.addView(editText, layoutParams);
    layout.addView(newAnswer);

如果我知道标签而不是 ID,我将如何获取每个 editText 的值?另外,.setTag() 方法的目的是什么(它与 .setID() 有什么关系?)

【问题讨论】:

设置ID有什么问题? 如果您使用的是 android,那么建议使用 xml 而不是以编程方式创建视图。更容易进行更改并提供更简洁的代码 我正在根据用户选择的数字创建动态视图,因此静态 XML(据我所知)是不够的 【参考方案1】:

在 res/values/id.xml 中创建资源文件(id.xml)

  <?xml version="1.0" encoding="utf-8"?>
  <resources>
   <item
    type="id"
    name="edittext_hello" />
  </resources>

然后设置,

 editText.setId(R.id.edittext_hello);

【讨论】:

【参考方案2】:

findViewById()findViewWithTag() 是用于获取对从 XML 膨胀的 View 的引用的方法。

如果您正在创建Views,那么您已经拥有它们,则无需使用这些方法。将View 的引用保留在某处。

【讨论】:

【参考方案3】:

我不建议使用标签从你的层次结构中获取视图,但如果你必须这样做,这篇 SO 帖子描述了如何做到这一点:https://***.com/a/16262479/6526330。

当您需要在视图中缓存一些数据以便稍后再次获取视图时(是的,我知道非常通用),应该使用标签。一些示例是,如果您在列表视图中使用持有者,或者如果您在屏幕上有很多视图并且想要一个全局点击侦听器与每个视图的侦听器。我从the answers on this post 偷了这两个例子,它们在描述用例方面做得比我做得更好。

【讨论】:

以上是关于无法以编程方式设置 EditText ID的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 EditText 的背景资源设置为透明字段

检测 EditText 的内容是由用户更改还是以编程方式更改?

如何以编程方式在 dp 中设置 EditText 上边距?

如何在 Holo 主题 Api 11-17 Android 中以编程方式将 EditText 背景设置为默认值

如何以编程方式隐藏可绘制的权限

以编程方式将 EditText 的输入类型从 PASSWORD 更改为 NORMAL,反之亦然