动态创建的视图id始终为null - findviewbyid无效

问题描述 投票:3回答:5

我正在构建一个应用程序,其中我有一个编辑文本字段并从用户获取数据并将其存储在数据库中它工作正常,现在我使用一个按钮动态创建另一个编辑文本字段(此字段仅在用户创建时想要通过使用按钮单击),现在动态创建的字段的ID始终为空并显示错误。我将分享我的代码。

用于动态编辑文本:

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

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

java android-edittext dynamic-view
5个回答
2
投票

首先,在创建视图时需要设置id。然后你可以尝试获取视图的ID。 How to set id programmatically

肯定你做错了什么。我只是试着做你正在尝试的东西而且它有效。这是我的活动类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"/>

0
投票

这不是Id的问题

请发布完整的代码。您正在访问null的et1


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

0
投票

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


0
投票

参考: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 EditText对象是否为空.....

© www.soinside.com 2019 - 2024. All rights reserved.