마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

버튼을 눌렀을때 계속 반복하게 하는 방법좀 알려주세요!!

0 추천
package com.example.record;

import android.app.Activity;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Tab1Activity extends Activity implements SensorEventListener {

	static EditText vi,kcal,meter;
	TextView text3,kcal2,meter2;
	int count=0,kcal0=0,i;
	String str = String.format("%d",count);
	String str2 = String.format("%d",kcal0);
    private long lastTime;
    private float speed;
    private float lastX;
    private float lastY;
    private float lastZ;
    private float x, y, z;
    private static final int SHAKE_THRESHOLD = 800;
    @SuppressWarnings("deprecation")
    private static final int DATA_X = SensorManager.DATA_X;
    @SuppressWarnings("deprecation")
	private static final int DATA_Y = SensorManager.DATA_Y;
    @SuppressWarnings("deprecation")
	private static final int DATA_Z = SensorManager.DATA_Z;
    private SensorManager sensorManager;
    private Sensor accelerormeterSensor;
    Button btn_reset;
    Button btn_start;
    Intent intent;
	private boolean isEnable;
  
  

    public void onCreate(Bundle savedInstanceState) {
    	setContentView(R.layout.activity_record);
    	vi = (EditText)findViewById(R.id.tv);
    	kcal=(EditText)findViewById(R.id.kcal);
    	meter=(EditText)findViewById(R.id.meter);
    	kcal2=(TextView)findViewById(R.id.kcal2);
    	meter2=(TextView)findViewById(R.id.meter2);
    	text3 = (TextView)findViewById(R.id.textView3);
    	text3.setVisibility(android.view.View.VISIBLE);
    	vi.setVisibility(android.view.View.VISIBLE);
    	kcal.setVisibility(android.view.View.VISIBLE);
    	kcal2.setVisibility(android.view.View.VISIBLE);
    	meter.setVisibility(android.view.View.VISIBLE);
    	meter2.setVisibility(android.view.View.VISIBLE);
    	vi.setText(str);
    	kcal.setText(str2);
    	
    	
    	
    	super.onCreate(savedInstanceState);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        accelerormeterSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        
        btn_start=(Button)findViewById(R.id.btn_start);
        btn_reset=(Button)findViewById(R.id.btn_reset);
        btn_start.setVisibility(android.view.View.VISIBLE);
    	btn_reset.setVisibility(android.view.View.VISIBLE);
    	    	  	
         	    	
    	btn_start.setOnClickListener(new View.OnClickListener() {
     	    		
			public void onClick(View v) {
				isEnable=!isEnable;
				btn_start.setText("중단")	;
				btn_start.setOnClickListener(new View.OnClickListener() {
					
					public void onClick(View v) {
						btn_start.setText("시작");
						onStop();
					}
				});
				
			}
			
		});
    	   	
        btn_reset.setOnClickListener(new View.OnClickListener() {
        	
        	public void onClick(View v) {
        		
        		count=0;
        		vi.setText(String.valueOf(count));	
        		kcal0=0;
        		kcal.setText(String.valueOf(kcal0));
        		
        	}
        });
                    
            }   

    @Override

    public void onStart() {
        super.onStart();
        if (accelerormeterSensor != null)
           sensorManager.registerListener(this, accelerormeterSensor,
           SensorManager.SENSOR_DELAY_GAME);
    }

   
    @Override

    public void onStop() {
        super.onStop();
        if (sensorManager != null)
            sensorManager.unregisterListener(this);
    }

   

   public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

   
    @SuppressWarnings("deprecation")
	public void onSensorChanged(final SensorEvent event) {
    	if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
    		final long currentTime=System.currentTimeMillis();
    		final long gabOfTime=(currentTime-lastTime);
    	  	
        if(gabOfTime>100){
        	lastTime=currentTime;
        	 x = event.values[SensorManager.DATA_X];
             y = event.values[SensorManager.DATA_Y];
             z = event.values[SensorManager.DATA_Z];
             speed = Math.abs(x+y+z-lastX-lastY-lastZ)/gabOfTime * 10000;
             
     	
         if (isEnable && speed > SHAKE_THRESHOLD) {
        	 count++;
        	 str=String.format("%d",count);
        	 vi.setText(str);
        	 kcal0=(count/30);
        	 str2=String.format("%d",kcal0);
        	 kcal.setText(str2); 
         }
                lastX = event.values[DATA_X];
                lastY = event.values[DATA_Y];
                lastZ = event.values[DATA_Z];

            	
    
    }  
     }
      }
       }  

만보기 어플인데 현재 btn_start를 누르기전에는 작동을 안하다가 누르면 숫자가 증가합니다.그러다가 다시 누르면 텍스트가 시작으로 바뀌면서 작동을 안하는데요. 이걸 다시 누르면 전에 숫자부터 시작해서 작동시켰다가 다시 누르면 멈추고 이런식으로 반복시키고싶은데 for문도 안먹히고.... 다른게 필요한가요? 도와주세요ㅠㅠ 

대학생 (200 포인트) 님이 2013년 11월 30일 질문

1개의 답변

0 추천
뭔가 복잡한데, 간단히 그림을 그려 정리를 해보는게 좋을거같습니다.

 

1. start버튼을 누르기 전이나 정지시 작동을 하지 않는다.(isStart = false)

2. start버튼을 누를 시 만보기가 시작된다. (isStart = true로 변경)

3. 흔들림 발생 시 카운트 +1을 해준다.(isStart == true 일 경우에만 카운트+1)

 

이런식이라면

start 버튼의 리스너에는 isStart = true

stop 버튼의 리스너에는 isStart = false

onSensorChange 안에는 if(isStart == true) count++;

를 해주시면 될거같은데요..

 

일단 btn_start 리스너안에 onStop을 호출하시면 안되요..

onStop은 Activity의 생명주기중에 하나이기 때문에 직접 호출하시면 안되요..

그리고 btn_start 리스너 안에 다시 btn_start 리스너를 호출하고 계신데,

리스너 안에서 다시 리스너를 만드는건 좋지 않은 패턴입니다..

저렇게 되면 무한 반복하지 않나요? 어플 뻗을거같은데..

 

만일 버튼을 눌렀을 때, 무언가를 무한반복하길 원한다면..

일정한 시간 뒤에 호출을 할 수 있는 timer나 handler.postDelay 함수를 써서 메서드를 재귀해서 호출할 수가 있어요..

 

일단 님이 하고자하는건 무한 반복이 아니라, 만보기라면 흔들릴때마다 카운트+1를 해주는 거기 때문에,

단지 start버튼을 눌렀을때만 흔들릴때 +1을 해주면 되기 때문에 boolean값만 넣어주면 될거같네요.
기초개발자 (24,060 포인트) 님이 2013년 11월 30일 답변
...