2

我正在尝试在我的应用程序中实现一个功能,用户可以在屏幕上添加按钮,然后长按删除它们。

我能够完成第一部分,用户可以添加按钮,用户可以删除最近添加的按钮。但是,如果您尝试删除任何其他按钮,则会出现 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 以及如何在 GestureListener 中删除它们有关。当然我很可能是错的。感谢所有的帮助:)

4

2 回答 2

4

问题出在您的 GestureListener 中。

您正在执行((LinearLayout)btn.getParent()).removeViewAt(id); 此操作会删除特定索引处的视图。我相信你想要

View view = ((LinearLayout)btn.getParent()).findViewById(id)为您返回一个视图,然后您应该将该视图传递给

((LinearLayout)btn.getParent()).removeView(view);

编辑

看起来您正在为您的Button. 这意味着那里的按钮将始终是您制作的最后一个按钮。在您的onTouch()方法中,您引用了该btn变量,这是您制作的最后一个按钮。如果您将onTouch()方法中的第一行更改为id = v.getId(),它应该会给您正确的按钮。

于 2013-05-31T17:36:26.420 回答
0

使用一堆按钮 id。当您创建按钮时,将其 id 保存在该堆栈中,当您按下删除按钮时,从堆栈中获取最后一个当前 id 并删除按钮 - >然后从堆栈中删除其 id。

于 2013-05-31T20:38:37.430 回答