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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
#1

CallBack - Android

23.10.2013, 22:29. Просмотров 1623. Ответов 19
Метки нет (Все метки)

Можно ли в андроиде создать свои CallBack функции?
Если можно, то киньте какой нибудь пример на одном активити и классе потомке.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
23.10.2013, 23:48     CallBack #2
Возможно поможет...
Создать свой "реактор"
(когда-то задал вопрос, но руки не дошли проверить - пока "выкрутился" другими подходами)
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
24.10.2013, 10:19  [ТС]     CallBack #3
Цитата Сообщение от YuraAAA Посмотреть сообщение
расширяем стандартный тач
Java
1
2
3
public interface IMultiTouchListener  extends View.OnTouchListener{
    void OnMultiTouch(View view, MotionEvent motionEvent);
}
реализуем

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yourView.setOnTouchListener(new IMultiTouchListener() {
            @Override
            public void OnMultiTouch(View view, MotionEvent motionEvent) {
 
            }
 
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (someevent) {
OnMultiTouch(view, motionEvent);
                return false;}
else {
return true;
}
            }
        });
Или я не так понял?

Добавлено через 1 минуту

Java
1
.... extends Activity implements IMultiTouchListener
А можете разжевать что куда и откуда.
Я предполагаю что в данном примере просто заменяется стандартный обработчик своим..

Добавлено через 10 минут
Немного распишу проблему появившуюся у меня:
Пишу приложение с большим количеством активити. Каждое активити это часть древовидного меню. В каждом активити есть некоторое кол-во кнопок (ID кнопок для всех активити одинаковые). В в каждом активити в onClickListener я обрабатываю нажатия кнопок (меняю фон нажатой кнопки и выполняю действие, если необходимо). Соответственно получается в каждом активити один и тот же обработчик, отличается только вызовом следующего пункта меню. Хочу вынести данный обработчик в отдельный класс. Попробовал вынести сам onClickListener - получилось. Но появилась проблема - Как вызвать следующий пункт меню (другое активити) из данного класса? Хотел сделать СallBack но не получилось, не пойму что не так и можно ли писать СallBack для андроида.

Добавлено через 1 час 50 минут
Перечитал сообщение YuraAAA еще раз и провел аналогию к перехватчику прерываний в старом добром виндовс.
Получается в рабочем активити я переопределяю обработчик событий от кнопки на свой метод, в своем методе делаю все что мне нужно и уж затем... вот тут загвоздка.. как мне передать активити перехваченное событие?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.10.2013, 13:08     CallBack #4
Цитата Сообщение от korsaj Посмотреть сообщение
как мне передать активити перехваченное событие?
не совсем понятно какому активити и что передать.
если запускаемому активити, то через
Java
1
intent.putExtra(name, value);
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
24.10.2013, 14:31  [ТС]     CallBack #5
Активити, которое создало класс обработки кнопок, должно получить событие и в обработчике полученного события запустить следующее активити.
Либо класс обработки кнопок должен вызвать метод родителя.
Либо класс обработки кнопок должен вызвать другое активити.

Подойдет любое решение.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.10.2013, 15:12     CallBack #6
Активити, которое создало класс обработки кнопок, должно получить событие и в обработчике полученного события запустить следующее активити.
Java
1
2
3
4
5
6
yourView.setOnTouchListener(new MyTouchListener() {
     @Override
      public void event() {
                //событие получено
      }
});
Цитата Сообщение от korsaj Посмотреть сообщение
Либо класс обработки кнопок должен вызвать метод родителя.
передает классу родителя
Java
1
yourView.setOnTouchListener(new MyTouchListener(MyActivity.this));
Цитата Сообщение от korsaj Посмотреть сообщение
Либо класс обработки кнопок должен вызвать другое активити
передаем классу Context
Java
1
yourView.setOnTouchListener(new MyTouchListener(MyActivity.this));
дальше вызываем как обычно.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
24.10.2013, 19:55  [ТС]     CallBack #7
Ничего не понятно, надо пробовать..
Спасибо.

