动态创建的视图ID始终为null-findviewbyid不起作用

时间:2019-03-10 07:17:48

标签: java android-edittext dynamic-view

我正在构建一个应用程序,其中有一个编辑文本字段,并从用户那里获取数据并将其存储在数据库中,它工作正常,现在我使用按钮动态创建了另一个编辑文本字段(仅创建该字段(如果用户希望通过单击按钮),则动态创建的字段的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());

运行该应用程序时,我在此行中遇到错误,如下所示。

logcat:

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()));

(这里是使用此代码将数据插入数据库中的,但是在尝试查看数据时,应用程序崩溃了。)

3 个答案:

答案 0 :(得分:0)

  

首先,edittext用于从用户获取数据,它将   被存储在db中,供以后更新时用户打开该数据库   活动并在edittext中进行更改(其中edittext   视图是动态创建的一个),所以我像这样进行投射。

据我了解,EditText(et1)最初用于从用户获取输入以保存数据。稍后用于查看EditText(et1)来显示数据。

在这里,当您已经有EditText(findViewById())的引用时,就不需要et1

只需在EditText级别声明Activity,并使用它来获取视图上的输入或显示数据!

示例代码:

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!!");
    }
}

答案 1 :(得分:0)

您可以在布局xml页面中定义该edittext,并对该字段进行可见性处理,当您想要显示该edittext时,可以在单击按钮后使其可见。我猜是一个简单的解决方案。然后该元素将在那里,不会抛出空指针异常。

答案 2 :(得分:0)

Ref:https://developer.android.com/reference/android/view/View.html

首先,您需要使用View.generateViewId()

设置ID
public static int generateViewId ()

生成一个适用于setId(int)的值。此值不会与R.id的aapt生成时生成的ID值冲突。

Ex.

et1.setId(View.generateViewId())

请在使用前检查,或者et1 EditText对象是否为空....