работа с кнопками

Ответить
murhub
Сообщения: 3
Зарегистрирован: 11 мар 2016, 12:22

работа с кнопками

Сообщение murhub » 11 мар 2016, 14:08

Здраствуйте

Программа будет отсылать по блютуз цифры от 1 до 8
для включения релюшек

код для блютуза я еше в нем не разобрался
а вот тут есть вопрос

мне надо чтобы когда нажата к примеру кнопка 1 то она отправилась
и если кнопка дальше будет нажата то ничего не происходило бы
если кнопку отпустили то через к примеру 400 миллисекунд отправилась 9.
пока просто пытаюсь тут кнопки задействовать в таком режиме

я уже и на микроконтроллере пыталься это сделать но пришел к выводу что с телефона было бы лучше

обьясните хотябы какои должен быть алгоритм а то я уже голову сломал
точнее алгоритм имено удержания кнопки какой

извините за отсутствие грамматики :oops:

Код: Выделить всё

package com.example.admin.bt_win_up_down;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView textView;
    Button button1, button2,button3,button4,button5,button6,button7,button8;

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

        textView = (TextView)findViewById(R.id.textView);
        button1 = (Button)findViewById(R.id.button1);
        button2 = (Button)findViewById(R.id.button2);
        button3 = (Button)findViewById(R.id.button3);
        button4 = (Button)findViewById(R.id.button4);
        button5 = (Button)findViewById(R.id.button5);
        button6 = (Button)findViewById(R.id.button6);
        button7 = (Button)findViewById(R.id.button7);
        button8 = (Button)findViewById(R.id.button8);

        int i = 0;
        while (i < 10) {


            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textView.setText("нажата кнопка 1");
                }
            });

            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textView.setText("нажата кнопка 2");
                }
            });

            button3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textView.setText("нажата кнопка 3");
                }
            });

            button4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textView.setText("нажата кнопка 4");
                }
            });

            button5.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textView.setText("нажата кнопка 5");
                }
            });

            button6.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textView.setText("нажата кнопка 6");
                }
            });

            button7.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textView.setText("нажата кнопка 7");
                }
            });

            button8.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textView.setText("нажата кнопка 8");
                }
            });
            i++;
        }
        textView.setText("не нажаты кнопки");

    }
}

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: работа с кнопками

Сообщение math64 » 11 мар 2016, 15:19

Вот работа с bluetooth:
[syntax=java]
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter == null) {
Toast.makeText(this, R.string.bluetooth_not_available, Toast.LENGTH_LONG).show();
finish();
return;
}

setContentView(R.layout.activity_main);
...
}
@Override
protected void onStart() {
super.onStart();

if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
} else {
initialize();
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_ENABLE_BT:
if (resultCode == Activity.RESULT_OK) {
initialize();
} else {
finish();
return;
}
}
}

private void initialize() {
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
BluetoothSocket socket = null;
try {
socket = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.e(TAG, "Socket creation failed.", e);
finish();
return;
}
mBluetoothAdapter.cancelDiscovery();
Log.d(TAG, "cancelDiscovery");
try {
socket.connect();
Log.d(TAG, "BT connection established, data transfer link open.");
} catch (IOException e) {
Log.e(TAG, "BT connection failure", e);
try {
socket.close();
} catch (IOException e2) {
Log.e(TAG, "Unable to close socket during connection failure", e2);
}
finish();
return;
}
mHandler = new BTHandler();
mThread = new BTThread(socket);
mThread.start();

Log.d(TAG, "send test message");
try {
mThread.write(testMessage);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
}

@Override
protected void onDestroy() {
super.onDestroy();
if (mThread != null)
mThread.cancel();
}

class BTThread extends Thread {
private BluetoothSocket btSocket = null;
private OutputStream outStream = null;
private InputStream inStream = null;
private boolean mCancel = false;

public BTThread(BluetoothSocket socket) {
btSocket = socket;
try {
inStream = socket.getInputStream();
outStream = socket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "temp sockets not created", e);
}
}

public void cancel() {
if (outStream != null) {
try {
outStream.flush();
} catch (IOException e) {
Log.e(TAG, "ON PAUSE: Couldn't flush output stream.", e);
}
outStream = null;
}

if (inStream != null) {
try {
inStream.close();
} catch (IOException e) {
Log.e(TAG, "ON PAUSE: Couldn't flush output stream.", e);
}
inStream = null;
}

if (btSocket != null) {
try {
btSocket.close();
} catch (IOException e2) {
Log.e(TAG, "ON PAUSE: Unable to close socket.", e2);
}
btSocket = null;
}
mCancel = true;
}

public void write(byte[] buffer) throws IOException {
outStream.write(buffer);
}

@Override
public void run() {
byte[] buffer = new byte[1024];
int bytes;

while (!mCancel) {
try {
bytes = inStream.read(buffer);
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();
} catch (IOException e) {
break;
}
}
}
}

class BTHandler extends Handler {

@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_READ:
Log.d(TAG, "message read");
byte[] readBuf = (byte[]) msg.obj;
...
break;

default:
break;
}
}
}
[/syntax]

