Почему это действие вызывается несколько раз между намерениями

avatar
Ravish Jha
1 июля 2021 в 20:33
66
0
0

У меня два занятия; один — IntermediateActivity, а другой — активность DragAndDrop. IntermediateActivity имеет 5-секундный таймер, а переменная visitcount увеличивается при каждом открытии IntermediateActivity. По истечении таймера открывается действие DragAndDrop, в котором пользователь должен перетащить круг в нужное положение, и когда пользователь может это сделать, я запускаю намерение, которое снова открывает IntermediateActivity.

При запуске DragAndDrop при открытии IntermediateActivity количество посещений увеличивается на 2 вместо одного.

Вот как я вызываю намерение для IntermediateActivity в DragAndDrop Activity :

public class DragAndDrop extends AppCompatActivity implements View.OnTouchListener{
    private ImageView img;
    private ImageView img_outline;
    private ViewGroup rootLayout;
    private int _xDelta;
    private int _yDelta;

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        List<Integer> givenList = Arrays.asList(0, 1, 2, 3);
        Random rand = new Random();
        int randomElement = givenList.get(rand.nextInt(givenList.size()));

        // Randomise location of Circle
        switch (randomElement){

            case 0:
                setContentView(R.layout.bottom_left);
                rootLayout = (ViewGroup) findViewById(R.id.bottom_left_layout);
                img = (ImageView) rootLayout.findViewById(R.id.circle_bottomLeft);
                img_outline = findViewById(R.id.circle_outline_bottomLeft);
                break;
            case 1:
                setContentView(R.layout.bottom_right);
                rootLayout = (ViewGroup) findViewById(R.id.bottom_right_layout);
                img = (ImageView) rootLayout.findViewById(R.id.circle_bottomRight);
                img_outline = findViewById(R.id.circle_outline_bottomRight);

                break;
            case 2:
                setContentView(R.layout.top_left);
                rootLayout = (ViewGroup) findViewById(R.id.top_left_layout);
                img = (ImageView) rootLayout.findViewById(R.id.circle_topleft);
                img_outline = findViewById(R.id.circle_outline_topleft);

                break;
            case 3:
                setContentView(R.layout.top_right);
                rootLayout = (ViewGroup) findViewById(R.id.top_right_layout);
                img = (ImageView) rootLayout.findViewById(R.id.circle_topRight);
                img_outline = findViewById(R.id.circle_outline_topRight);

                break;
        }



        img.setOnTouchListener(this);


    }

     public void check_success(){

        float centreX = img.getX() + img.getWidth()  / 2;
        float centreY = img.getY() + img.getHeight() / 2;
        float centreX_outline = img_outline.getX() + img_outline.getWidth()  / 2;
        float centreY_outline = img_outline.getY() + img_outline.getHeight() / 2;

        // Location Range for 150 x 150dp square with center = center of outline

        if((centreX >= centreX_outline-75) &&(centreX <= centreX_outline+75)
                && (centreY >= centreY_outline-75) &&(centreY <= centreY_outline+75)){

            // Vibrate
            Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                v.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
            } else {
                v.vibrate(500);
            }

            // Start Intermediate Activity

            Intent i = new Intent(DragAndDrop.this, IntermediateActivity.class);
            startActivity(i);

        }
    }




        public boolean onTouch(View view, MotionEvent event) {
            check_success();

            final int X = (int) event.getRawX();
            final int Y = (int) event.getRawY();
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                    _xDelta = X - lParams.leftMargin;
                    _yDelta = Y - lParams.topMargin;
                    break;
                case MotionEvent.ACTION_UP:
                    break;
                case MotionEvent.ACTION_POINTER_DOWN:
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    break;
                case MotionEvent.ACTION_MOVE:

                    //Drag Functionality
                    ViewGroup.MarginLayoutParams marginParams = new ViewGroup.MarginLayoutParams(img.getLayoutParams());
                    int left = (int) event.getRawX() - (view.getWidth() / 2);
                    int top = (int) event.getRawY() - (view.getHeight());
                    marginParams.setMargins(left, top, 0, 0);
                    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
                    img.setLayoutParams(layoutParams);
                    break;
            }
            rootLayout.invalidate();
            return true;

        }

}

А вот код для IntermediateActivity, в котором переменнаяvisitCount отслеживает количество вызовов активности:

private TextView footer_text;
    private TextView timer_text;
    public int timer_counter;
    static int visitCount = 0;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.intermediate_screen);

        timer_text = findViewById(R.id.timer);
        footer_text = findViewById(R.id.footer);

        timer_counter = 5;
        Resources resource = getResources();
        if (resource.getConfiguration().locale.getLanguage() == "hi") {
            footer_text.setText("कार्य की पूर्णता : " + String.valueOf(visitCount) + "/30");
        } else {
            footer_text.setText("Tasks completed: " + String.valueOf(visitCount) + "/30");
        }
        visitCount++;
        if (visitCount == 31) {
            visitCount = 0;
            Intent k = new Intent(IntermediateActivity.this, MainActivity.class);
            startActivity(k);
        } else {


            new CountDownTimer(5000, 1000) {
                @Override
                public void onTick(long millisUntilFinished) {
                    timer_text.setText(String.valueOf(timer_counter));
                    timer_counter--;
                }

                @Override
                public void onFinish() {
                
                        i = new Intent(IntermediateActivity.this, DragAndDrop.class);
                        startActivity(i);

            }
        }.start();
    }
}

Я пытался просмотреть код несколько раз, но не мог понять, почему счетчик увеличивается несколько раз, даже если намерение отправляется только один раз.

Источник
Wilson Castiblanco
2 июля 2021 в 16:08
0

Это кажется более вероятным для onTouch(), который вызывает несколько раз check_success(), и некоторые из этих событий вызывают многократное выполнение действия, даже если оно уже открыто. Вы пытались переместить check_success() в другое место?

Ravish Jha
2 июля 2021 в 16:11
0

Мне нужно check_success(), чтобы постоянно проверять, находится ли круг в желаемом положении или нет, где еще я могу его разместить, чтобы сделать это?

Wilson Castiblanco
2 июля 2021 в 16:13
0

Кроме того, вы можете попробовать добавить launchMode в свой манифест для IntermediateActivity, например singleInstance или singleTop, возможно, последний может стереть счетчик, также вы можете использовать общие настройки для сохранения счетчика.

Wilson Castiblanco
2 июля 2021 в 16:28
1

Глядя на код, вы можете переместить check_success() внутрь ACTION_UP, то есть когда пользователь перестанет касаться, а Круг уже был перемещен.

Ravish Jha
2 июля 2021 в 16:52
1

Это работает, большое спасибо!! Я также попытаюсь интегрировать ваши предыдущие предложения, еще раз спасибо!

Wilson Castiblanco
2 июля 2021 в 18:37
0

Красиво, рад помочь :)

Ответы (0)