Android动态RelativeLayout彼此重叠
问题描述:
我使用此代码通过buttonClick事件从我的数据库动态打印虚值。
用于删除数据库条目的buttonClick事件存在于循环中。Android动态RelativeLayout彼此重叠
这里我的代码:
RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLayout3);
final DatabaseHandler dbpin = new DatabaseHandler(this);
// Log.d("Reading: ", "Reading all tasks..");
List<Detail> detail1 = dbpin.getAllDetail();
Button[] button=new Button[1000];
for (Detail cn : detail1) {
String log = cn.getTitle();
final int i = cn.getID();
button[i] = new Button(this);
button[i].setText("Delete");
button[i].setTextSize(10);
button[i].setId(2000 + i);
int width = 80;
int height = 60;
TextView textview = new TextView(this);
textview.setText(log);
textview.setWidth(200);
textview.setTextSize(20);
textview.setPadding(0, 10, 0, 0);
textview.setId(2000 + i);
if (i == 0) {
RelativeLayout.LayoutParams rlp2 = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.FILL_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
rlp2.addRule(RelativeLayout.ALIGN_PARENT_TOP);
rlp2.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
textview.setLayoutParams(rlp2);
rl.addView(textview);
RelativeLayout.LayoutParams rlp1 = new RelativeLayout.LayoutParams(
width, height);
rlp1.addRule(RelativeLayout.ALIGN_PARENT_TOP);
rlp1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
button[i].setLayoutParams(rlp1);
rl.addView(button[i]);
} else {
RelativeLayout.LayoutParams rlp2 = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.FILL_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
rlp2.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
rlp2.addRule(RelativeLayout.BELOW, button[i].getId() - 1);
textview.setLayoutParams(rlp2);
rl.addView(textview);
RelativeLayout.LayoutParams rlp1 = new RelativeLayout.LayoutParams(
width, height);
rlp1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rlp1.addRule(RelativeLayout.BELOW, button[i].getId() - 1);
button[i].setLayoutParams(rlp1);
rl.addView(button[i]);
}
button[i].setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
Intent myIntent = new Intent(v.getContext(), details.class);
Detail detail = new Detail();
detail.setID(i);
dbpin.deleteDetail(detail);
startActivityForResult(myIntent, 1);
}
});
}
继数据库处理程序代码,检索使用循环从数据库中的所有细节:
// Getting All detail
public List<Detail> getAllDetail() {
List<Detail> detailList = new ArrayList<Detail>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_DETAIL;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Detail detail = new Detail();
detail.setID(Integer.parseInt(cursor.getString(0)));
detail.setTitle(cursor.getString(1));
detail.setDetail(cursor.getString(2));
// Adding contact to list
detailList.add(detail);
} while (cursor.moveToNext());
}
// return contact list
return detailList;
}
// Deleting single detail
public void deleteDetail(Detail detail) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_DETAIL, KEY_DETID + " = ?",
new String[] { String.valueOf(detail.getID()) });
db.close();
}
起初的布局是正常的。删除第一个或最后一个数据行不会导致任何更改,但是如果中间的一行被删除,则布局会相互重叠。
请给我建议,以清除这个逻辑错误。
答
好吧,我已经理解你的问题。问题在于,您正在使用相对布局作为您的父布局,并在其中添加您的所有与子相关的布局。现在,如果您删除了第一个相对布局,那么它会自动与其父级对齐,这样就没有问题了。
如果删除最后一个相对布局,那么也不会出现问题。
现在,您已将所有相对布局对齐到上面的布局,所以如果删除上面的布局,它会自动对齐其父级。
解决方法很简单。将您的父级布局用作线性布局,以便您不需要将相对布局与其上面的布局对齐。它会自动安排在一个线性的方式....
RelativeLayout rl =(RelativeLayout)findViewById(R.id.relativeLayout3);在xml文件中将此布局转换为linearlayout。
这的代码,它可以帮助你:从这里
RelativeLayout rl = new RelativeLayout(getApplicationContext());
RelativeLayout.LayoutParams lp_btn = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
lp_btn.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
Button temp_button = new Button(getApplicationContext());
temp_button.setText("button");
rl.addView(temp_button, lp_btn);
TextView tv = new TextView(getApplicationContext());
tv.setText("bharat");
tv.setBackgroundColor(Color.GREEN);
RelativeLayout.LayoutParams lp_tv = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
lp_tv.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rl.addView(tv, lp_tv);
lp.addView(rl);
// for循环将在这里结束
我认为你应该使用的ListView
LinearLayout lp = (LinearLayout) findViewById(R.id.LinearLayout1);
// for循环的开始为了你的目的,它会更好。无论如何,这也将工作,你必须为你的目的管理relativelayout数组和按钮数组。
谢谢..得到了解决方案..但这使得像这样的布局..在textview下面的按钮...但我想要并排。 – 2012-04-17 06:01:35
为您可以创建简单的child relativelayout添加您的按钮和在他们的textview,然后将其添加到线性布局它会减少你的工作,如果你想删除一行,那么你可以完全删除相对布局。你有没有明白或者我应该向你发送一些小小的代码... – 2012-04-17 06:07:28
对不起..我对android很陌生..你能否建议我如何实现这个.. – 2012-04-17 06:12:47