Добавлено через 4 часа 39 минут
Ничего не получилось, потому что ничего не понял.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.10.2013, 20:06     CallBack #8
попробуйте точнее сформулировать задачу, прикрепите кусок своего кода для ясности.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
24.10.2013, 21:14  [ТС]     CallBack #9
Есть главное активити, отображающее на экране 11 кнопок. Нажимая одну из кнопок я перехожу в другую активити которая имеет столько же кнопок, каждая из кнопок вызывает свое определенное активити и так далее.
У меня получилось нагромождение одного и того же кода в каждом активити. Я хочу весь этот повторяющийся код вынести в отдельный класс (обработчик кнопок).
Получить событие onClick в отдельном классе у меня получилось, но я не могу из него вызвать другое активити, также я не могу вызвать метод класса родителя (callBack).

Добавлено через 39 минут
на данный момент реализовал так:
В активити
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
ButtonListener BonClick = new ButtonListener();
 
    public void onClick(View v){
        if(D) Log.d(TAG, "onClick");
        switch (BonClick.onClick(v.getId())){ 
//-------------------------------------------------------------------------------------------------     
            case 1:{
                Intent intent = new Intent(this, ActivityOne.class);
                StartActivity();
                break;
            }
//-------------------------------------------------------------------------------------------------
            case 2:{
                Intent intent = new Intent(this, ActivityTwo.class);
                StartActivity();
                break;
            }
//-------------------------------------------------------------------------------------------------
            case 3:{
                Intent intent = new Intent(this, ActivityTwo.class);
                StartActivity();
                break;
            }       
        }
    }