murhub
Сообщения: 3
Зарегистрирован: 11 мар 2016, 12:22

Re: работа с кнопками

Сообщение murhub » 11 мар 2016, 15:37

извиняюсь за вопрос
на сколько я понял это код для работы с блютузом
это у меня пока на втором плане
у меня есть его код
я вообще мучаюсь с нажатием кнопок

Аватара пользователя
An-droid
Сообщения: 51
Зарегистрирован: 25 авг 2015, 10:54

Re: работа с кнопками

Сообщение An-droid » 11 мар 2016, 22:22

Нужно использовать onTouch слушатель. Он слушает прикосновения.
В вашем случае
чтобы когда нажата к примеру кнопка 1 то она отправилась
и если кнопка дальше будет нажата то ничего не происходило бы
если кнопку отпустили то через к примеру 400 миллисекунд отправилась 9.
я написал вам отправку сообщения 1 и отправку сообщения 9 через 400 миллисекунд

Код: Выделить всё

Button button1 = (Button)findViewById(R.id.button1);
        button1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                
                if (event.getAction() == MotionEvent.ACTION_DOWN) { //нажали вниз
                    //тут метод отправки сообщения 1
                } 
                if (event.getAction() == MotionEvent.ACTION_UP) { //отпустили нажатие
                    
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            //тут метод отправки сообщения 9
                        }
                    }, 400); //запуск отправки сообщения 9 через 400 миллисекунд
                    
                }
                
                return true; //возвращаем true, что значит, что мы обработали touch самостоятельно
            }
        });
Изображение

murhub
Сообщения: 3
Зарегистрирован: 11 мар 2016, 12:22

Re: работа с кнопками

Сообщение murhub » 11 мар 2016, 23:29

An-droid писал(а):Нужно использовать onTouch слушатель. Он слушает прикосновения.
В вашем случае
чтобы когда нажата к примеру кнопка 1 то она отправилась
и если кнопка дальше будет нажата то ничего не происходило бы
если кнопку отпустили то через к примеру 400 миллисекунд отправилась 9.
я написал вам отправку сообщения 1 и отправку сообщения 9 через 400 миллисекунд

Код: Выделить всё

Button button1 = (Button)findViewById(R.id.button1);
        button1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                
                if (event.getAction() == MotionEvent.ACTION_DOWN) { //нажали вниз
                    //тут метод отправки сообщения 1
                } 
                if (event.getAction() == MotionEvent.ACTION_UP) { //отпустили нажатие
                    
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            //тут метод отправки сообщения 9
                        }
                    }, 400); //запуск отправки сообщения 9 через 400 миллисекунд
                    
                }
                
                return true; //возвращаем true, что значит, что мы обработали touch самостоятельно
            }
        });

Спасибо огромное я убрал ожидание вообще оставил тока 2 ифа и все супер
если очень будет надо поставлю ожидание на контроллере
спс

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: работа с кнопками

Сообщение math64 » 12 мар 2016, 10:51

Вот мой код нажатия кнопки с автоповтором:
[syntax=java]
private Handler handler = new Handler();
private int period = 400;
private View repeatView;
private int downDuration;

public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
if (action == MotionEvent.ACTION_DOWN) {
Log.i("Repeat", "ACTION_DOWN");
downDuration = 0;
repeatView = view;
// onClick(view);
handler.removeCallbacks(this);
handler.postDelayed(this, period);
} else if (action == MotionEvent.ACTION_UP) {
Log.i("Repeat", "ACTION_UP");
handler.removeCallbacks(this);
}
return false;
}

public void run() {
downDuration += period;
onClick(repeatView);
handler.postDelayed(this, period);
}
[/syntax]
Примечание:
handler - поле MainActivity. При отпускании кпопки нужно вызвать handler.removeCallbacks(this); чтобы отменить запланированное событие по таймеру. Кроме того, нечего мусорить и создавать каждый раз новый Handler - его можно использовать по второму разу. По той же причине MainActivity implements Runnable. Но если действие на разных кнопках будет отличаться или можно нажимать двумя пальцами одновременно две кнопки (у меня нажатая кнопка запоминается в repeatView) - придётся делать new Runnable() { ... }; и создавать свой Handler для каждой кнопки.

Аватара пользователя
An-droid
Сообщения: 51
Зарегистрирован: 25 авг 2015, 10:54

Re: работа с кнопками

Сообщение An-droid » 17 мар 2016, 13:39

Спасибо за поправку.
С хендлером у меня небольшие не понимания, я пока не умею их многократно использовать и добавлять/удалять коллбеки. Можете внятно разжевать тему или дать хороший линк на прочтение?
Изображение

masta
Сообщения: 12
Зарегистрирован: 05 авг 2014, 16:34

Re: работа с кнопками

Сообщение masta » 07 май 2016, 19:30

Добрый день, тоже делаю управление по блютуз, но у меня другой вопрос, мне необходимо вести лог нажатий и выводить его на экран.
То есть у меня на экране 4 кнопки, при нажатии любой из них хочу выводить на экран соотвествующую цифру. Подскажите пожалуйста как это сделать.

P.S вопрос снят, разобрался.

Ответить