我想實現我的應用程序一個功能,用戶可以添加按鈕,屏幕上,然後用長按刪除的ID。Android的 - 獲取動態生成按鈕
我能夠做到,用戶可以添加按鈕,用戶可以刪除最近添加的按鈕的第一部分。但是,如果您嘗試刪除任何其他按鈕,則會出現NullPointerException。
這裏是我的方法,它創建了一個新的按鈕:
public Button makeButton(Context context, String label, final GestureDetector gdt, int buttonId) {
btn = new Button(context);
v = new TextView(context);
v.setText("");
v.setHeight(10);
ScrollView s = (ScrollView) homeView.findViewById(R.id.mainScroll);
s.setVerticalScrollBarEnabled(false);
btn.setText(label);
btn.setWidth(LinearLayout.LayoutParams.MATCH_PARENT);
btn.setHeight(70);
btn.setId(buttonId);
btn.setBackgroundColor(Color.GREEN);
btn.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
id = btn.getId();
gdt.onTouchEvent(event);
switch(event.getAction()) {
case(MotionEvent.ACTION_DOWN):
ColorDrawable color = (ColorDrawable) btn.getBackground();
int backgroundColor = color.getColor();
if(backgroundColor == Color.GREEN) {
btn.setBackgroundColor(Color.YELLOW);
showToast("Running late??");
}
}
return true;
}
});
Ll.addView(btn);
Ll.addView(v);
return btn;
}
這裏是它是用來創造新的按鈕按鈕onClickListener():
addButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
factory.inflate(R.layout.eventadd, null);
final View addEvent = factory.inflate(R.layout.eventadd, null);
final EditText eventTime = (EditText) addEvent.findViewById(R.id.editText1);
AlertDialog.Builder createEvent = new AlertDialog.Builder(context);
createEvent.setTitle("Add new event");
createEvent.setView(addEvent);
(createEvent).setPositiveButton("Add Event", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
String getTxt = eventTime.getText().toString();
makeButton(context, getTxt, gestureDetector, id);
id++;
}
});
createEvent.show();
}
});
最後,這是我的GestureListener:
private class GestureListener extends SimpleOnGestureListener {
@Override
public void onLongPress(MotionEvent event) {
showToast("Button " + btn.getId() + " deleted");
btn.setVisibility(View.GONE);
((LinearLayout)btn.getParent()).removeViewAt(id);
((LinearLayout)v.getParent()).removeView(v);
}
}
我很確定這個錯誤是關於如何處理id的bu ttons以及它們如何在GestureListener中被刪除。當然,我比所有幫助:)
你在哪裏設置你的GestureListener到你的按鈕? GestureListener如何始終引用正確的v和id字段? – speedynomads
在makeButton方法的onTouch()中(gdt.onTouchEvent(event));這是我認爲可能成爲問題的事情之一。 –