从生成的EditText获取文本

时间:2018-12-15 19:30:14

标签: java android

每次按下按钮时,此代码都会生成一个新的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

2 个答案:

答案 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

所示