В классе ButtonListener
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
    public int onClick(int id){
        switch (id){
//-------------------------------------------------------------------------------------------------
            case R.id.btnUp:{
                //Obrabotka interfeica
                return 1;               
            }
//-------------------------------------------------------------------------------------------------
            case R.id.btnDown:{
                //Obrabotka interfeica
                return 2;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.button1:{
                //Obrabotka interfeica
                return 3;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.button2:{
                //Obrabotka interfeica
                return 4;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.button3:{
                //Obrabotka interfeica
                return 5;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.button4:{
                //Obrabotka interfeica
                return 6;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.btnNext:{
                //Obrabotka interfeica
                return 7;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.btnPrev:{
                //Obrabotka interfeica
                return 8;
            }
            
        }
        return 0;
    }
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.10.2013, 22:01     CallBack #10
зачем вам куча активитей если они все одинаковые?
зачем вы превращаете одни константы в другие без какой либо логики? можно ведь сразу писать
Java
1
2
3
4
5
6
7
8
switch (v.getId()) {
 case R.id.btnUp:{
                 Intent intent = new Intent(this, ActivityOne.class);
                StartActivity();
                break;      
            }
...
}
в чем проблема передать родителя в конструктор ButtonListener и вызывать его методы или запускать активности?
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
25.10.2013, 19:53  [ТС]     CallBack #11
Одинаковый только лишь интерфейс. А каждое активити выполняет свои определенные действия. Есть активити которые действительно выполняют роль только лишь "путеводителя" (направляют в нужное место, к нужному активити) их еще можно упростить, передавая им массивы с нужными данными.

Сразу писать можно, НО вот смотрите то что написано в onClick каждого активити:
Кликните здесь для просмотра всего текста
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
    public void onClick(View v){
 
        switch (v.getId()){
 //-------------------------------------------------------------------------------------------------
            case R.id.btnUp:{
                if (Button1.getBackground()==ActiveBackground) break;
                
                if (Button2.getBackground()==ActiveBackground){
                    Button1.setBackgroundResource(R.drawable.background_gray);
                    ActiveBackground = Button1.getBackground();
                    Button2.setBackgroundResource(R.drawable.background_white); break;
                }
                
                if (Button3.getBackground()==ActiveBackground){
                    Button2.setBackgroundResource(R.drawable.background_gray);
                    ActiveBackground = Button2.getBackground();
                    Button3.setBackgroundResource(R.drawable.background_white); break;
                }
                
                if (Button4.getBackground()==ActiveBackground){
                    Button3.setBackgroundResource(R.drawable.background_gray);
                    ActiveBackground = Button3.getBackground();
                    Button4.setBackgroundResource(R.drawable.background_white); break;
                }
                break;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.btnDown:{
                if (Button1.getBackground()==ActiveBackground){
                    Button2.setBackgroundResource(R.drawable.background_gray);
                    ActiveBackground = Button2.getBackground();
                    Button1.setBackgroundResource(R.drawable.background_white); break;
                    
                }
                if (Button2.getBackground()==ActiveBackground){
                    //if (Button2.getVisibility==true);
                    Button3.setBackgroundResource(R.drawable.background_gray);
                    ActiveBackground = Button3.getBackground();
                    Button2.setBackgroundResource(R.drawable.background_white); break;
                }
                if (Button3.getBackground()==ActiveBackground){
                    Button4.setBackgroundResource(R.drawable.background_gray);
                    ActiveBackground = Button4.getBackground();
                    Button3.setBackgroundResource(R.drawable.background_white); break;
                }
                if (Button4.getBackground()==ActiveBackground) break;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.button1:{
                Button1.setBackgroundResource(R.drawable.background_gray);
                Button2.setBackgroundResource(R.drawable.background_white);
                Button3.setBackgroundResource(R.drawable.background_white);
                Button4.setBackgroundResource(R.drawable.background_white);
                ActiveBackground = Button1.getBackground();
                            
                
                Intent intent = new Intent(this, ActivityMenu_1.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(intent);
                break;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.button2:{
                Button2.setBackgroundResource(R.drawable.background_gray);
                Button1.setBackgroundResource(R.drawable.background_white);
                Button3.setBackgroundResource(R.drawable.background_white);
                Button4.setBackgroundResource(R.drawable.background_white);
                ActiveBackground = Button2.getBackground();
                
                
                Intent intent = new Intent(this, ActivityMenu_2.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(intent);
                
                break;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.button3:{
                Button3.setBackgroundResource(R.drawable.background_gray);
                Button2.setBackgroundResource(R.drawable.background_white);
                Button1.setBackgroundResource(R.drawable.background_white);
                Button4.setBackgroundResource(R.drawable.background_white);
                ActiveBackground = Button3.getBackground();
                
                Intent intent = new Intent(this, ActivityMenu_3.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(intent);
                
                break;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.button4:{
                Button4.setBackgroundResource(R.drawable.background_gray);
                Button2.setBackgroundResource(R.drawable.background_white);
                Button3.setBackgroundResource(R.drawable.background_white);
                Button1.setBackgroundResource(R.drawable.background_white);
                ActiveBackground = Button4.getBackground();
                
                Intent intent = new Intent(this, ActivityMenu_Setings.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(intent);
                
                break;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.btnNext:{
                if  (Button1.getBackground()==ActiveBackground){
                    
                    Intent intent = new Intent(this, ActivityMenu_1.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                    startActivity(intent);
                }
                
                if  (Button2.getBackground()==ActiveBackground){
                    
                    Intent intent = new Intent(this, ActivityMenu_2.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                    startActivity(intent);
                }
                
                if  (Button3.getBackground()==ActiveBackground){
                    
                    Intent intent = new Intent(this, ActivityMenu_3.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                    startActivity(intent);
                }
                
                if  (Button4.getBackground()==ActiveBackground){
                    Intent intent = new Intent(this, ActivityMenu_Setings.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                    startActivity(intent);
                }
                break;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.btnPrev:{
                
                break;
            }
            
        }
    }

И это только 8 кнопок, а представьте себе 11.

А вот что получилось после переделки того же активити:
Кликните здесь для просмотра всего текста
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
    public void onClick(View v){
        Intent intent = null;
        switch (ButtonDecode.onClick(v.getId())){
            case R.id.button1:{         
                intent = new Intent(this, ActivityMenu_1.class);                
                break;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.button2:{
                intent = new Intent(this, ActivityMenu_2.class);        
                break;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.button3:{
                intent = new Intent(this, ActivityMenu_3.class);
                break;
            }
//-------------------------------------------------------------------------------------------------
            case R.id.button4:{
                intent = new Intent(this, ActivityMenu_Setings.class);
                break;
            }           
        }
        if (intent != null){
            intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            startActivity(intent); 
        }


Добавлено через 9 часов 3 минуты
А вот то что я хотел увидеть задавая вопрос:
Главное активити:
Кликните здесь для просмотра всего текста
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
package com.example.lifecycletest;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
 
public class MainActivity extends Activity
        implements ButtonListener.OnButtonUpListener {
    private static final String TAG = "MainActivity";
    private static final boolean D = true;  
    Button btnUp;
//============================================================================================================    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(D) Log.d(TAG, "++ ON CREATE ++");
        setContentView(R.layout.activity_main);
        
        btnUp = (Button) findViewById(R.id.btnUp); 
        new ButtonListener(btnUp, this);
    }
//============================================================================================================    
    public void ReNewActivityLink(){
        btnUp = (Button) findViewById(R.id.btnUp);
    }
//============================================================================================================    
    @Override
    public void onButtonUpPress() {
        if(D) Log.d(TAG, "CallBack");   
    }
//============================================================================================================    
}


Класс, обработчик кнопок:
Кликните здесь для просмотра всего текста
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
package com.example.lifecycletest;
 
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
 
public class ButtonListener implements OnClickListener{ 
    OnButtonUpListener mListener;
    Button btnUp;
//============================================================================================================    
    ButtonListener(Button Up, Context context){
        mListener = (OnButtonUpListener) context; //Cozdaem ccilky na obekt c vipolnyaemim metodom
            btnUp = Up;
            btnUp.setOnClickListener(this);
    }
//============================================================================================================    
    public interface OnButtonUpListener { //Opredelyaem interfeis
        public void onButtonUpPress(); //Ykazivaem metod kotorii budem vizivat
    }
//============================================================================================================    
    public void onClick(View v){ //Obrabativaem najatie knopki
        switch (v.getId()){
            case R.id.btnUp:{
                Log.d("ButtonListener","++ btnUp ++");
                mListener.onButtonUpPress();    //CallBack
            }           
        }
    }
//============================================================================================================    
}

Ну и xml для тех кто будет разбираться и захочет повторить проект:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
 
    <Button
        android:id="@+id/btnUp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:minHeight="120dp"
        android:minWidth="120dp" />
 
</RelativeLayout>
V0v1k
25.10.2013, 20:06
  #12

Не по теме:

калбек в калбек запихать это сильно

korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
25.10.2013, 20:21  [ТС]     CallBack #13
Это всего лишь пример!!! Нужно было как-то показать его работу...
А тупо делать калбек после запуска класса не наглядно.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
06.11.2013, 21:55  [ТС]     CallBack #14
Возможно ли получить доступ к UI потоку из callback функции?
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
06.11.2013, 22:23     CallBack #15
Цитата Сообщение от korsaj Посмотреть сообщение
Возможно ли получить доступ к UI потоку из callback функции?
Да.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
06.11.2013, 22:41  [ТС]     CallBack #16
А можно пример, а то у меня при выполнении
Java
1
2
3
4
    public void onButtonUpPress() {
        if(D) Log.d(TAG, "CallBack"); 
        Button2.setText(" psi");  
    }
вылетает приложение. Если я текст кнопки меняю в другом методе главного активити то все ок.
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
07.11.2013, 00:12     CallBack #17
Как-то так.
Java
1
2
3
4
5
6
Button2.post(new Runnable(){
@Override
public void run(){
Button2.setText(" psi");
}
});
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
07.11.2013, 00:20  [ТС]     CallBack #18
Ничего не понял. А как это все относится к public void onButtonUpPress() который я вызываю из другого потока?

Т.е нужно использовать предопределенный класс Handler для взаимосвязи с родительским потоком. А "ручной" callBack не катит?
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
07.11.2013, 00:45     CallBack #19
Java
1
2
3
4
5
6
7
8
9
public void onButtonUpPress() {
        if(D) Log.d(TAG, "CallBack"); 
        Button2.post(new Runnable(){
@Override
public void run(){
Button2.setText(" psi");
}
});
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2013, 00:49     CallBack
Еще ссылки по теме:

CallBack C++ C++
AngularJS Callback И Promises
Node.js Callback
Android Передать String в AsyncTask, получить callback
Android Callback фрагментов

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

Или воспользуйтесь поиском по форуму:
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
07.11.2013, 00:49  [ТС]     CallBack #20
Спасибо завтра попробую.
Yandex
Объявления
07.11.2013, 00:49     CallBack
Ответ Создать тему
Опции темы

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