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

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

Войти
Регистрация
Восстановить пароль
 
 
SkN[i]lpl[e][r]
3 / 3 / 0
Регистрация: 12.05.2011
Сообщений: 232
#1

Обращение к функции находящейся не в MainActivity - Android

29.03.2015, 18:16. Просмотров 1076. Ответов 26
Метки нет (Все метки)

Доброго времени суток! Имеется MainActivity.java и HybridMap.java. Мне необходимо при нажатии кнопки обратиться к процедуре в HybridMap. Процедура никакие данные не возвращает, просто нужно выполнение. Пробовал обращаться так:
Java
1
2
3
4
5
6
7
8
9
10
private HybridMap hbr;
//далее уже в обработчке нажатия кнопки
 imgBtn  = (ImageButton) findViewById(R.id.image_button);
        OnClickListener oclBtnIMG = new OnClickListener() {
            @Override
            public void onClick(View v) {
               hbr.dostoprLayers();
            }
        };
        imgBtn.setOnClickListener(oclBtnIMG);
Но при нажатии на кнопку происходит крах программы и ошибка с указанием этой строки. Помогите разобраться как правильно обратиться к этой функции...
Вот класс и моя функция в HybridMap.java:
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
public class HybridMap extends FrameLayout implements MapViewConstants {
//
//здесь обьявление различных переменных и констант
//
public HybridMap(Context context, AttributeSet attrs) {
        super(context, attrs);
//здесь  загрузка карты и ее настройка
}
 
public  void dostoprLayers(){
      GeoPoint point2 = new GeoPoint(gps.getLatitude(), gps.getLongitude());
 
      ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
    
      OverlayItem olItem2 = new OverlayItem("Here", "SampleDescription", point2);
      Drawable newMarker2 = this.getResources().getDrawable(R.drawable.flag_green);
      olItem2.setMarker(newMarker2);
      items.add(olItem2);
     
      this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
              new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
                  @Override
                  public boolean onItemSingleTapUp(final int index,
                                                   final OverlayItem item) {
                    
                      mv.getOverlays().remove(mMyLocationOverlay);
                      mv.invalidate();
 
                      return true; 
                  }
 
                  @Override
                  public boolean onItemLongPress(final int index,
                                                 final OverlayItem item) {
                     
                      return false;
                  }
              }, resourceProxy);
      this.mv.getOverlays().add(this.mMyLocationOverlay);
      mv.invalidate();
  }
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
29.03.2015, 19:31     Обращение к функции находящейся не в MainActivity #2
а что в логах пишет? Что то мне подсказывает что вы забыли
Java
1
hbr = new HybridMap(this);
сделать
SkN[i]lpl[e][r]
3 / 3 / 0
Регистрация: 12.05.2011
Сообщений: 232
30.03.2015, 09:38  [ТС]     Обращение к функции находящейся не в MainActivity #3
а если до этого объявил уже
Java
1
private HybridMap hbr;
разве нужно прописывать
Java
1
hbr = new HybridMap(this);
?
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
30.03.2015, 09:45     Обращение к функции находящейся не в MainActivity #4
конечно!

Java
1
private HybridMap hbr;
так ты объявляешь переменную, ее значение в данный момент null

Java
1
hbr = new HybridMap(this);
а вот так ты инициализируешь переменную, т.е. присваиваешь ей значение экземпляра класса
SkN[i]lpl[e][r]
3 / 3 / 0
Регистрация: 12.05.2011
Сообщений: 232
30.03.2015, 09:54  [ТС]     Обращение к функции находящейся не в MainActivity #5
в логах пишет
Java
1
2
3
4
FATAL EXCEPTION: main
Process: моя_прога, PID: 1206
    java.lang.NullPointerException
            at моя_прога.MainActivity$2.onClick(MainActivity.java:283)
