每次按下按钮时,此代码都会生成一个新的EditText
final RelativeLayout layout = (RelativeLayout) findViewById(R.id.ataque);
mas.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText extra = new EditText(getApplicationContext());
int ntext = mispreferencias.getInt("contadortext", 0);
RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
extra.setId(ntext);
final int id_ = extra.getId();
extra.setLayoutParams(p);
editor.putInt("extra" + ntext, id_);
editor.putInt("contadortext", ntext + 1);
editor.commit();
layout.addView(extra);
}
});
在已经生成它们的情况下,我尝试获取写入其中的文本并将其保存在SharedPreferences中,但是它不起作用。
int ntext = mispreferencias.getInt("contadortext", 0);
for (int i = 0; i < ntext; i++) {
int ide = mispreferencias.getInt("extra" + i, 0);
EditText edi = findViewById(ide);
editor.putString("text" + i, edi.getText().toString());
}
它返回错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
答案 0 :(得分:1)
由于要遍历所有EditText并保存它们的文本,为什么不在创建时将它们存储在列表中?这样就避免了所有id问题。
ArrayList<EditText> list = new ArrayList();
final RelativeLayout layout = (RelativeLayout) findViewById(R.id.ataque);
mas.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText extra = new EditText(getApplicationContext());
RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
list.add(extra);
layout.addView(extra);
}
});
现在遍历列表:
for (int i = 0; i < list.size(); i++) {
editor.putString("text" + i, list.get(i).getText().toString());
}
答案 1 :(得分:0)
快速浏览undefined
方法的定义可以为我们提供
ForcefullyOmit
另一遍findViewById
的定义告诉我们
表示整数参数,字段或方法的返回值应该是id资源引用
现在,我们知道@Nullable
public <T extends View> T findViewById(@IdRes int id) {
return getWindow().findViewById(id);
}
期望引用资源的整数。
我们还知道@IdRes
在运行时无法修改。
我们可以得出结论,对于在运行时以编程方式创建的findViewById
,不能使用R
。
您可以(但我不建议这样做),创建一个包含ID的XML,如本link
所示