Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

Можно ли в андроиде создать свои CallBack функции?
Если можно, то киньте какой нибудь пример на одном активити и классе потомке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2013, 22:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос CallBack (Программирование Android):

Callback фрагментов - Программирование Android
День добрый. Не совсем понимаю механизм работы коллбэков. Может кто-нибудь проиллюстрировать на конкретном примере? Допустим,...

CallBack url в твиттер - Программирование Android
CallBack url это ссылка на то активити к которому возвращается приложение после регистрации пользователя в твиттере да??или можете подробно...

Тертый перетертый CallBack to Activity - Программирование Android
Не могу передать из контроллера в активити. В контролер все призодит, а из него в активити нет. Не пойму что нетак и почему. ...

Передать String в AsyncTask, получить callback - Программирование Android
Не могу сообразить как одновременно и передать в AsyncTask запрос и возвратить ответ в UI. Вот код как есть - нужно возвращать...

Как получить данные из Runnable процесса вызываемого из CallBack функции - Программирование Android
Доброго всем суток, вопрос новичка, учусь.. Пишу программу под Андроид, в главном классе создал метод MethodName в котором всё...

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента - C++
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В общем есть у меня простой вызов...

19
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
23.10.2013, 23:48 #2
Возможно поможет...
Создать свой "реактор"
(когда-то задал вопрос, но руки не дошли проверить - пока "выкрутился" другими подходами)
1
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 523
24.10.2013, 10:19  [ТС] #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 еще раз и провел аналогию к перехватчику прерываний в старом добром виндовс.
Получается в рабочем активити я переопределяю обработчик событий от кнопки на свой метод, в своем методе делаю все что мне нужно и уж затем... вот тут загвоздка.. как мне передать активити перехваченное событие?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.10.2013, 13:08 #4
Цитата Сообщение от korsaj Посмотреть сообщение
как мне передать активити перехваченное событие?
не совсем понятно какому активити и что передать.
если запускаемому активити, то через
Java
1
intent.putExtra(name, value);
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 523
24.10.2013, 14:31  [ТС] #5
Активити, которое создало класс обработки кнопок, должно получить событие и в обработчике полученного события запустить следующее активити.
Либо класс обработки кнопок должен вызвать метод родителя.
Либо класс обработки кнопок должен вызвать другое активити.

Подойдет любое решение.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.10.2013, 15:12 #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));
дальше вызываем как обычно.
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 523
24.10.2013, 19:55  [ТС] #7
Ничего не понятно, надо пробовать..
Спасибо.

Добавлено через 4 часа 39 минут
Ничего не получилось, потому что ничего не понял.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.10.2013, 20:06 #8
попробуйте точнее сформулировать задачу, прикрепите кусок своего кода для ясности.
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 523
24.10.2013, 21:14  [ТС] #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;
    }
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.10.2013, 22:01 #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 и вызывать его методы или запускать активности?
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 523
25.10.2013, 19:53  [ТС] #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>
0
V0v1k
25.10.2013, 20:06
  #12

Не по теме:

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

0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 523
25.10.2013, 20:21  [ТС] #13
Это всего лишь пример!!! Нужно было как-то показать его работу...
А тупо делать калбек после запуска класса не наглядно.
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 523
06.11.2013, 21:55  [ТС] #14
Возможно ли получить доступ к UI потоку из callback функции?
0
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
06.11.2013, 22:23 #15
Цитата Сообщение от korsaj Посмотреть сообщение
Возможно ли получить доступ к UI потоку из callback функции?
Да.
1
06.11.2013, 22:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2013, 22:23
Привет! Вот еще темы с ответами:

Callback - Joomla
как использовать модуль для обратной связи ?

CallBack C++ - C++
Всем привет! Похожий вопрос. Нужно заюзать колбеки. Если работаю без класов т.е функция не предлежит класу то работает нормально, а...

Callback - Node.js
Доброго времени суток! Хотел спросить может кто знает. Вообщем есть приложение которое сохраняет картинки. Нужно не дожидаясь ответа...

CALLBACK - C++
Здравствуйте, уважаемые форумчане. Передо мной стоит задача записи звука с микрофона в файл. Как считывать в буфер я разобрался. Но не...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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