пробовал дописывать
Java
1
hbr = new HybridMap(this);
ен работает, подчеркивает красным "this" и пишет:
HybridMap (android.content.Context, AttributeSet) in HybridMap cannot be aplied to (android.view.View.OnClickListener)
Я работаю в Android Studio.
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 835
30.03.2015, 09:55     Обращение к функции находящейся не в MainActivity #6
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
а если до этого объявил уже
ну объявлен то он объявлен...но не создан же
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
разве нужно прописывать
конечно нужно
SkN[i]lpl[e][r]
3 / 3 / 0
Регистрация: 12.05.2011
Сообщений: 232
30.03.2015, 09:58  [ТС]     Обращение к функции находящейся не в MainActivity #7
ну понял, чайник я в JAVA и в C++ ну так он this говорит что неверная переменная
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 835
30.03.2015, 10:00     Обращение к функции находящейся не в MainActivity #8
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
ен работает, подчеркивает красным "this" и пишет:
толи вынеси создание за пределы анонимного класса:
Java
1
hbr = new HybridMap(this);
либо используй:
Java
1
hbr = new HybridMap(текущая_активити.this);
SkN[i]lpl[e][r]
3 / 3 / 0
Регистрация: 12.05.2011
Сообщений: 232
30.03.2015, 10:40  [ТС]     Обращение к функции находящейся не в MainActivity #9
в обоих случаях не работает
я так понял нужно сделать так:
Java
1
 hbr = new HybridMap(this.getClass, какойто аттрибут);
это я подумал из-за того что у нас
Java
1
HybridMap(Context context, AttributeSet attrs)
вот не могу понять какой аттрибут...

Добавлено через 34 минуты
Никак не получается... пробовал AttributeSet удалять из Hybrid Map, тогда вообще программа не запускалась, сразу ошибка выходила. В общем тупик...
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 835
30.03.2015, 10:52     Обращение к функции находящейся не в MainActivity #10
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
вот не могу понять какой аттрибут...
для начала попробуйте создать вашу вьюху в xml а не программно
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
30.03.2015, 11:09     Обращение к функции находящейся не в MainActivity #11
this ты я так понимаю используешь внутри onClick

в данной момент это не тот контекст, который он хочет получить

как решение - создай переменную Context context; и в oncreate передай ему значение this.context = context

и далее везде используй эту переменную, где нужен контекст
SkN[i]lpl[e][r]
3 / 3 / 0
Регистрация: 12.05.2011
Сообщений: 232
30.03.2015, 11:23  [ТС]     Обращение к функции находящейся не в MainActivity #12
Цитата Сообщение от androbro Посмотреть сообщение
для начала попробуйте создать вашу вьюху в xml а не программно
вы про mapView? она у меня и так в xml есть
Цитата Сообщение от fgtmenow Посмотреть сообщение
в oncreate передай ему значение this.context = context
и как это сделать?
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
30.03.2015, 11:28     Обращение к функции находящейся не в MainActivity #13
Уважаемый, читайте как создать глобальную переменную в классе. Программировать тут вас никто не научит
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 835
30.03.2015, 11:31     Обращение к функции находящейся не в MainActivity #14
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
пробовал AttributeSet удалять из Hybrid Map, тогда вообще программа не запускалась, сразу ошибка выходила. В общем тупик...
да что Вы говорите, у FrameLayout есть конструктор без AttributeSet.
Java
1
2
3
4
    public HybridMap(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }
SkN[i]lpl[e][r]
3 / 3 / 0
Регистрация: 12.05.2011
Сообщений: 232
30.03.2015, 11:41  [ТС]     Обращение к функции находящейся не в MainActivity #15
Цитата Сообщение от androbro Посмотреть сообщение
да что Вы говорите, у FrameLayout есть конструктор без AttributeSet.
Когда делал без AttributeSet выходила эта ошибка:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.моя_прога/com.моя_прога.MainActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class com.моя_прога.HybridMap
Цитата Сообщение от fgtmenow Посмотреть сообщение
Уважаемый, читайте как создать глобальную переменную в классе. Программировать тут вас никто не научит
извиняюсь за глупый вопрос
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
30.03.2015, 12:13     Обращение к функции находящейся не в MainActivity #16
создайте просто ниже вашего конструктора
Java
1
2
3
4
public HybridMap(Context context, AttributeSet attrs) {
        super(context, attrs);
//здесь  загрузка карты и ее настройка
}
еще один конструктор
Java
1
2
3
public HybridMap(Context context) {
        super(context);
}
и не будет выдавать ошибку
SkN[i]lpl[e][r]
3 / 3 / 0
Регистрация: 12.05.2011
Сообщений: 232
30.03.2015, 12:33  [ТС]     Обращение к функции находящейся не в MainActivity #17
Цитата Сообщение от dajver Посмотреть сообщение
создайте просто ниже вашего конструктора

