如何在 android 中动态创建的 TableLayout 中设置 EditText 列表的 ID

How to set Id's for list of EditText within the dynamically created TableLayout in android

我正在以编程方式创建一个混合了 TextView 和 EditText 的动态 TableLayout。此 TextViews 是从应用程序的 sqlite 数据库中获取的。 TableLayout 的最后一列由状态设置为 Invisible 的 EditText 组成。我想根据 TableLayout 一行上的 onClick 将 TableLayout 特定行的 EditText 状态设置为 Visible。 onClick 之后,EditText 应该可见,我想将在该 editText 中创建的条目存储在数据库中。

我为此所做的尝试代码如下:

        List<Details> customerDetailList = db.getAllCustomers(routeId);

        Details customerDetails;

        TableLayout stk = (TableLayout) findViewById(R.id.tableLayout1);

        stk.removeAllViews();

        TableRow tbrow0 = new TableRow(this);
        TextView tv0 = new TextView(this);
        tv0.setText("Sl.No.");
        tv0.setTextColor(Color.BLACK);
        tv0.setTypeface(null, Typeface.BOLD);
        //tv0.setTextSize(20);
        tv0.setPadding(5, 5, 5, 5);
        tbrow0.addView(tv0);

        TextView tv1 = new TextView(this);
        tv1.setText(" Patron ID ");
        tv1.setTextColor(Color.BLACK);
        tv1.setTypeface(null, Typeface.BOLD);
        //tv1.setTextSize(20);
        tv1.setPadding(5, 5, 5, 5);
        tbrow0.addView(tv1);

        TextView tv2 = new TextView(this);
        tv2.setText(" Name ");
        tv2.setTypeface(null, Typeface.BOLD);
        //tv2.setTextSize(20);
        tv2.setTextColor(Color.BLACK);
        tv2.setPadding(5, 5, 5, 5);
        tv2.setGravity(Gravity.CENTER);
        tbrow0.addView(tv2);

        TextView tv3 = new TextView(this);
        tv3.setText(" Requested ");
        tv3.setTextColor(Color.BLACK);
        tv3.setTypeface(null, Typeface.BOLD);
        //tv3.setTextSize(20);
        tv3.setPadding(5, 5, 5, 5);
        tv3.setGravity(Gravity.CENTER);
        tbrow0.addView(tv3);

        TextView tv4 = new TextView(this);
        tv4.setText(" Supplied ");
        tv4.setTypeface(null, Typeface.BOLD);
        //tv4.setTextSize(20);
        tv4.setTextColor(Color.BLACK);
        tv4.setPadding(5, 5, 5, 5);
        tbrow0.addView(tv4);


        tbrow0.setBackgroundResource(R.color.colorLightGray);
        stk.addView(tbrow0);


        for (int row = 0, j = 1; row < customerDetailList.size(); row++, j++) {
            customerDetails = customerDetailList.get(row);
            TableRow tbrow = new TableRow(this);
            tbrow.setClickable(true);
            final TextView t1v = new TextView(this);
            t1v.setText("" + j);
            t1v.setTextColor(Color.BLACK);
            t1v.setGravity(Gravity.CENTER);
            t1v.setPadding(5, 5, 5, 5);
            tbrow.addView(t1v);
            TextView t2v = new TextView(this);
            t2v.setText("" + customerDetails.getcId());
            t2v.setTextColor(Color.BLACK);
            t2v.setGravity(Gravity.CENTER);
            t2v.setPadding(5, 5, 5, 5);
            tbrow.addView(t2v);
            TextView t3v = new TextView(this);
            t3v.setText("" + customerDetails.getName());
            t3v.setTextColor(Color.BLACK);
            t3v.setGravity(Gravity.CENTER);
            t3v.setPadding(5, 5, 5, 5);
            tbrow.addView(t3v);
            TextView t4v = new TextView(this);
            t4v.setText("" + customerDetails.getRequested());
            t4v.setTextColor(Color.BLACK);
            t4v.setGravity(Gravity.CENTER);
            t4v.setPadding(5, 5, 5, 5);
            tbrow.addView(t4v);
            final EditText t5v = new EditText(this);
          //  t5v.setHint(0);
            t5v.setId(j);
            t5v.setVisibility(View.INVISIBLE);
            t5v.setTextColor(Color.BLACK);
            t5v.setGravity(Gravity.CENTER);
            t5v.setPadding(5, 5, 5, 5);
            tbrow.addView(t5v);

            tbrow.setBackgroundResource(R.color.colorWhite);

        tbrow.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                TableRow tr1=(TableRow)v;
                TextView tv1= (TextView)tr1.getChildAt(0);
                //Get the integer value of tv1 to make the corresponding edittext to be visible
                t5v.setVisibility(View.VISIBLE);

                Toast.makeText(getApplicationContext(),tv1.getText().toString(),Toast.LENGTH_SHORT).show();

            }
        });
            stk.addView(tbrow);


        }

我在 中发现了类似的问题 Android: Set Edit text or text view id Programmatically 其中,提供的解决方案利用 editText.setId(i),其中 i 是任何整数值。但这对我的情况没有帮助。

您可以在 xml 文件中创建自定义 ID,并使用 setId() 方法设置该 ID。以下是执行此操作的步骤:

1) 在res/values 目录下创建文件ids.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_custom_id" type="id" />
</resources>

2) 然后以编程方式创建视图并设置其 id:

EditText et = new EditText(getContext());
et.setId(R.id.my_custom_id);

这应该可以解决问题。

编辑: 如果您不知道要创建的视图数量并且不能使用来自 xml 文件的 id:

et.setId(View.generateViewId());

generateViewId() 方法为您创建一个随机的唯一 ID。

我按照以下步骤为以编程方式创建的 EditText 设置 ID 并检索在 edittext 中输入的数据。

第 1 步:将 edittext 和 int 变量全局声明为

int idOfEditText;
EditText t5v;

第 2 步:将 editText 的 ID 设置为

 t5v = new EditText(this);
 t5v.setId(Integer.valueOf(j)); //I tried with just j being declared as t5v.setId(j); but it was showing up error with the suggestion as Expected resource of type id in android studio. I have made int variable **j** to loop till list.size() 

第 3 步:使用

获取 table 上点击的行的 ID
 tbrow.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                TableRow tr1=(TableRow)v;
                TextView tv1= (TextView)tr1.getChildAt(0);
                //Get the integer value of tv1 to make the corresponding edittext to be visible
                idOfEditText = Integer.valueOf(tv1.getText().toString());
                t5v = (EditText) findViewById(idOfEditText);

            }
        });

第 4 步:可以通过

检索在 EditText 中输入的数据
t5v = (EditText) findViewById(idOfEditText);
String value = t5v.getText().toString();
Toast.makeText(this, "You entered: "+value, Toast.LENGTH_SHORT).show();