Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Nachinka
11 / 11 / 0
Регистрация: 19.02.2014
Сообщений: 95
#1

Два действия для одной кнопки - Программирование Android

02.04.2014, 22:46. Просмотров 1026. Ответов 8
Метки нет (Все метки)

Приветствую, форумчане!

Возник вопрос, а можно ли одной кнопке присвоить два действия?)

Допустим, имеется небольшой плеер, две кнопки(Start и Stop)

Как совместить действие этих двух кнопок?)

Java
1
2
3
4
5
6
7
8
9
10
public void onClick(View v) {
        switch (v.getId()) {
        case R.id.Startbutton:
            start();
            break;
        case R.id.Stopbutton:
            stop();
            break;
        }
    }
То есть, не жмякать сначала на старт , а потом на стоп, а только на одну кнопку, которая одновременно делает два действия) Такое вообще возможно?)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
02.04.2014, 22:59     Два действия для одной кнопки #2
ну задайте флаг
Nachinka
11 / 11 / 0
Регистрация: 19.02.2014
Сообщений: 95
02.04.2014, 23:15  [ТС]     Два действия для одной кнопки #3
А можно чуть чуть поподробнее?) Это флаг тот, что с интентом связан?
proech
10 / 10 / 2
Регистрация: 10.07.2013
Сообщений: 150
02.04.2014, 23:27     Два действия для одной кнопки #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
сделай переменную типа bool
при нажатии клавиши переменная изменится c false на true(если начальное значение false)
и присваиваешь действия для true и false

например
так
не факт что заработает так как не проверял)

Java
1
2
3
4
5
6
7
8
9
 boolean answerAboutPlay = false;
......
public void onClick(View v){
if(!answerAboutPlay)
{
answerAboutPlay = true;
Play();
}
else {answerAboutPlay = false;Stop();}
}
Nachinka
11 / 11 / 0
Регистрация: 19.02.2014
Сообщений: 95
03.04.2014, 16:06  [ТС]     Два действия для одной кнопки #5
Да, но если не ошибаюсь у нас же bool false Значит сразу же начнется выполняться вот эта часть:

else {answerAboutPlay = false; Stop(); }
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
03.04.2014, 16:17     Два действия для одной кнопки #6
Java
1
if(!answerAboutPlay)
там есть оператор инверсии
учите синтаксис
Nachinka
11 / 11 / 0
Регистрация: 19.02.2014
Сообщений: 95
03.04.2014, 20:07  [ТС]     Два действия для одной кнопки #7
Что-то вот так у меня не заработало...Может кто знает в чем ошибка?)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    start_button = (Button) findViewById(R.id.button1);
    start_button.setOnClickListener(this);
    createAudioRecorder();
   }
 
     public void onClick(View v) {
       if (!RecordPlay) {
            RecordPlay = true;
            reading = true;
            startPlay();
        } else {
            RecordPlay = false;
            reading = false;
            stopPlay();
        }
        }
В методах же вот такая штучка:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void startPlay() {
 audioRecord.startRecording();
  while (reading) {
    //Читаем звук
  }
}
 
private void stopPlay() {
 if (null != audioRecord) {
   reading = false;
            audioRecord.stop();
            audioRecord.release();
 }
}
Почему то подсвечивает audioRecord.startRecording(); , дескать NullPointerException

Почему вот только, вроде все хорошо...

Добавлено через 7 минут
Первый раз он все пропускает хорошо, а вот потом нет..
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
03.04.2014, 21:07     Два действия для одной кнопки #8
плохо обьясняете, но попробую догадаться....
audioRecord должен быть глобальной переменной вне процедур. Возможно startPlay просто его не видит...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2014, 18:37     Два действия для одной кнопки
Еще ссылки по теме:
Изменение размера текста кнопки вместе с размером самой кнопки? Android
Оформление кнопки: отследить, вмещается ли текст в размеры кнопки Android
Определить нажатие кнопки Home и кнопки сворачивания приложения Android
TableLayout. Кнопки получаются разных размеров (кнопки-картинки) Android
Нужно назначить OnClickListener для кнопки тот в котором она создается Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nachinka
11 / 11 / 0
Регистрация: 19.02.2014
Сообщений: 95
04.04.2014, 18:37  [ТС]     Два действия для одной кнопки #9
Tester64, она вроде итак глобальна...

Вот кодец ввода с микрофона:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
 
public class MainActivity extends Activity implements OnClickListener {
 
