我正在构建一个应用程序,其中我有一个编辑文本字段并从用户那里获取数据并将其存储在数据库中它工作正常,现在我使用一个按钮动态创建另一个编辑文本字段(仅当用户需要使用按钮单击时才创建此字段),现在动态创建的字段的 id 始终为 null 并显示错误。我将分享我的代码。
对于动态编辑文本:
//update start
final LinearLayout ll = (LinearLayout) findViewById(R.id.li1);
mContext = getApplicationContext();
RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
//update end
et1 = new EditText(AddTask.this);
et1.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT));
et1.setHint("Enter Item Name");
et1.setId(View.generateViewId());
//updates
layout.addView(et1, params1);
ll.addView(layout);
要访问它:
EditText item_name = (EditText) findViewById(et1.getId());
运行应用程序时,我在这一行中出现错误,就像这样。
日志猫:
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.NullPointerException:
Attempt to invoke virtual method 'int android.widget.EditText.getId()' on a null object reference
更新:
我也试过这种方式,还是没用的伙计们,
EditText item_name = (EditText) findViewById(getResources().getIdentifier(String.valueOf(et1.getId()), "id", getPackageName()));
(这里数据使用此代码插入数据库,但是当尝试查看数据时,应用程序崩溃了。
首先,在创建视图时,您需要设置 id。然后,您可以尝试获取视图的 ID。如何以编程方式设置 id
可以肯定的是,你做错了什么。我只是尝试做你正在尝试的事情,它有效。 这是我的活动
class RootActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_root)
val layout = findViewById<LinearLayout>(R.id.root)
val ed = EditText(this).apply {
hint = "Type here"
layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
)
id = View.generateViewId()
}
layout.addView(ed)
val ed2 = findViewById<EditText>(ed.id)
Log.e("MEEEEEE", ed2.toString())
}
}
这是 xml 布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
首先,编辑文本用于从用户那里获取数据,它将 存储在数据库中,并且为了以后打开相同的用户更新 活动并在编辑文本中进行更改(其中编辑文本 视图是动态创建的),所以我是这样投射的。
根据我的理解,EditText (et1
) 最初用于从用户那里获取输入以保存数据。稍后用于查看的编辑文本(et1
)用于显示数据。
在这里,当您已经有 EditText (et1
) 的参考时,您无需findViewById()
。
只需在Activity
级别声明EditText
,并使用它来获取输入或在视图上显示数据!
示例代码:
EditText et1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_name);
}
@Override
protected void onResume() {
super.onResume();
setView();
updateView();
}
private void setView() {
et1 = new EditText(this);
et1.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
et1.setHint("Enter Item Name");
}
private void updateView() {
if (dbHasValues) {
et1.setText("From DB!!");
}
}
您可以在布局xml页面中定义该编辑文本,并为该字段执行可见性,当您想要显示该编辑文本时,您可以在单击按钮后使其可见性可见。我想一个简单的解决方案。然后元素将在那里,它不会抛出空指针异常。
参考 : https://developer.android.com/reference/android/view/View.html
首先,您需要使用View.generateViewId()
来设置 ID
public static int generateViewId ()
生成适合在setId(int)
中使用的值。此值不会与 aapt 在构建时为R.id
生成的 ID 值冲突。
Ex.
et1.setId(View.generateViewId())
请在使用前检查et1
否则编辑文本对象是否为空.....