Страница 1 из 1

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

Добавлено: 11 мар 2016, 14:08
murhub
Здраствуйте

Программа будет отсылать по блютуз цифры от 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("не нажаты кнопки");

    }
}

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

Добавлено: 11 мар 2016, 15:19
math64
Вот работа с 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]

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

Добавлено: 11 мар 2016, 15:37
murhub
извиняюсь за вопрос
на сколько я понял это код для работы с блютузом
это у меня пока на втором плане
у меня есть его код
я вообще мучаюсь с нажатием кнопок

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

Добавлено: 11 мар 2016, 22:22
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 самостоятельно
            }
        });

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

Добавлено: 11 мар 2016, 23:29
murhub
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 ифа и все супер
если очень будет надо поставлю ожидание на контроллере
спс

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

Добавлено: 12 мар 2016, 10:51
math64
Вот мой код нажатия кнопки с автоповтором:
[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 для каждой кнопки.

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

Добавлено: 17 мар 2016, 13:39
An-droid
Спасибо за поправку.
С хендлером у меня небольшие не понимания, я пока не умею их многократно использовать и добавлять/удалять коллбеки. Можете внятно разжевать тему или дать хороший линк на прочтение?

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

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

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