    Button start_button;
    Button stop_button;
    boolean reading = false;
    final String TAG = "TAG";
    int myBufferSize = 8192;
    AudioRecord audioRecord;
    private Thread recordingThread = null;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        start_button = (Button) findViewById(R.id.button1);
        stop_button = (Button) findViewById(R.id.button2);
        start_button.setOnClickListener(this);
        stop_button.setOnClickListener(this);
        createAudioRecorder();
    }
 
    private void createAudioRecorder() {
        int sampleRate = 16000;
        int channelConfig = AudioFormat.CHANNEL_IN_MONO;
        int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
 
        int minInternalBufferSize = AudioRecord.getMinBufferSize(sampleRate,
                channelConfig, audioFormat);
        int internalBufferSize = minInternalBufferSize * 4;
        Log.d(TAG, "minInternalBufferSize = " + minInternalBufferSize
                + ", internalBufferSize = " + internalBufferSize
                + ", myBufferSize = " + myBufferSize);
 
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                sampleRate, channelConfig, audioFormat, internalBufferSize);
    }
 
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1:
            Log.d(TAG, "record start");
            reading = true;
            startRecorder();
            break;
        case R.id.button2:
            Log.d(TAG, "stop recorder");
            reading = false;
            stopRecorder();
            break;
        }
    }
 
    private void startRecorder() {
        recordingThread = new Thread(new Runnable() {
            @Override
            public void run() {
                AudioData();
            }
        }, "AudioRecorder Thread");
 
        recordingThread.start();
    }
 
    protected void AudioData() {
        audioRecord.startRecording();
        byte data[] = new byte[myBufferSize];
        byte[] myBuffer = new byte[myBufferSize];
        int readCount = 0;
        int totalCount = 0;
        while (reading) {
            readCount = audioRecord.read(myBuffer, 0, myBufferSize);
            data = myBuffer;
            totalCount += readCount;
        }
    }
 
    private void stopRecorder() {
        if (null != audioRecord) {
            reading = false;
            audioRecord.stop();
            audioRecord.release();
            audioRecord = null;
            recordingThread = null;
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}
Я думаю что-то с созданием самого рекордера...

Добавлено через 20 часов 17 минут
Забыл, что выложил просто код, без изменений, вот и они:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
 
public class MainActivity extends Activity implements OnClickListener {
 
    Button start_button;
    boolean reading = false;
    final String TAG = "TAG";
    int myBufferSize = 8192;
    AudioRecord audioRecord;
    private Thread recordingThread = null;
    boolean RecordPlay = false;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        start_button = (Button) findViewById(R.id.button1);
        start_button.setOnClickListener(this);
        createAudioRecorder();
    }
 
    private void createAudioRecorder() {
        int sampleRate = 16000;
        int channelConfig = AudioFormat.CHANNEL_IN_MONO;
        int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
 
        int minInternalBufferSize = AudioRecord.getMinBufferSize(sampleRate,
                channelConfig, audioFormat);
        int internalBufferSize = minInternalBufferSize * 4;
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                sampleRate, channelConfig, audioFormat, internalBufferSize);
    }
 
    @Override
    public void onClick(View v) {
        if (!RecordPlay) {
            RecordPlay = true;
            reading = true;
            startRecorder();
            Log.d(TAG, "start");
        } else {
            RecordPlay = false;
            reading = false;
            stopRecorder();
            Log.d(TAG, "stop");
        }
 
    }
 
    private void startRecorder() {
        recordingThread = new Thread(new Runnable() {
            @Override
            public void run() {
                AudioData();
            }
        }, "AudioRecorder Thread");
        recordingThread.start();
    }
 
    protected void AudioData() {
        audioRecord.startRecording();
        byte[] data = new byte[myBufferSize];
        byte[] myBuffer = new byte[myBufferSize];
        int readCount = 0;
        int totalCount = 0;
        while (reading) {
            readCount = audioRecord.read(myBuffer, 0, myBufferSize);
            data = myBuffer;
            totalCount += readCount;
        }
    }
 
    private void stopRecorder() {
        if (null != audioRecord) {
            reading = false;
            audioRecord.stop();
            audioRecord.release();
            audioRecord = null;
            recordingThread = null;
        }
 
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}
Где же тут ошибочка.. Кстати, логи выдают, что вот тута: audioRecord.startRecording();
Yandex
Объявления
04.04.2014, 18:37     Два действия для одной кнопки
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru