为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

明月笑刀无情 2022-07-27 20:49:47
我正在构建一个应用程序,其中我有一个编辑文本字段并从用户获取数据并将其存储在数据库中它工作正常,现在我使用一个按钮动态创建另一个编辑文本字段(此字段仅在用户创建希望通过使用按钮单击),现在动态创建的字段的 id 始终为 null 并显示错误。我将分享我的代码。对于动态编辑文本:  //update startfinal 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()));(此处数据是使用此代码插入到数据库中的,但在尝试查看数据时,应用程序崩溃了。)
查看完整描述

3 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

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


查看完整回答
反对 回复 2022-07-27
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

首先,edittext 用于从用户那里获取数据,并将其存储在 db 中,以便以后更新用户打开相同的活动并在 edittext 中进行更改(其中 edittext 视图是动态创建的),所以我我像那样铸造。


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


findViewById()当您已经有 EditText ( et1)的参考时,您不需要在这里。


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


示例代码:


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

    }

}


查看完整回答
反对 回复 2022-07-27
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

参考:https ://developer.android.com/reference/android/view/View.html

首先你需要设置 id 使用View.generateViewId()

public static int generateViewId ()

生成一个适合在 中使用的值setId(int)。此值不会与 aapt for 在构建时生成的 ID 值冲突R.id

Ex.

et1.setId(View.generateViewId())

请在使用前检查或et1EditText 对象是否为 Null .....


查看完整回答
反对 回复 2022-07-27
  • 3 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信