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 に答える