首页 > 解决方案 > 动态创建的视图 ID 始终为空 - findviewbyid 不起作用

问题描述

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

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

标签: javaandroid-edittextdynamic-view

解决方案


首先,您需要在创建视图时设置 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"/>

推荐阅读