我正在以编程方式创建一个混合了 TextView 和 EditText 的动态 TableLayout。该 TextView 是从应用程序的 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);
}
我在 How to Set Id in EditText programmatically in Android 中发现了类似的问题 和 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) 然后以编程方式创建 View 并设置其 id:
EditText et = new EditText(getContext());
et.setId(R.id.my_custom_id);
这应该可以解决问题。
编辑:如果您不知道要创建的 View 数量并且无法使用 xml 文件中的 id,您还可以执行以下操作:
et.setId(View.generateViewId());
generateViewId()
方法为您创建一个随机的唯一 ID。
关于android - 如何在 android 中动态创建的 TableLayout 中设置 EditText 列表的 Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43931332/