Java
1
2
3
4
public HybridMap(Context context, AttributeSet attrs) {
 super(context, attrs);
//здесь *загрузка карты и ее настройка
}
еще один конструктор

Java
1
2
3
public HybridMap(Context context) {
 super(context);
}
и не будет выдавать ошибку
если не вызывать функцию dostoprLayers(); из MainActivity то ошибок нет и все отлично работает, но стоит сделать запрос:
Java
1
2
3
4
5
6
7
8
9
10
11
 HybridMap hbr = new HybridMap(context);    //<----------------------
 imgBtn  = (ImageButton) findViewById(R.id.image_button);
 
        OnClickListener oclBtnIMG = new OnClickListener() {
            @Override
            public void onClick(View v) {
hbr.dostoprLayers();     //<-----------
            }
        };
        imgBtn.setOnClickListener(oclBtnIMG);
    }
то крах программы еще до запуска. В логах ссылается на
Java
1
2
3
 public HybridMap(Context context) {
        super(context);  // выделяет эту строку
    }
Java
1
HybridMap hbr = new HybridMap(context);// и вот эту строку выделяет
YuraAAA
1565 / 1307 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
30.03.2015, 12:41     Обращение к функции находящейся не в MainActivity #18
SkN[i]lpl[e][r], покажите логи краша
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
30.03.2015, 12:44     Обращение к функции находящейся не в MainActivity #19
а какая хоть ошибка?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2015, 12:47     Обращение к функции находящейся не в MainActivity
Еще ссылки по теме:

Переделать MainActivity в Fragment Android
Android Как запустить метод Fragment из MainActivity?
MainActivity AsyncTask Android
Android Как получить context MainActivity в Service?
OnClickListener не может вызвать метод с MainActivity Android

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

Или воспользуйтесь поиском по форуму:
SkN[i]lpl[e][r]
3 / 3 / 0
Регистрация: 12.05.2011
Сообщений: 232
30.03.2015, 12:47  [ТС]     Обращение к функции находящейся не в MainActivity #20
YuraAAA,
03-30 09:26:07.922 1902-1902/com.моя_прога E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.моя_прога, PID: 1902
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.моя_прога/com.моя_прога.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.view.ViewConfiguration.get(ViewConfiguration.java:352)
at android.view.View.<init>(View.java:3448)
at android.view.ViewGroup.<init>(ViewGroup.java:459)
at android.widget.FrameLayout.<init>(FrameLayout.java:93)
at com.моя_прога.HybridMap.<init>(HybridMap.java:310)
at com.моя_прога.MainActivity.<init>(MainActivity.java:290)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1208)
at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2101)
************at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
************at android.app.ActivityThread.access$800(ActivityThread.java:135)
************at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
************at android.os.Handler.dispatchMessage(Handler.java:102)
************at android.os.Looper.loop(Looper.java:136)
************at android.app.ActivityThread.main(ActivityThread.java:5001)
************at java.lang.reflect.Method.invokeNative(Native Method)
************at java.lang.reflect.Method.invoke(Method.java:515)
************at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
************at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
************at dalvik.system.NativeStart.main(Native Method)
Yandex
Объявления
30.03.2015, 12:47     Обращение к функции находящейся не в MainActivity
Ответ Создать тему
Опции темы

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